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