blob: 24fe232c9dec6330ea6d66a6154712d0cb7ef04c [file] [log] [blame]
Harald Alvestrand39993842021-02-17 09:05:31 +00001/*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <stdint.h>
12
13#include <algorithm>
14#include <memory>
15#include <string>
16#include <vector>
17
18#include "absl/types/optional.h"
19#include "api/data_channel_interface.h"
20#include "api/dtmf_sender_interface.h"
21#include "api/peer_connection_interface.h"
22#include "api/scoped_refptr.h"
23#include "api/units/time_delta.h"
24#include "pc/test/integration_test_helpers.h"
25#include "pc/test/mock_peer_connection_observers.h"
26#include "rtc_base/fake_clock.h"
27#include "rtc_base/gunit.h"
28#include "rtc_base/ref_counted_object.h"
29#include "rtc_base/virtual_socket_server.h"
30
31namespace webrtc {
32
33namespace {
34
35class DataChannelIntegrationTest
36 : public PeerConnectionIntegrationBaseTest,
37 public ::testing::WithParamInterface<SdpSemantics> {
38 protected:
39 DataChannelIntegrationTest()
40 : PeerConnectionIntegrationBaseTest(GetParam()) {}
41};
42
43// Fake clock must be set before threads are started to prevent race on
44// Set/GetClockForTesting().
45// To achieve that, multiple inheritance is used as a mixin pattern
46// where order of construction is finely controlled.
47// This also ensures peerconnection is closed before switching back to non-fake
48// clock, avoiding other races and DCHECK failures such as in rtp_sender.cc.
49class FakeClockForTest : public rtc::ScopedFakeClock {
50 protected:
51 FakeClockForTest() {
52 // Some things use a time of "0" as a special value, so we need to start out
53 // the fake clock at a nonzero time.
54 // TODO(deadbeef): Fix this.
55 AdvanceTime(webrtc::TimeDelta::Seconds(1));
56 }
57
58 // Explicit handle.
59 ScopedFakeClock& FakeClock() { return *this; }
60};
61
62// Ensure FakeClockForTest is constructed first (see class for rationale).
63class DataChannelIntegrationTestWithFakeClock
64 : public FakeClockForTest,
65 public DataChannelIntegrationTest {};
66
67class DataChannelIntegrationTestPlanB
68 : public PeerConnectionIntegrationBaseTest {
69 protected:
70 DataChannelIntegrationTestPlanB()
71 : PeerConnectionIntegrationBaseTest(SdpSemantics::kPlanB) {}
72};
73
74class DataChannelIntegrationTestUnifiedPlan
75 : public PeerConnectionIntegrationBaseTest {
76 protected:
77 DataChannelIntegrationTestUnifiedPlan()
78 : PeerConnectionIntegrationBaseTest(SdpSemantics::kUnifiedPlan) {}
79};
80
81class DummyDtmfObserver : public DtmfSenderObserverInterface {
82 public:
83 DummyDtmfObserver() : completed_(false) {}
84
85 // Implements DtmfSenderObserverInterface.
86 void OnToneChange(const std::string& tone) override {
87 tones_.push_back(tone);
88 if (tone.empty()) {
89 completed_ = true;
90 }
91 }
92
93 const std::vector<std::string>& tones() const { return tones_; }
94 bool completed() const { return completed_; }
95
96 private:
97 bool completed_;
98 std::vector<std::string> tones_;
99};
100
101#ifdef WEBRTC_HAVE_SCTP
102
103// This test causes a PeerConnection to enter Disconnected state, and
104// sends data on a DataChannel while disconnected.
105// The data should be surfaced when the connection reestablishes.
106TEST_P(DataChannelIntegrationTest, DataChannelWhileDisconnected) {
107 CreatePeerConnectionWrappers();
108 ConnectFakeSignaling();
109 caller()->CreateDataChannel();
110 caller()->CreateAndSetAndSignalOffer();
111 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
112 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
113 std::string data1 = "hello first";
114 caller()->data_channel()->Send(DataBuffer(data1));
115 EXPECT_EQ_WAIT(data1, callee()->data_observer()->last_message(),
116 kDefaultTimeout);
117 // Cause a network outage
118 virtual_socket_server()->set_drop_probability(1.0);
119 EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
120 caller()->standardized_ice_connection_state(),
121 kDefaultTimeout);
122 std::string data2 = "hello second";
123 caller()->data_channel()->Send(DataBuffer(data2));
124 // Remove the network outage. The connection should reestablish.
125 virtual_socket_server()->set_drop_probability(0.0);
126 EXPECT_EQ_WAIT(data2, callee()->data_observer()->last_message(),
127 kDefaultTimeout);
128}
129
130// This test causes a PeerConnection to enter Disconnected state,
131// sends data on a DataChannel while disconnected, and then triggers
132// an ICE restart.
133// The data should be surfaced when the connection reestablishes.
134TEST_P(DataChannelIntegrationTest, DataChannelWhileDisconnectedIceRestart) {
135 CreatePeerConnectionWrappers();
136 ConnectFakeSignaling();
137 caller()->CreateDataChannel();
138 caller()->CreateAndSetAndSignalOffer();
139 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
140 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
141 std::string data1 = "hello first";
142 caller()->data_channel()->Send(DataBuffer(data1));
143 EXPECT_EQ_WAIT(data1, callee()->data_observer()->last_message(),
144 kDefaultTimeout);
145 // Cause a network outage
146 virtual_socket_server()->set_drop_probability(1.0);
147 ASSERT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
148 caller()->standardized_ice_connection_state(),
149 kDefaultTimeout);
150 std::string data2 = "hello second";
151 caller()->data_channel()->Send(DataBuffer(data2));
152
153 // Trigger an ICE restart. The signaling channel is not affected by
154 // the network outage.
155 caller()->SetOfferAnswerOptions(IceRestartOfferAnswerOptions());
156 caller()->CreateAndSetAndSignalOffer();
157 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
158 // Remove the network outage. The connection should reestablish.
159 virtual_socket_server()->set_drop_probability(0.0);
160 EXPECT_EQ_WAIT(data2, callee()->data_observer()->last_message(),
161 kDefaultTimeout);
162}
163
164#endif // WEBRTC_HAVE_SCTP
165
166// This test sets up a call between two parties with audio, video and an RTP
167// data channel.
168TEST_P(DataChannelIntegrationTest, EndToEndCallWithRtpDataChannel) {
169 PeerConnectionInterface::RTCConfiguration rtc_config;
170 rtc_config.enable_rtp_data_channel = true;
171 rtc_config.enable_dtls_srtp = false;
172 ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(rtc_config, rtc_config));
173 ConnectFakeSignaling();
174 // Expect that data channel created on caller side will show up for callee as
175 // well.
176 caller()->CreateDataChannel();
177 caller()->AddAudioVideoTracks();
178 callee()->AddAudioVideoTracks();
179 caller()->CreateAndSetAndSignalOffer();
180 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
181 // Ensure the existence of the RTP data channel didn't impede audio/video.
182 MediaExpectations media_expectations;
183 media_expectations.ExpectBidirectionalAudioAndVideo();
184 ASSERT_TRUE(ExpectNewFrames(media_expectations));
185 ASSERT_NE(nullptr, caller()->data_channel());
186 ASSERT_NE(nullptr, callee()->data_channel());
187 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
188 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
189
190 // Ensure data can be sent in both directions.
191 std::string data = "hello world";
192 SendRtpDataWithRetries(caller()->data_channel(), data, 5);
193 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
194 kDefaultTimeout);
195 SendRtpDataWithRetries(callee()->data_channel(), data, 5);
196 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
197 kDefaultTimeout);
198}
199
200TEST_P(DataChannelIntegrationTest, RtpDataChannelWorksAfterRollback) {
201 PeerConnectionInterface::RTCConfiguration rtc_config;
202 rtc_config.enable_rtp_data_channel = true;
203 rtc_config.enable_dtls_srtp = false;
204 ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(rtc_config, rtc_config));
205 ConnectFakeSignaling();
206 auto data_channel = caller()->pc()->CreateDataChannel("label_1", nullptr);
207 ASSERT_TRUE(data_channel.get() != nullptr);
208 caller()->CreateAndSetAndSignalOffer();
209 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
210
211 caller()->CreateDataChannel("label_2", nullptr);
212 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
213 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
214 caller()->pc()->SetLocalDescription(observer,
215 caller()->CreateOfferAndWait().release());
216 EXPECT_TRUE_WAIT(observer->called(), kDefaultTimeout);
217 caller()->Rollback();
218
219 std::string data = "hello world";
220 SendRtpDataWithRetries(data_channel, data, 5);
221 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
222 kDefaultTimeout);
223}
224
225// Ensure that an RTP data channel is signaled as closed for the caller when
226// the callee rejects it in a subsequent offer.
227TEST_P(DataChannelIntegrationTest, RtpDataChannelSignaledClosedInCalleeOffer) {
228 // Same procedure as above test.
229 PeerConnectionInterface::RTCConfiguration rtc_config;
230 rtc_config.enable_rtp_data_channel = true;
231 rtc_config.enable_dtls_srtp = false;
232 ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(rtc_config, rtc_config));
233 ConnectFakeSignaling();
234 caller()->CreateDataChannel();
235 caller()->AddAudioVideoTracks();
236 callee()->AddAudioVideoTracks();
237 caller()->CreateAndSetAndSignalOffer();
238 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
239 ASSERT_NE(nullptr, caller()->data_channel());
240 ASSERT_NE(nullptr, callee()->data_channel());
241 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
242 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
243
244 // Close the data channel on the callee, and do an updated offer/answer.
245 callee()->data_channel()->Close();
246 callee()->CreateAndSetAndSignalOffer();
247 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
248 EXPECT_FALSE(caller()->data_observer()->IsOpen());
249 EXPECT_FALSE(callee()->data_observer()->IsOpen());
250}
251
252#if !defined(THREAD_SANITIZER)
253// This test provokes TSAN errors. See bugs.webrtc.org/11282
254
255// Tests that data is buffered in an RTP data channel until an observer is
256// registered for it.
257//
258// NOTE: RTP data channels can receive data before the underlying
259// transport has detected that a channel is writable and thus data can be
260// received before the data channel state changes to open. That is hard to test
261// but the same buffering is expected to be used in that case.
262//
263// Use fake clock and simulated network delay so that we predictably can wait
264// until an SCTP message has been delivered without "sleep()"ing.
265TEST_P(DataChannelIntegrationTestWithFakeClock,
266 DataBufferedUntilRtpDataChannelObserverRegistered) {
267 virtual_socket_server()->set_delay_mean(5); // 5 ms per hop.
268 virtual_socket_server()->UpdateDelayDistribution();
269
270 PeerConnectionInterface::RTCConfiguration rtc_config;
271 rtc_config.enable_rtp_data_channel = true;
272 rtc_config.enable_dtls_srtp = false;
273 ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(rtc_config, rtc_config));
274 ConnectFakeSignaling();
275 caller()->CreateDataChannel();
276 caller()->CreateAndSetAndSignalOffer();
277 ASSERT_TRUE(caller()->data_channel() != nullptr);
278 ASSERT_TRUE_SIMULATED_WAIT(callee()->data_channel() != nullptr,
279 kDefaultTimeout, FakeClock());
280 ASSERT_TRUE_SIMULATED_WAIT(caller()->data_observer()->IsOpen(),
281 kDefaultTimeout, FakeClock());
282 ASSERT_EQ_SIMULATED_WAIT(DataChannelInterface::kOpen,
283 callee()->data_channel()->state(), kDefaultTimeout,
284 FakeClock());
285
286 // Unregister the observer which is normally automatically registered.
287 callee()->data_channel()->UnregisterObserver();
288 // Send data and advance fake clock until it should have been received.
289 std::string data = "hello world";
290 caller()->data_channel()->Send(DataBuffer(data));
291 SIMULATED_WAIT(false, 50, FakeClock());
292
293 // Attach data channel and expect data to be received immediately. Note that
294 // EXPECT_EQ_WAIT is used, such that the simulated clock is not advanced any
295 // further, but data can be received even if the callback is asynchronous.
296 MockDataChannelObserver new_observer(callee()->data_channel());
297 EXPECT_EQ_SIMULATED_WAIT(data, new_observer.last_message(), kDefaultTimeout,
298 FakeClock());
299}
300
301#endif // !defined(THREAD_SANITIZER)
302
303// This test sets up a call between two parties with audio, video and but only
304// the caller client supports RTP data channels.
305TEST_P(DataChannelIntegrationTest, RtpDataChannelsRejectedByCallee) {
306 PeerConnectionInterface::RTCConfiguration rtc_config_1;
307 rtc_config_1.enable_rtp_data_channel = true;
308 // Must disable DTLS to make negotiation succeed.
309 rtc_config_1.enable_dtls_srtp = false;
310 PeerConnectionInterface::RTCConfiguration rtc_config_2;
311 rtc_config_2.enable_dtls_srtp = false;
312 rtc_config_2.enable_dtls_srtp = false;
313 ASSERT_TRUE(
314 CreatePeerConnectionWrappersWithConfig(rtc_config_1, rtc_config_2));
315 ConnectFakeSignaling();
316 caller()->CreateDataChannel();
317 ASSERT_TRUE(caller()->data_channel() != nullptr);
318 caller()->AddAudioVideoTracks();
319 callee()->AddAudioVideoTracks();
320 caller()->CreateAndSetAndSignalOffer();
321 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
322 // The caller should still have a data channel, but it should be closed, and
323 // one should ever have been created for the callee.
324 EXPECT_TRUE(caller()->data_channel() != nullptr);
325 EXPECT_FALSE(caller()->data_observer()->IsOpen());
326 EXPECT_EQ(nullptr, callee()->data_channel());
327}
328
329// This test sets up a call between two parties with audio, and video. When
330// audio and video is setup and flowing, an RTP data channel is negotiated.
331TEST_P(DataChannelIntegrationTest, AddRtpDataChannelInSubsequentOffer) {
332 PeerConnectionInterface::RTCConfiguration rtc_config;
333 rtc_config.enable_rtp_data_channel = true;
334 rtc_config.enable_dtls_srtp = false;
335 ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(rtc_config, rtc_config));
336 ConnectFakeSignaling();
337 // Do initial offer/answer with audio/video.
338 caller()->AddAudioVideoTracks();
339 callee()->AddAudioVideoTracks();
340 caller()->CreateAndSetAndSignalOffer();
341 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
342 // Create data channel and do new offer and answer.
343 caller()->CreateDataChannel();
344 caller()->CreateAndSetAndSignalOffer();
345 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
346 ASSERT_NE(nullptr, caller()->data_channel());
347 ASSERT_NE(nullptr, callee()->data_channel());
348 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
349 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
350 // Ensure data can be sent in both directions.
351 std::string data = "hello world";
352 SendRtpDataWithRetries(caller()->data_channel(), data, 5);
353 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
354 kDefaultTimeout);
355 SendRtpDataWithRetries(callee()->data_channel(), data, 5);
356 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
357 kDefaultTimeout);
358}
359
360#ifdef WEBRTC_HAVE_SCTP
361
362// This test sets up a call between two parties with audio, video and an SCTP
363// data channel.
364TEST_P(DataChannelIntegrationTest, EndToEndCallWithSctpDataChannel) {
365 ASSERT_TRUE(CreatePeerConnectionWrappers());
366 ConnectFakeSignaling();
367 // Expect that data channel created on caller side will show up for callee as
368 // well.
369 caller()->CreateDataChannel();
370 caller()->AddAudioVideoTracks();
371 callee()->AddAudioVideoTracks();
372 caller()->CreateAndSetAndSignalOffer();
373 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
374 // Ensure the existence of the SCTP data channel didn't impede audio/video.
375 MediaExpectations media_expectations;
376 media_expectations.ExpectBidirectionalAudioAndVideo();
377 ASSERT_TRUE(ExpectNewFrames(media_expectations));
378 // Caller data channel should already exist (it created one). Callee data
379 // channel may not exist yet, since negotiation happens in-band, not in SDP.
380 ASSERT_NE(nullptr, caller()->data_channel());
381 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
382 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
383 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
384
385 // Ensure data can be sent in both directions.
386 std::string data = "hello world";
387 caller()->data_channel()->Send(DataBuffer(data));
388 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
389 kDefaultTimeout);
390 callee()->data_channel()->Send(DataBuffer(data));
391 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
392 kDefaultTimeout);
393}
394
395// Ensure that when the callee closes an SCTP data channel, the closing
396// procedure results in the data channel being closed for the caller as well.
397TEST_P(DataChannelIntegrationTest, CalleeClosesSctpDataChannel) {
398 // Same procedure as above test.
399 ASSERT_TRUE(CreatePeerConnectionWrappers());
400 ConnectFakeSignaling();
401 caller()->CreateDataChannel();
402 caller()->AddAudioVideoTracks();
403 callee()->AddAudioVideoTracks();
404 caller()->CreateAndSetAndSignalOffer();
405 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
406 ASSERT_NE(nullptr, caller()->data_channel());
407 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
408 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
409 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
410
411 // Close the data channel on the callee side, and wait for it to reach the
412 // "closed" state on both sides.
413 callee()->data_channel()->Close();
414 EXPECT_TRUE_WAIT(!caller()->data_observer()->IsOpen(), kDefaultTimeout);
415 EXPECT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
416}
417
418TEST_P(DataChannelIntegrationTest, SctpDataChannelConfigSentToOtherSide) {
419 ASSERT_TRUE(CreatePeerConnectionWrappers());
420 ConnectFakeSignaling();
421 webrtc::DataChannelInit init;
422 init.id = 53;
423 init.maxRetransmits = 52;
424 caller()->CreateDataChannel("data-channel", &init);
425 caller()->AddAudioVideoTracks();
426 callee()->AddAudioVideoTracks();
427 caller()->CreateAndSetAndSignalOffer();
428 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
429 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
430 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
431 // Since "negotiated" is false, the "id" parameter should be ignored.
432 EXPECT_NE(init.id, callee()->data_channel()->id());
433 EXPECT_EQ("data-channel", callee()->data_channel()->label());
434 EXPECT_EQ(init.maxRetransmits, callee()->data_channel()->maxRetransmits());
435 EXPECT_FALSE(callee()->data_channel()->negotiated());
436}
437
438// Test usrsctp's ability to process unordered data stream, where data actually
439// arrives out of order using simulated delays. Previously there have been some
440// bugs in this area.
441TEST_P(DataChannelIntegrationTest, StressTestUnorderedSctpDataChannel) {
442 // Introduce random network delays.
443 // Otherwise it's not a true "unordered" test.
444 virtual_socket_server()->set_delay_mean(20);
445 virtual_socket_server()->set_delay_stddev(5);
446 virtual_socket_server()->UpdateDelayDistribution();
447 // Normal procedure, but with unordered data channel config.
448 ASSERT_TRUE(CreatePeerConnectionWrappers());
449 ConnectFakeSignaling();
450 webrtc::DataChannelInit init;
451 init.ordered = false;
452 caller()->CreateDataChannel(&init);
453 caller()->CreateAndSetAndSignalOffer();
454 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
455 ASSERT_NE(nullptr, caller()->data_channel());
456 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
457 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
458 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
459
460 static constexpr int kNumMessages = 100;
461 // Deliberately chosen to be larger than the MTU so messages get fragmented.
462 static constexpr size_t kMaxMessageSize = 4096;
463 // Create and send random messages.
464 std::vector<std::string> sent_messages;
465 for (int i = 0; i < kNumMessages; ++i) {
466 size_t length =
467 (rand() % kMaxMessageSize) + 1; // NOLINT (rand_r instead of rand)
468 std::string message;
469 ASSERT_TRUE(rtc::CreateRandomString(length, &message));
470 caller()->data_channel()->Send(DataBuffer(message));
471 callee()->data_channel()->Send(DataBuffer(message));
472 sent_messages.push_back(message);
473 }
474
475 // Wait for all messages to be received.
476 EXPECT_EQ_WAIT(rtc::checked_cast<size_t>(kNumMessages),
477 caller()->data_observer()->received_message_count(),
478 kDefaultTimeout);
479 EXPECT_EQ_WAIT(rtc::checked_cast<size_t>(kNumMessages),
480 callee()->data_observer()->received_message_count(),
481 kDefaultTimeout);
482
483 // Sort and compare to make sure none of the messages were corrupted.
484 std::vector<std::string> caller_received_messages =
485 caller()->data_observer()->messages();
486 std::vector<std::string> callee_received_messages =
487 callee()->data_observer()->messages();
488 absl::c_sort(sent_messages);
489 absl::c_sort(caller_received_messages);
490 absl::c_sort(callee_received_messages);
491 EXPECT_EQ(sent_messages, caller_received_messages);
492 EXPECT_EQ(sent_messages, callee_received_messages);
493}
494
495// This test sets up a call between two parties with audio, and video. When
496// audio and video are setup and flowing, an SCTP data channel is negotiated.
497TEST_P(DataChannelIntegrationTest, AddSctpDataChannelInSubsequentOffer) {
498 ASSERT_TRUE(CreatePeerConnectionWrappers());
499 ConnectFakeSignaling();
500 // Do initial offer/answer with audio/video.
501 caller()->AddAudioVideoTracks();
502 callee()->AddAudioVideoTracks();
503 caller()->CreateAndSetAndSignalOffer();
504 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
505 // Create data channel and do new offer and answer.
506 caller()->CreateDataChannel();
507 caller()->CreateAndSetAndSignalOffer();
508 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
509 // Caller data channel should already exist (it created one). Callee data
510 // channel may not exist yet, since negotiation happens in-band, not in SDP.
511 ASSERT_NE(nullptr, caller()->data_channel());
512 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
513 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
514 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
515 // Ensure data can be sent in both directions.
516 std::string data = "hello world";
517 caller()->data_channel()->Send(DataBuffer(data));
518 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
519 kDefaultTimeout);
520 callee()->data_channel()->Send(DataBuffer(data));
521 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
522 kDefaultTimeout);
523}
524
525// Set up a connection initially just using SCTP data channels, later upgrading
526// to audio/video, ensuring frames are received end-to-end. Effectively the
527// inverse of the test above.
528// This was broken in M57; see https://crbug.com/711243
529TEST_P(DataChannelIntegrationTest, SctpDataChannelToAudioVideoUpgrade) {
530 ASSERT_TRUE(CreatePeerConnectionWrappers());
531 ConnectFakeSignaling();
532 // Do initial offer/answer with just data channel.
533 caller()->CreateDataChannel();
534 caller()->CreateAndSetAndSignalOffer();
535 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
536 // Wait until data can be sent over the data channel.
537 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
538 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
539 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
540
541 // Do subsequent offer/answer with two-way audio and video. Audio and video
542 // should end up bundled on the DTLS/ICE transport already used for data.
543 caller()->AddAudioVideoTracks();
544 callee()->AddAudioVideoTracks();
545 caller()->CreateAndSetAndSignalOffer();
546 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
547 MediaExpectations media_expectations;
548 media_expectations.ExpectBidirectionalAudioAndVideo();
549 ASSERT_TRUE(ExpectNewFrames(media_expectations));
550}
551
552static void MakeSpecCompliantSctpOffer(cricket::SessionDescription* desc) {
553 cricket::SctpDataContentDescription* dcd_offer =
554 GetFirstSctpDataContentDescription(desc);
555 // See https://crbug.com/webrtc/11211 - this function is a no-op
556 ASSERT_TRUE(dcd_offer);
557 dcd_offer->set_use_sctpmap(false);
558 dcd_offer->set_protocol("UDP/DTLS/SCTP");
559}
560
561// Test that the data channel works when a spec-compliant SCTP m= section is
562// offered (using "a=sctp-port" instead of "a=sctpmap", and using
563// "UDP/DTLS/SCTP" as the protocol).
564TEST_P(DataChannelIntegrationTest,
565 DataChannelWorksWhenSpecCompliantSctpOfferReceived) {
566 ASSERT_TRUE(CreatePeerConnectionWrappers());
567 ConnectFakeSignaling();
568 caller()->CreateDataChannel();
569 caller()->SetGeneratedSdpMunger(MakeSpecCompliantSctpOffer);
570 caller()->CreateAndSetAndSignalOffer();
571 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
572 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
573 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
574 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
575
576 // Ensure data can be sent in both directions.
577 std::string data = "hello world";
578 caller()->data_channel()->Send(DataBuffer(data));
579 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
580 kDefaultTimeout);
581 callee()->data_channel()->Send(DataBuffer(data));
582 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
583 kDefaultTimeout);
584}
585
586#endif // WEBRTC_HAVE_SCTP
587
588// Test that after closing PeerConnections, they stop sending any packets (ICE,
589// DTLS, RTP...).
590TEST_P(DataChannelIntegrationTest, ClosingConnectionStopsPacketFlow) {
591 // Set up audio/video/data, wait for some frames to be received.
592 ASSERT_TRUE(CreatePeerConnectionWrappers());
593 ConnectFakeSignaling();
594 caller()->AddAudioVideoTracks();
595#ifdef WEBRTC_HAVE_SCTP
596 caller()->CreateDataChannel();
597#endif
598 caller()->CreateAndSetAndSignalOffer();
599 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
600 MediaExpectations media_expectations;
601 media_expectations.CalleeExpectsSomeAudioAndVideo();
602 ASSERT_TRUE(ExpectNewFrames(media_expectations));
603 // Close PeerConnections.
604 ClosePeerConnections();
605 // Pump messages for a second, and ensure no new packets end up sent.
606 uint32_t sent_packets_a = virtual_socket_server()->sent_packets();
607 WAIT(false, 1000);
608 uint32_t sent_packets_b = virtual_socket_server()->sent_packets();
609 EXPECT_EQ(sent_packets_a, sent_packets_b);
610}
611
612// Test that transport stats are generated by the RTCStatsCollector for a
613// connection that only involves data channels. This is a regression test for
614// crbug.com/826972.
615#ifdef WEBRTC_HAVE_SCTP
616TEST_P(DataChannelIntegrationTest,
617 TransportStatsReportedForDataChannelOnlyConnection) {
618 ASSERT_TRUE(CreatePeerConnectionWrappers());
619 ConnectFakeSignaling();
620 caller()->CreateDataChannel();
621
622 caller()->CreateAndSetAndSignalOffer();
623 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
624 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
625
626 auto caller_report = caller()->NewGetStats();
627 EXPECT_EQ(1u, caller_report->GetStatsOfType<RTCTransportStats>().size());
628 auto callee_report = callee()->NewGetStats();
629 EXPECT_EQ(1u, callee_report->GetStatsOfType<RTCTransportStats>().size());
630}
631
632INSTANTIATE_TEST_SUITE_P(DataChannelIntegrationTest,
633 DataChannelIntegrationTest,
634 Values(SdpSemantics::kPlanB,
635 SdpSemantics::kUnifiedPlan));
636
637INSTANTIATE_TEST_SUITE_P(DataChannelIntegrationTest,
638 DataChannelIntegrationTestWithFakeClock,
639 Values(SdpSemantics::kPlanB,
640 SdpSemantics::kUnifiedPlan));
641
642TEST_F(DataChannelIntegrationTestUnifiedPlan,
643 EndToEndCallWithBundledSctpDataChannel) {
644 ASSERT_TRUE(CreatePeerConnectionWrappers());
645 ConnectFakeSignaling();
646 caller()->CreateDataChannel();
647 caller()->AddAudioVideoTracks();
648 callee()->AddAudioVideoTracks();
649 caller()->CreateAndSetAndSignalOffer();
650 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
651 network_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
652 ASSERT_EQ_WAIT(SctpTransportState::kConnected,
653 caller()->pc()->GetSctpTransport()->Information().state(),
654 kDefaultTimeout);
655 });
656 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
657 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
658}
659
660TEST_F(DataChannelIntegrationTestUnifiedPlan,
661 EndToEndCallWithDataChannelOnlyConnects) {
662 ASSERT_TRUE(CreatePeerConnectionWrappers());
663 ConnectFakeSignaling();
664 caller()->CreateDataChannel();
665 caller()->CreateAndSetAndSignalOffer();
666 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
667 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
668 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
669 ASSERT_TRUE(caller()->data_observer()->IsOpen());
670}
671
672TEST_F(DataChannelIntegrationTestUnifiedPlan, DataChannelClosesWhenClosed) {
673 ASSERT_TRUE(CreatePeerConnectionWrappers());
674 ConnectFakeSignaling();
675 caller()->CreateDataChannel();
676 caller()->CreateAndSetAndSignalOffer();
677 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
678 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
679 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
680 caller()->data_channel()->Close();
681 ASSERT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
682}
683
684TEST_F(DataChannelIntegrationTestUnifiedPlan,
685 DataChannelClosesWhenClosedReverse) {
686 ASSERT_TRUE(CreatePeerConnectionWrappers());
687 ConnectFakeSignaling();
688 caller()->CreateDataChannel();
689 caller()->CreateAndSetAndSignalOffer();
690 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
691 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
692 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
693 callee()->data_channel()->Close();
694 ASSERT_TRUE_WAIT(!caller()->data_observer()->IsOpen(), kDefaultTimeout);
695}
696
697TEST_F(DataChannelIntegrationTestUnifiedPlan,
698 DataChannelClosesWhenPeerConnectionClosed) {
699 ASSERT_TRUE(CreatePeerConnectionWrappers());
700 ConnectFakeSignaling();
701 caller()->CreateDataChannel();
702 caller()->CreateAndSetAndSignalOffer();
703 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
704 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
705 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
706 caller()->pc()->Close();
707 ASSERT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
708}
709
710#endif // WEBRTC_HAVE_SCTP
711
712} // namespace
713
714} // namespace webrtc