Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: webrtc/media/sctp/sctptransport_unittest.cc

Issue 2606123002: Remove the dependency of TransportChannel and TransportChannelImpl. (Closed)
Patch Set: Fix the memory leak. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/media/sctp/sctptransport.cc ('k') | webrtc/media/sctp/sctptransportinternal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 FakeTransportChannel("fake dtls 1", 0)); 133 fake_dtls1_.reset(new FakeDtlsTransport("fake dtls 1", 0));
134 fake_dtls2_.reset(new FakeTransportChannel("fake dtls 2", 0)); 134 fake_dtls2_.reset(new FakeDtlsTransport("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
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(FakeTransportChannel* fake_dtls, 167 SctpTransport* CreateTransport(FakeDtlsTransport* 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
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 FakeTransportChannel* fake_dtls1() { return fake_dtls1_.get(); } 210 FakeDtlsTransport* fake_dtls1() { return fake_dtls1_.get(); }
211 FakeTransportChannel* fake_dtls2() { return fake_dtls2_.get(); } 211 FakeDtlsTransport* 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<FakeTransportChannel> fake_dtls1_; 221 std::unique_ptr<FakeDtlsTransport> fake_dtls1_;
222 std::unique_ptr<FakeTransportChannel> fake_dtls2_; 222 std::unique_ptr<FakeDtlsTransport> 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 FakeTransportChannel black_hole("black hole", 0); 239 FakeDtlsTransport black_hole("black hole", 0);
240 FakeTransportChannel fake_dtls1("fake dtls 1", 0); 240 FakeDtlsTransport fake_dtls1("fake dtls 1", 0);
241 FakeTransportChannel fake_dtls2("fake dtls 2", 0); 241 FakeDtlsTransport 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
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 FakeTransportChannel fake_dtls1("fake dtls 1", 0); 297 FakeDtlsTransport fake_dtls1("fake dtls 1", 0);
298 FakeTransportChannel fake_dtls2("fake dtls 2", 0); 298 FakeDtlsTransport 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 FakeTransportChannel fake_dtls("fake dtls", 0); 328 FakeDtlsTransport 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 FakeTransportChannel fake_dtls("fake dtls", 0); 336 FakeDtlsTransport 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 FakeTransportChannel fake_dtls("fake dtls", 0); 347 FakeDtlsTransport 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
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
OLDNEW
« no previous file with comments | « webrtc/media/sctp/sctptransport.cc ('k') | webrtc/media/sctp/sctptransportinternal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698