| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/p2p/base/stunrequest.h" | 11 #include "webrtc/p2p/base/stunrequest.h" |
| 12 #include "webrtc/base/fakeclock.h" | 12 #include "webrtc/base/fakeclock.h" |
| 13 #include "webrtc/base/gunit.h" | 13 #include "webrtc/base/gunit.h" |
| 14 #include "webrtc/base/helpers.h" | 14 #include "webrtc/base/helpers.h" |
| 15 #include "webrtc/base/logging.h" | 15 #include "webrtc/base/logging.h" |
| 16 #include "webrtc/base/ssladapter.h" | 16 #include "webrtc/base/ssladapter.h" |
| 17 #include "webrtc/base/timeutils.h" | 17 #include "webrtc/base/timeutils.h" |
| 18 | 18 |
| 19 using namespace cricket; | 19 using namespace cricket; |
| 20 | 20 |
| 21 class StunRequestTest : public testing::Test, | 21 class StunRequestTest : public testing::Test, |
| 22 public sigslot::has_slots<> { | 22 public sigslot::has_slots<> { |
| 23 public: | 23 public: |
| 24 StunRequestTest() | 24 StunRequestTest() |
| 25 : manager_(rtc::Thread::Current()), | 25 : manager_(rtc::Thread::Current()), |
| 26 request_count_(0), response_(NULL), | 26 request_count_(0), |
| 27 success_(false), failure_(false), timeout_(false) { | 27 response_(nullptr), |
| 28 success_(false), |
| 29 failure_(false), |
| 30 timeout_(false) { |
| 28 manager_.SignalSendPacket.connect(this, &StunRequestTest::OnSendPacket); | 31 manager_.SignalSendPacket.connect(this, &StunRequestTest::OnSendPacket); |
| 29 } | 32 } |
| 30 | 33 |
| 31 void OnSendPacket(const void* data, size_t size, StunRequest* req) { | 34 void OnSendPacket(const void* data, size_t size, StunRequest* req) { |
| 32 request_count_++; | 35 request_count_++; |
| 33 } | 36 } |
| 34 | 37 |
| 35 void OnResponse(StunMessage* res) { | 38 void OnResponse(StunMessage* res) { |
| 36 response_ = res; | 39 response_ = res; |
| 37 success_ = true; | 40 success_ = true; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 90 |
| 88 virtual void Prepare(StunMessage* request) { | 91 virtual void Prepare(StunMessage* request) { |
| 89 request->SetType(STUN_BINDING_REQUEST); | 92 request->SetType(STUN_BINDING_REQUEST); |
| 90 } | 93 } |
| 91 | 94 |
| 92 StunRequestTest* test_; | 95 StunRequestTest* test_; |
| 93 }; | 96 }; |
| 94 | 97 |
| 95 // Test handling of a normal binding response. | 98 // Test handling of a normal binding response. |
| 96 TEST_F(StunRequestTest, TestSuccess) { | 99 TEST_F(StunRequestTest, TestSuccess) { |
| 97 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL); | 100 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, nullptr); |
| 98 | 101 |
| 99 manager_.Send(new StunRequestThunker(req, this)); | 102 manager_.Send(new StunRequestThunker(req, this)); |
| 100 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); | 103 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); |
| 101 EXPECT_TRUE(manager_.CheckResponse(res)); | 104 EXPECT_TRUE(manager_.CheckResponse(res)); |
| 102 | 105 |
| 103 EXPECT_TRUE(response_ == res); | 106 EXPECT_TRUE(response_ == res); |
| 104 EXPECT_TRUE(success_); | 107 EXPECT_TRUE(success_); |
| 105 EXPECT_FALSE(failure_); | 108 EXPECT_FALSE(failure_); |
| 106 EXPECT_FALSE(timeout_); | 109 EXPECT_FALSE(timeout_); |
| 107 delete res; | 110 delete res; |
| 108 } | 111 } |
| 109 | 112 |
| 110 // Test handling of an error binding response. | 113 // Test handling of an error binding response. |
| 111 TEST_F(StunRequestTest, TestError) { | 114 TEST_F(StunRequestTest, TestError) { |
| 112 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL); | 115 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, nullptr); |
| 113 | 116 |
| 114 manager_.Send(new StunRequestThunker(req, this)); | 117 manager_.Send(new StunRequestThunker(req, this)); |
| 115 StunMessage* res = CreateStunMessage(STUN_BINDING_ERROR_RESPONSE, req); | 118 StunMessage* res = CreateStunMessage(STUN_BINDING_ERROR_RESPONSE, req); |
| 116 EXPECT_TRUE(manager_.CheckResponse(res)); | 119 EXPECT_TRUE(manager_.CheckResponse(res)); |
| 117 | 120 |
| 118 EXPECT_TRUE(response_ == res); | 121 EXPECT_TRUE(response_ == res); |
| 119 EXPECT_FALSE(success_); | 122 EXPECT_FALSE(success_); |
| 120 EXPECT_TRUE(failure_); | 123 EXPECT_TRUE(failure_); |
| 121 EXPECT_FALSE(timeout_); | 124 EXPECT_FALSE(timeout_); |
| 122 delete res; | 125 delete res; |
| 123 } | 126 } |
| 124 | 127 |
| 125 // Test handling of a binding response with the wrong transaction id. | 128 // Test handling of a binding response with the wrong transaction id. |
| 126 TEST_F(StunRequestTest, TestUnexpected) { | 129 TEST_F(StunRequestTest, TestUnexpected) { |
| 127 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL); | 130 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, nullptr); |
| 128 | 131 |
| 129 manager_.Send(new StunRequestThunker(req, this)); | 132 manager_.Send(new StunRequestThunker(req, this)); |
| 130 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, NULL); | 133 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, nullptr); |
| 131 EXPECT_FALSE(manager_.CheckResponse(res)); | 134 EXPECT_FALSE(manager_.CheckResponse(res)); |
| 132 | 135 |
| 133 EXPECT_TRUE(response_ == NULL); | 136 EXPECT_TRUE(response_ == nullptr); |
| 134 EXPECT_FALSE(success_); | 137 EXPECT_FALSE(success_); |
| 135 EXPECT_FALSE(failure_); | 138 EXPECT_FALSE(failure_); |
| 136 EXPECT_FALSE(timeout_); | 139 EXPECT_FALSE(timeout_); |
| 137 delete res; | 140 delete res; |
| 138 } | 141 } |
| 139 | 142 |
| 140 // Test that requests are sent at the right times. | 143 // Test that requests are sent at the right times. |
| 141 TEST_F(StunRequestTest, TestBackoff) { | 144 TEST_F(StunRequestTest, TestBackoff) { |
| 142 rtc::ScopedFakeClock fake_clock; | 145 rtc::ScopedFakeClock fake_clock; |
| 143 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL); | 146 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, nullptr); |
| 144 | 147 |
| 145 int64_t start = rtc::TimeMillis(); | 148 int64_t start = rtc::TimeMillis(); |
| 146 manager_.Send(new StunRequestThunker(req, this)); | 149 manager_.Send(new StunRequestThunker(req, this)); |
| 147 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); | 150 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); |
| 148 for (int i = 0; i < 9; ++i) { | 151 for (int i = 0; i < 9; ++i) { |
| 149 EXPECT_TRUE_SIMULATED_WAIT(request_count_ != i, STUN_TOTAL_TIMEOUT, | 152 EXPECT_TRUE_SIMULATED_WAIT(request_count_ != i, STUN_TOTAL_TIMEOUT, |
| 150 fake_clock); | 153 fake_clock); |
| 151 int64_t elapsed = rtc::TimeMillis() - start; | 154 int64_t elapsed = rtc::TimeMillis() - start; |
| 152 LOG(LS_INFO) << "STUN request #" << (i + 1) | 155 LOG(LS_INFO) << "STUN request #" << (i + 1) |
| 153 << " sent at " << elapsed << " ms"; | 156 << " sent at " << elapsed << " ms"; |
| 154 EXPECT_EQ(TotalDelay(i), elapsed); | 157 EXPECT_EQ(TotalDelay(i), elapsed); |
| 155 } | 158 } |
| 156 EXPECT_TRUE(manager_.CheckResponse(res)); | 159 EXPECT_TRUE(manager_.CheckResponse(res)); |
| 157 | 160 |
| 158 EXPECT_TRUE(response_ == res); | 161 EXPECT_TRUE(response_ == res); |
| 159 EXPECT_TRUE(success_); | 162 EXPECT_TRUE(success_); |
| 160 EXPECT_FALSE(failure_); | 163 EXPECT_FALSE(failure_); |
| 161 EXPECT_FALSE(timeout_); | 164 EXPECT_FALSE(timeout_); |
| 162 delete res; | 165 delete res; |
| 163 } | 166 } |
| 164 | 167 |
| 165 // Test that we timeout properly if no response is received. | 168 // Test that we timeout properly if no response is received. |
| 166 TEST_F(StunRequestTest, TestTimeout) { | 169 TEST_F(StunRequestTest, TestTimeout) { |
| 167 rtc::ScopedFakeClock fake_clock; | 170 rtc::ScopedFakeClock fake_clock; |
| 168 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL); | 171 StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, nullptr); |
| 169 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); | 172 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req); |
| 170 | 173 |
| 171 manager_.Send(new StunRequestThunker(req, this)); | 174 manager_.Send(new StunRequestThunker(req, this)); |
| 172 SIMULATED_WAIT(false, cricket::STUN_TOTAL_TIMEOUT, fake_clock); | 175 SIMULATED_WAIT(false, cricket::STUN_TOTAL_TIMEOUT, fake_clock); |
| 173 | 176 |
| 174 EXPECT_FALSE(manager_.CheckResponse(res)); | 177 EXPECT_FALSE(manager_.CheckResponse(res)); |
| 175 EXPECT_TRUE(response_ == NULL); | 178 EXPECT_TRUE(response_ == nullptr); |
| 176 EXPECT_FALSE(success_); | 179 EXPECT_FALSE(success_); |
| 177 EXPECT_FALSE(failure_); | 180 EXPECT_FALSE(failure_); |
| 178 EXPECT_TRUE(timeout_); | 181 EXPECT_TRUE(timeout_); |
| 179 delete res; | 182 delete res; |
| 180 } | 183 } |
| 181 | 184 |
| 182 // Regression test for specific crash where we receive a response with the | 185 // Regression test for specific crash where we receive a response with the |
| 183 // same id as a request that doesn't have an underlying StunMessage yet. | 186 // same id as a request that doesn't have an underlying StunMessage yet. |
| 184 TEST_F(StunRequestTest, TestNoEmptyRequest) { | 187 TEST_F(StunRequestTest, TestNoEmptyRequest) { |
| 185 StunRequestThunker* request = new StunRequestThunker(this); | 188 StunRequestThunker* request = new StunRequestThunker(this); |
| 186 | 189 |
| 187 manager_.SendDelayed(request, 100); | 190 manager_.SendDelayed(request, 100); |
| 188 | 191 |
| 189 StunMessage dummy_req; | 192 StunMessage dummy_req; |
| 190 dummy_req.SetTransactionID(request->id()); | 193 dummy_req.SetTransactionID(request->id()); |
| 191 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, &dummy_req); | 194 StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, &dummy_req); |
| 192 | 195 |
| 193 EXPECT_TRUE(manager_.CheckResponse(res)); | 196 EXPECT_TRUE(manager_.CheckResponse(res)); |
| 194 | 197 |
| 195 EXPECT_TRUE(response_ == res); | 198 EXPECT_TRUE(response_ == res); |
| 196 EXPECT_TRUE(success_); | 199 EXPECT_TRUE(success_); |
| 197 EXPECT_FALSE(failure_); | 200 EXPECT_FALSE(failure_); |
| 198 EXPECT_FALSE(timeout_); | 201 EXPECT_FALSE(timeout_); |
| 199 delete res; | 202 delete res; |
| 200 } | 203 } |
| OLD | NEW |