| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 // SCTP Data Engine testing framework. | 125 // SCTP Data Engine testing framework. |
| 126 class SctpTransportTest : public testing::Test, public sigslot::has_slots<> { | 126 class SctpTransportTest : public testing::Test, public sigslot::has_slots<> { |
| 127 protected: | 127 protected: |
| 128 // usrsctp uses the NSS random number generator on non-Android platforms, | 128 // usrsctp uses the NSS random number generator on non-Android platforms, |
| 129 // so we need to initialize SSL. | 129 // so we need to initialize SSL. |
| 130 static void SetUpTestCase() {} | 130 static void SetUpTestCase() {} |
| 131 | 131 |
| 132 void SetupConnectedTransportsWithTwoStreams() { | 132 void SetupConnectedTransportsWithTwoStreams() { |
| 133 fake_dtls1_.reset(new FakeDtlsTransport("fake dtls 1", 0)); | 133 fake_dtls1_.reset(new FakeTransportChannel("fake dtls 1", 0)); |
| 134 fake_dtls2_.reset(new FakeDtlsTransport("fake dtls 2", 0)); | 134 fake_dtls2_.reset(new FakeTransportChannel("fake dtls 2", 0)); |
| 135 recv1_.reset(new SctpFakeDataReceiver()); | 135 recv1_.reset(new SctpFakeDataReceiver()); |
| 136 recv2_.reset(new SctpFakeDataReceiver()); | 136 recv2_.reset(new SctpFakeDataReceiver()); |
| 137 transport1_.reset(CreateTransport(fake_dtls1_.get(), recv1_.get())); | 137 transport1_.reset(CreateTransport(fake_dtls1_.get(), recv1_.get())); |
| 138 transport1_->set_debug_name_for_testing("transport1"); | 138 transport1_->set_debug_name_for_testing("transport1"); |
| 139 transport1_->SignalReadyToSendData.connect( | 139 transport1_->SignalReadyToSendData.connect( |
| 140 this, &SctpTransportTest::OnChan1ReadyToSend); | 140 this, &SctpTransportTest::OnChan1ReadyToSend); |
| 141 transport2_.reset(CreateTransport(fake_dtls2_.get(), recv2_.get())); | 141 transport2_.reset(CreateTransport(fake_dtls2_.get(), recv2_.get())); |
| 142 transport2_->set_debug_name_for_testing("transport2"); | 142 transport2_->set_debug_name_for_testing("transport2"); |
| 143 transport2_->SignalReadyToSendData.connect( | 143 transport2_->SignalReadyToSendData.connect( |
| 144 this, &SctpTransportTest::OnChan2ReadyToSend); | 144 this, &SctpTransportTest::OnChan2ReadyToSend); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 157 transport2_->Start(kTransport2Port, kTransport1Port); | 157 transport2_->Start(kTransport2Port, kTransport1Port); |
| 158 } | 158 } |
| 159 | 159 |
| 160 bool AddStream(int sid) { | 160 bool AddStream(int sid) { |
| 161 bool ret = true; | 161 bool ret = true; |
| 162 ret = ret && transport1_->OpenStream(sid); | 162 ret = ret && transport1_->OpenStream(sid); |
| 163 ret = ret && transport2_->OpenStream(sid); | 163 ret = ret && transport2_->OpenStream(sid); |
| 164 return ret; | 164 return ret; |
| 165 } | 165 } |
| 166 | 166 |
| 167 SctpTransport* CreateTransport(FakeDtlsTransport* fake_dtls, | 167 SctpTransport* CreateTransport(FakeTransportChannel* fake_dtls, |
| 168 SctpFakeDataReceiver* recv) { | 168 SctpFakeDataReceiver* recv) { |
| 169 SctpTransport* transport = | 169 SctpTransport* transport = |
| 170 new SctpTransport(rtc::Thread::Current(), fake_dtls); | 170 new SctpTransport(rtc::Thread::Current(), fake_dtls); |
| 171 // When data is received, pass it to the SctpFakeDataReceiver. | 171 // When data is received, pass it to the SctpFakeDataReceiver. |
| 172 transport->SignalDataReceived.connect( | 172 transport->SignalDataReceived.connect( |
| 173 recv, &SctpFakeDataReceiver::OnDataReceived); | 173 recv, &SctpFakeDataReceiver::OnDataReceived); |
| 174 return transport; | 174 return transport; |
| 175 } | 175 } |
| 176 | 176 |
| 177 bool SendData(SctpTransport* chan, | 177 bool SendData(SctpTransport* chan, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 200 thread->Dispatch(&msg); | 200 thread->Dispatch(&msg); |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 return !thread->IsQuitting(); | 203 return !thread->IsQuitting(); |
| 204 } | 204 } |
| 205 | 205 |
| 206 SctpTransport* transport1() { return transport1_.get(); } | 206 SctpTransport* transport1() { return transport1_.get(); } |
| 207 SctpTransport* transport2() { return transport2_.get(); } | 207 SctpTransport* transport2() { return transport2_.get(); } |
| 208 SctpFakeDataReceiver* receiver1() { return recv1_.get(); } | 208 SctpFakeDataReceiver* receiver1() { return recv1_.get(); } |
| 209 SctpFakeDataReceiver* receiver2() { return recv2_.get(); } | 209 SctpFakeDataReceiver* receiver2() { return recv2_.get(); } |
| 210 FakeDtlsTransport* fake_dtls1() { return fake_dtls1_.get(); } | 210 FakeTransportChannel* fake_dtls1() { return fake_dtls1_.get(); } |
| 211 FakeDtlsTransport* fake_dtls2() { return fake_dtls2_.get(); } | 211 FakeTransportChannel* fake_dtls2() { return fake_dtls2_.get(); } |
| 212 | 212 |
| 213 int transport1_ready_to_send_count() { | 213 int transport1_ready_to_send_count() { |
| 214 return transport1_ready_to_send_count_; | 214 return transport1_ready_to_send_count_; |
| 215 } | 215 } |
| 216 int transport2_ready_to_send_count() { | 216 int transport2_ready_to_send_count() { |
| 217 return transport2_ready_to_send_count_; | 217 return transport2_ready_to_send_count_; |
| 218 } | 218 } |
| 219 | 219 |
| 220 private: | 220 private: |
| 221 std::unique_ptr<FakeDtlsTransport> fake_dtls1_; | 221 std::unique_ptr<FakeTransportChannel> fake_dtls1_; |
| 222 std::unique_ptr<FakeDtlsTransport> fake_dtls2_; | 222 std::unique_ptr<FakeTransportChannel> fake_dtls2_; |
| 223 std::unique_ptr<SctpFakeDataReceiver> recv1_; | 223 std::unique_ptr<SctpFakeDataReceiver> recv1_; |
| 224 std::unique_ptr<SctpFakeDataReceiver> recv2_; | 224 std::unique_ptr<SctpFakeDataReceiver> recv2_; |
| 225 std::unique_ptr<SctpTransport> transport1_; | 225 std::unique_ptr<SctpTransport> transport1_; |
| 226 std::unique_ptr<SctpTransport> transport2_; | 226 std::unique_ptr<SctpTransport> transport2_; |
| 227 | 227 |
| 228 int transport1_ready_to_send_count_ = 0; | 228 int transport1_ready_to_send_count_ = 0; |
| 229 int transport2_ready_to_send_count_ = 0; | 229 int transport2_ready_to_send_count_ = 0; |
| 230 | 230 |
| 231 void OnChan1ReadyToSend() { ++transport1_ready_to_send_count_; } | 231 void OnChan1ReadyToSend() { ++transport1_ready_to_send_count_; } |
| 232 void OnChan2ReadyToSend() { ++transport2_ready_to_send_count_; } | 232 void OnChan2ReadyToSend() { ++transport2_ready_to_send_count_; } |
| 233 }; | 233 }; |
| 234 | 234 |
| 235 // Test that data can be sent end-to-end when an SCTP transport starts with one | 235 // Test that data can be sent end-to-end when an SCTP transport starts with one |
| 236 // transport channel (which is unwritable), and then switches to another | 236 // transport channel (which is unwritable), and then switches to another |
| 237 // channel. A common scenario due to how BUNDLE works. | 237 // channel. A common scenario due to how BUNDLE works. |
| 238 TEST_F(SctpTransportTest, SwitchTransportChannel) { | 238 TEST_F(SctpTransportTest, SwitchTransportChannel) { |
| 239 FakeDtlsTransport black_hole("black hole", 0); | 239 FakeTransportChannel black_hole("black hole", 0); |
| 240 FakeDtlsTransport fake_dtls1("fake dtls 1", 0); | 240 FakeTransportChannel fake_dtls1("fake dtls 1", 0); |
| 241 FakeDtlsTransport fake_dtls2("fake dtls 2", 0); | 241 FakeTransportChannel fake_dtls2("fake dtls 2", 0); |
| 242 SctpFakeDataReceiver recv1; | 242 SctpFakeDataReceiver recv1; |
| 243 SctpFakeDataReceiver recv2; | 243 SctpFakeDataReceiver recv2; |
| 244 | 244 |
| 245 // Construct transport1 with the "black hole" channel. | 245 // Construct transport1 with the "black hole" channel. |
| 246 std::unique_ptr<SctpTransport> transport1( | 246 std::unique_ptr<SctpTransport> transport1( |
| 247 CreateTransport(&black_hole, &recv1)); | 247 CreateTransport(&black_hole, &recv1)); |
| 248 std::unique_ptr<SctpTransport> transport2( | 248 std::unique_ptr<SctpTransport> transport2( |
| 249 CreateTransport(&fake_dtls2, &recv2)); | 249 CreateTransport(&fake_dtls2, &recv2)); |
| 250 | 250 |
| 251 // Add a stream. | 251 // Add a stream. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 // Calling Start a second time with a different port should fail. | 287 // Calling Start a second time with a different port should fail. |
| 288 TEST_F(SctpTransportTest, CallingStartWithDifferentPortFails) { | 288 TEST_F(SctpTransportTest, CallingStartWithDifferentPortFails) { |
| 289 SetupConnectedTransportsWithTwoStreams(); | 289 SetupConnectedTransportsWithTwoStreams(); |
| 290 EXPECT_FALSE(transport1()->Start(kTransport1Port, 1234)); | 290 EXPECT_FALSE(transport1()->Start(kTransport1Port, 1234)); |
| 291 EXPECT_FALSE(transport1()->Start(1234, kTransport2Port)); | 291 EXPECT_FALSE(transport1()->Start(1234, kTransport2Port)); |
| 292 } | 292 } |
| 293 | 293 |
| 294 // A value of -1 for the local/remote port should be treated as the default | 294 // A value of -1 for the local/remote port should be treated as the default |
| 295 // (5000). | 295 // (5000). |
| 296 TEST_F(SctpTransportTest, NegativeOnePortTreatedAsDefault) { | 296 TEST_F(SctpTransportTest, NegativeOnePortTreatedAsDefault) { |
| 297 FakeDtlsTransport fake_dtls1("fake dtls 1", 0); | 297 FakeTransportChannel fake_dtls1("fake dtls 1", 0); |
| 298 FakeDtlsTransport fake_dtls2("fake dtls 2", 0); | 298 FakeTransportChannel fake_dtls2("fake dtls 2", 0); |
| 299 SctpFakeDataReceiver recv1; | 299 SctpFakeDataReceiver recv1; |
| 300 SctpFakeDataReceiver recv2; | 300 SctpFakeDataReceiver recv2; |
| 301 std::unique_ptr<SctpTransport> transport1( | 301 std::unique_ptr<SctpTransport> transport1( |
| 302 CreateTransport(&fake_dtls1, &recv1)); | 302 CreateTransport(&fake_dtls1, &recv1)); |
| 303 std::unique_ptr<SctpTransport> transport2( | 303 std::unique_ptr<SctpTransport> transport2( |
| 304 CreateTransport(&fake_dtls2, &recv2)); | 304 CreateTransport(&fake_dtls2, &recv2)); |
| 305 | 305 |
| 306 // Add a stream. | 306 // Add a stream. |
| 307 transport1->OpenStream(1); | 307 transport1->OpenStream(1); |
| 308 transport2->OpenStream(1); | 308 transport2->OpenStream(1); |
| 309 | 309 |
| 310 // Tell them both to start, giving one transport the default port and the | 310 // Tell them both to start, giving one transport the default port and the |
| 311 // other transport -1. | 311 // other transport -1. |
| 312 transport1->Start(kSctpDefaultPort, kSctpDefaultPort); | 312 transport1->Start(kSctpDefaultPort, kSctpDefaultPort); |
| 313 transport2->Start(-1, -1); | 313 transport2->Start(-1, -1); |
| 314 | 314 |
| 315 // Connect the two fake DTLS channels. | 315 // Connect the two fake DTLS channels. |
| 316 bool asymmetric = false; | 316 bool asymmetric = false; |
| 317 fake_dtls1.SetDestination(&fake_dtls2, asymmetric); | 317 fake_dtls1.SetDestination(&fake_dtls2, asymmetric); |
| 318 | 318 |
| 319 // Make sure we end up able to send data. | 319 // Make sure we end up able to send data. |
| 320 SendDataResult result; | 320 SendDataResult result; |
| 321 ASSERT_TRUE(SendData(transport1.get(), 1, "foo", &result)); | 321 ASSERT_TRUE(SendData(transport1.get(), 1, "foo", &result)); |
| 322 ASSERT_TRUE(SendData(transport2.get(), 1, "bar", &result)); | 322 ASSERT_TRUE(SendData(transport2.get(), 1, "bar", &result)); |
| 323 EXPECT_TRUE_WAIT(ReceivedData(&recv2, 1, "foo"), kDefaultTimeout); | 323 EXPECT_TRUE_WAIT(ReceivedData(&recv2, 1, "foo"), kDefaultTimeout); |
| 324 EXPECT_TRUE_WAIT(ReceivedData(&recv1, 1, "bar"), kDefaultTimeout); | 324 EXPECT_TRUE_WAIT(ReceivedData(&recv1, 1, "bar"), kDefaultTimeout); |
| 325 } | 325 } |
| 326 | 326 |
| 327 TEST_F(SctpTransportTest, OpenStreamWithAlreadyOpenedStreamFails) { | 327 TEST_F(SctpTransportTest, OpenStreamWithAlreadyOpenedStreamFails) { |
| 328 FakeDtlsTransport fake_dtls("fake dtls", 0); | 328 FakeTransportChannel fake_dtls("fake dtls", 0); |
| 329 SctpFakeDataReceiver recv; | 329 SctpFakeDataReceiver recv; |
| 330 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); | 330 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); |
| 331 EXPECT_TRUE(transport->OpenStream(1)); | 331 EXPECT_TRUE(transport->OpenStream(1)); |
| 332 EXPECT_FALSE(transport->OpenStream(1)); | 332 EXPECT_FALSE(transport->OpenStream(1)); |
| 333 } | 333 } |
| 334 | 334 |
| 335 TEST_F(SctpTransportTest, ResetStreamWithAlreadyResetStreamFails) { | 335 TEST_F(SctpTransportTest, ResetStreamWithAlreadyResetStreamFails) { |
| 336 FakeDtlsTransport fake_dtls("fake dtls", 0); | 336 FakeTransportChannel fake_dtls("fake dtls", 0); |
| 337 SctpFakeDataReceiver recv; | 337 SctpFakeDataReceiver recv; |
| 338 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); | 338 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); |
| 339 EXPECT_TRUE(transport->OpenStream(1)); | 339 EXPECT_TRUE(transport->OpenStream(1)); |
| 340 EXPECT_TRUE(transport->ResetStream(1)); | 340 EXPECT_TRUE(transport->ResetStream(1)); |
| 341 EXPECT_FALSE(transport->ResetStream(1)); | 341 EXPECT_FALSE(transport->ResetStream(1)); |
| 342 } | 342 } |
| 343 | 343 |
| 344 // Test that SignalReadyToSendData is fired after Start has been called and the | 344 // Test that SignalReadyToSendData is fired after Start has been called and the |
| 345 // DTLS channel is writable. | 345 // DTLS channel is writable. |
| 346 TEST_F(SctpTransportTest, SignalReadyToSendDataAfterDtlsWritable) { | 346 TEST_F(SctpTransportTest, SignalReadyToSendDataAfterDtlsWritable) { |
| 347 FakeDtlsTransport fake_dtls("fake dtls", 0); | 347 FakeTransportChannel fake_dtls("fake dtls", 0); |
| 348 SctpFakeDataReceiver recv; | 348 SctpFakeDataReceiver recv; |
| 349 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); | 349 std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv)); |
| 350 | 350 |
| 351 SignalReadyToSendObserver signal_observer; | 351 SignalReadyToSendObserver signal_observer; |
| 352 transport->SignalReadyToSendData.connect( | 352 transport->SignalReadyToSendData.connect( |
| 353 &signal_observer, &SignalReadyToSendObserver::OnSignaled); | 353 &signal_observer, &SignalReadyToSendObserver::OnSignaled); |
| 354 | 354 |
| 355 transport->Start(kSctpDefaultPort, kSctpDefaultPort); | 355 transport->Start(kSctpDefaultPort, kSctpDefaultPort); |
| 356 fake_dtls.SetWritable(true); | 356 fake_dtls.SetWritable(true); |
| 357 EXPECT_TRUE_WAIT(signal_observer.IsSignaled(), kDefaultTimeout); | 357 EXPECT_TRUE_WAIT(signal_observer.IsSignaled(), kDefaultTimeout); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 AddStream(1); | 554 AddStream(1); |
| 555 ASSERT_TRUE(SendData(transport1(), 1, "hi?", &result)); | 555 ASSERT_TRUE(SendData(transport1(), 1, "hi?", &result)); |
| 556 EXPECT_EQ(SDR_SUCCESS, result); | 556 EXPECT_EQ(SDR_SUCCESS, result); |
| 557 EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hi?"), kDefaultTimeout); | 557 EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hi?"), kDefaultTimeout); |
| 558 transport1()->ResetStream(1); | 558 transport1()->ResetStream(1); |
| 559 EXPECT_TRUE_WAIT(transport2_sig_receiver.StreamCloseCount(1) == 2, | 559 EXPECT_TRUE_WAIT(transport2_sig_receiver.StreamCloseCount(1) == 2, |
| 560 kDefaultTimeout); | 560 kDefaultTimeout); |
| 561 } | 561 } |
| 562 | 562 |
| 563 } // namespace cricket | 563 } // namespace cricket |
| OLD | NEW |