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 |