blob: bf6150c3794a5607f45b150b88edbc840f7d8f45 [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
Harald Alvestrandc24a2182022-02-23 13:44:59 +000013#include <cstdlib>
14#include <iterator>
Harald Alvestrand39993842021-02-17 09:05:31 +000015#include <string>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000016#include <tuple>
Harald Alvestrand39993842021-02-17 09:05:31 +000017#include <vector>
18
Harald Alvestrandc24a2182022-02-23 13:44:59 +000019#include "absl/algorithm/container.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000020#include "absl/types/optional.h"
21#include "api/data_channel_interface.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000022#include "api/dtls_transport_interface.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000023#include "api/peer_connection_interface.h"
24#include "api/scoped_refptr.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000025#include "api/sctp_transport_interface.h"
26#include "api/stats/rtc_stats_report.h"
27#include "api/stats/rtcstats_objects.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000028#include "api/units/time_delta.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000029#include "p2p/base/transport_description.h"
30#include "p2p/base/transport_info.h"
31#include "pc/media_session.h"
32#include "pc/session_description.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000033#include "pc/test/integration_test_helpers.h"
34#include "pc/test/mock_peer_connection_observers.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000035#include "rtc_base/copy_on_write_buffer.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000036#include "rtc_base/fake_clock.h"
37#include "rtc_base/gunit.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000038#include "rtc_base/helpers.h"
39#include "rtc_base/logging.h"
40#include "rtc_base/numerics/safe_conversions.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000041#include "rtc_base/virtual_socket_server.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000042#include "test/gmock.h"
Florent Castellia6983c62021-05-06 10:50:07 +020043#include "test/gtest.h"
Harald Alvestrand39993842021-02-17 09:05:31 +000044
45namespace webrtc {
46
47namespace {
48
Harald Alvestrand20f94012021-05-21 07:04:27 +000049// All tests in this file require SCTP support.
50#ifdef WEBRTC_HAVE_SCTP
51
Victor Boiviefe968df2022-02-01 11:26:05 +010052#if defined(WEBRTC_ANDROID)
53// Disable heavy tests running on low-end Android devices.
54#define DISABLED_ON_ANDROID(t) DISABLED_##t
55#else
56#define DISABLED_ON_ANDROID(t) t
57#endif
58
Florent Castellif2599a72022-03-31 19:15:10 +020059class DataChannelIntegrationTest
60 : public PeerConnectionIntegrationBaseTest,
61 public ::testing::WithParamInterface<SdpSemantics> {
Harald Alvestrand39993842021-02-17 09:05:31 +000062 protected:
63 DataChannelIntegrationTest()
Florent Castellif2599a72022-03-31 19:15:10 +020064 : PeerConnectionIntegrationBaseTest(GetParam()) {}
Harald Alvestrand39993842021-02-17 09:05:31 +000065};
66
67// Fake clock must be set before threads are started to prevent race on
68// Set/GetClockForTesting().
69// To achieve that, multiple inheritance is used as a mixin pattern
70// where order of construction is finely controlled.
71// This also ensures peerconnection is closed before switching back to non-fake
72// clock, avoiding other races and DCHECK failures such as in rtp_sender.cc.
73class FakeClockForTest : public rtc::ScopedFakeClock {
74 protected:
75 FakeClockForTest() {
76 // Some things use a time of "0" as a special value, so we need to start out
77 // the fake clock at a nonzero time.
78 // TODO(deadbeef): Fix this.
79 AdvanceTime(webrtc::TimeDelta::Seconds(1));
80 }
81
82 // Explicit handle.
83 ScopedFakeClock& FakeClock() { return *this; }
84};
85
Harald Alvestrand39993842021-02-17 09:05:31 +000086class DataChannelIntegrationTestPlanB
87 : public PeerConnectionIntegrationBaseTest {
88 protected:
89 DataChannelIntegrationTestPlanB()
90 : PeerConnectionIntegrationBaseTest(SdpSemantics::kPlanB) {}
91};
92
Harald Alvestrand39993842021-02-17 09:05:31 +000093class DataChannelIntegrationTestUnifiedPlan
94 : public PeerConnectionIntegrationBaseTest {
95 protected:
96 DataChannelIntegrationTestUnifiedPlan()
97 : PeerConnectionIntegrationBaseTest(SdpSemantics::kUnifiedPlan) {}
98};
99
Harald Alvestrand321ec3b2022-02-10 13:42:18 +0000100void MakeActiveSctpOffer(cricket::SessionDescription* desc) {
101 auto& transport_infos = desc->transport_infos();
102 for (auto& transport_info : transport_infos) {
103 transport_info.description.connection_role = cricket::CONNECTIONROLE_ACTIVE;
104 }
105}
106
Harald Alvestrand39993842021-02-17 09:05:31 +0000107// This test causes a PeerConnection to enter Disconnected state, and
108// sends data on a DataChannel while disconnected.
109// The data should be surfaced when the connection reestablishes.
110TEST_P(DataChannelIntegrationTest, DataChannelWhileDisconnected) {
111 CreatePeerConnectionWrappers();
112 ConnectFakeSignaling();
113 caller()->CreateDataChannel();
114 caller()->CreateAndSetAndSignalOffer();
115 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
116 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
117 std::string data1 = "hello first";
118 caller()->data_channel()->Send(DataBuffer(data1));
119 EXPECT_EQ_WAIT(data1, callee()->data_observer()->last_message(),
120 kDefaultTimeout);
121 // Cause a network outage
122 virtual_socket_server()->set_drop_probability(1.0);
123 EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
124 caller()->standardized_ice_connection_state(),
125 kDefaultTimeout);
126 std::string data2 = "hello second";
127 caller()->data_channel()->Send(DataBuffer(data2));
128 // Remove the network outage. The connection should reestablish.
129 virtual_socket_server()->set_drop_probability(0.0);
130 EXPECT_EQ_WAIT(data2, callee()->data_observer()->last_message(),
131 kDefaultTimeout);
132}
133
134// This test causes a PeerConnection to enter Disconnected state,
135// sends data on a DataChannel while disconnected, and then triggers
136// an ICE restart.
137// The data should be surfaced when the connection reestablishes.
138TEST_P(DataChannelIntegrationTest, DataChannelWhileDisconnectedIceRestart) {
139 CreatePeerConnectionWrappers();
140 ConnectFakeSignaling();
141 caller()->CreateDataChannel();
142 caller()->CreateAndSetAndSignalOffer();
143 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
144 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
145 std::string data1 = "hello first";
146 caller()->data_channel()->Send(DataBuffer(data1));
147 EXPECT_EQ_WAIT(data1, callee()->data_observer()->last_message(),
148 kDefaultTimeout);
149 // Cause a network outage
150 virtual_socket_server()->set_drop_probability(1.0);
151 ASSERT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
152 caller()->standardized_ice_connection_state(),
153 kDefaultTimeout);
154 std::string data2 = "hello second";
155 caller()->data_channel()->Send(DataBuffer(data2));
156
157 // Trigger an ICE restart. The signaling channel is not affected by
158 // the network outage.
159 caller()->SetOfferAnswerOptions(IceRestartOfferAnswerOptions());
160 caller()->CreateAndSetAndSignalOffer();
161 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
162 // Remove the network outage. The connection should reestablish.
163 virtual_socket_server()->set_drop_probability(0.0);
164 EXPECT_EQ_WAIT(data2, callee()->data_observer()->last_message(),
165 kDefaultTimeout);
166}
167
Harald Alvestrand39993842021-02-17 09:05:31 +0000168// This test sets up a call between two parties with audio, video and an SCTP
169// data channel.
170TEST_P(DataChannelIntegrationTest, EndToEndCallWithSctpDataChannel) {
171 ASSERT_TRUE(CreatePeerConnectionWrappers());
172 ConnectFakeSignaling();
173 // Expect that data channel created on caller side will show up for callee as
174 // well.
175 caller()->CreateDataChannel();
176 caller()->AddAudioVideoTracks();
177 callee()->AddAudioVideoTracks();
178 caller()->CreateAndSetAndSignalOffer();
179 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
180 // Ensure the existence of the SCTP data channel didn't impede audio/video.
181 MediaExpectations media_expectations;
182 media_expectations.ExpectBidirectionalAudioAndVideo();
183 ASSERT_TRUE(ExpectNewFrames(media_expectations));
184 // Caller data channel should already exist (it created one). Callee data
185 // channel may not exist yet, since negotiation happens in-band, not in SDP.
186 ASSERT_NE(nullptr, caller()->data_channel());
187 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
188 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
189 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
190
191 // Ensure data can be sent in both directions.
192 std::string data = "hello world";
193 caller()->data_channel()->Send(DataBuffer(data));
194 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
195 kDefaultTimeout);
196 callee()->data_channel()->Send(DataBuffer(data));
197 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
198 kDefaultTimeout);
199}
200
Harald Alvestrand7087b832021-03-11 17:21:13 +0000201// This test sets up a call between two parties with an SCTP
202// data channel only, and sends messages of various sizes.
203TEST_P(DataChannelIntegrationTest,
204 EndToEndCallWithSctpDataChannelVariousSizes) {
205 ASSERT_TRUE(CreatePeerConnectionWrappers());
206 ConnectFakeSignaling();
207 // Expect that data channel created on caller side will show up for callee as
208 // well.
209 caller()->CreateDataChannel();
210 caller()->CreateAndSetAndSignalOffer();
211 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
212 // Caller data channel should already exist (it created one). Callee data
213 // channel may not exist yet, since negotiation happens in-band, not in SDP.
214 ASSERT_NE(nullptr, caller()->data_channel());
215 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
216 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
217 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
218
219 for (int message_size = 1; message_size < 100000; message_size *= 2) {
220 std::string data(message_size, 'a');
221 caller()->data_channel()->Send(DataBuffer(data));
222 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
223 kDefaultTimeout);
224 callee()->data_channel()->Send(DataBuffer(data));
225 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
226 kDefaultTimeout);
227 }
228 // Specifically probe the area around the MTU size.
229 for (int message_size = 1100; message_size < 1300; message_size += 1) {
230 std::string data(message_size, 'a');
231 caller()->data_channel()->Send(DataBuffer(data));
232 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
233 kDefaultTimeout);
234 callee()->data_channel()->Send(DataBuffer(data));
235 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
236 kDefaultTimeout);
237 }
238}
239
Florent Castelli88f4b332021-04-22 13:32:39 +0200240// This test sets up a call between two parties with an SCTP
241// data channel only, and sends empty messages
242TEST_P(DataChannelIntegrationTest,
243 EndToEndCallWithSctpDataChannelEmptyMessages) {
244 ASSERT_TRUE(CreatePeerConnectionWrappers());
245 ConnectFakeSignaling();
246 // Expect that data channel created on caller side will show up for callee as
247 // well.
248 caller()->CreateDataChannel();
249 caller()->CreateAndSetAndSignalOffer();
250 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
251 // Caller data channel should already exist (it created one). Callee data
252 // channel may not exist yet, since negotiation happens in-band, not in SDP.
253 ASSERT_NE(nullptr, caller()->data_channel());
254 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
255 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
256 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
257
258 // Ensure data can be sent in both directions.
259 // Sending empty string data
260 std::string data = "";
261 caller()->data_channel()->Send(DataBuffer(data));
262 EXPECT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(),
263 kDefaultTimeout);
264 EXPECT_TRUE(callee()->data_observer()->last_message().empty());
265 EXPECT_FALSE(callee()->data_observer()->messages().back().binary);
266 callee()->data_channel()->Send(DataBuffer(data));
267 EXPECT_EQ_WAIT(1u, caller()->data_observer()->received_message_count(),
268 kDefaultTimeout);
269 EXPECT_TRUE(caller()->data_observer()->last_message().empty());
270 EXPECT_FALSE(caller()->data_observer()->messages().back().binary);
271
272 // Sending empty binary data
273 rtc::CopyOnWriteBuffer empty_buffer;
274 caller()->data_channel()->Send(DataBuffer(empty_buffer, true));
275 EXPECT_EQ_WAIT(2u, callee()->data_observer()->received_message_count(),
276 kDefaultTimeout);
277 EXPECT_TRUE(callee()->data_observer()->last_message().empty());
278 EXPECT_TRUE(callee()->data_observer()->messages().back().binary);
279 callee()->data_channel()->Send(DataBuffer(empty_buffer, true));
280 EXPECT_EQ_WAIT(2u, caller()->data_observer()->received_message_count(),
281 kDefaultTimeout);
282 EXPECT_TRUE(caller()->data_observer()->last_message().empty());
283 EXPECT_TRUE(caller()->data_observer()->messages().back().binary);
284}
285
Harald Alvestrand7087b832021-03-11 17:21:13 +0000286TEST_P(DataChannelIntegrationTest,
287 EndToEndCallWithSctpDataChannelLowestSafeMtu) {
288 // The lowest payload size limit that's tested and found safe for this
289 // application. Note that this is not the safe limit under all conditions;
290 // in particular, the default is not the largest DTLS signature, and
291 // this test does not use TURN.
292 const size_t kLowestSafePayloadSizeLimit = 1225;
293
294 ASSERT_TRUE(CreatePeerConnectionWrappers());
295 ConnectFakeSignaling();
296 // Expect that data channel created on caller side will show up for callee as
297 // well.
298 caller()->CreateDataChannel();
299 caller()->CreateAndSetAndSignalOffer();
300 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
301 // Caller data channel should already exist (it created one). Callee data
302 // channel may not exist yet, since negotiation happens in-band, not in SDP.
303 ASSERT_NE(nullptr, caller()->data_channel());
304 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
305 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
306 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
307
308 virtual_socket_server()->set_max_udp_payload(kLowestSafePayloadSizeLimit);
309 for (int message_size = 1140; message_size < 1240; message_size += 1) {
310 std::string data(message_size, 'a');
311 caller()->data_channel()->Send(DataBuffer(data));
312 ASSERT_EQ_WAIT(data, callee()->data_observer()->last_message(),
313 kDefaultTimeout);
314 callee()->data_channel()->Send(DataBuffer(data));
315 ASSERT_EQ_WAIT(data, caller()->data_observer()->last_message(),
316 kDefaultTimeout);
317 }
318}
319
320// This test verifies that lowering the MTU of the connection will cause
321// the datachannel to not transmit reliably.
322// The purpose of this test is to ensure that we know how a too-small MTU
323// error manifests itself.
324TEST_P(DataChannelIntegrationTest, EndToEndCallWithSctpDataChannelHarmfulMtu) {
325 // The lowest payload size limit that's tested and found safe for this
326 // application in this configuration (see test above).
327 const size_t kLowestSafePayloadSizeLimit = 1225;
328 // The size of the smallest message that fails to be delivered.
329 const size_t kMessageSizeThatIsNotDelivered = 1157;
330
331 ASSERT_TRUE(CreatePeerConnectionWrappers());
332 ConnectFakeSignaling();
333 caller()->CreateDataChannel();
334 caller()->CreateAndSetAndSignalOffer();
335 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
336 ASSERT_NE(nullptr, caller()->data_channel());
337 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
338 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
339 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
340
341 virtual_socket_server()->set_max_udp_payload(kLowestSafePayloadSizeLimit - 1);
342 // Probe for an undelivered or slowly delivered message. The exact
343 // size limit seems to be dependent on the message history, so make the
344 // code easily able to find the current value.
345 bool failure_seen = false;
346 for (size_t message_size = 1110; message_size < 1400; message_size++) {
347 const size_t message_count =
348 callee()->data_observer()->received_message_count();
349 const std::string data(message_size, 'a');
350 caller()->data_channel()->Send(DataBuffer(data));
351 // Wait a very short time for the message to be delivered.
Harald Alvestrand9d1e0702021-03-16 06:15:01 +0000352 // Note: Waiting only 10 ms is too short for Windows bots; they will
353 // flakily fail at a random frame.
Harald Alvestrand7087b832021-03-11 17:21:13 +0000354 WAIT(callee()->data_observer()->received_message_count() > message_count,
Harald Alvestrand9d1e0702021-03-16 06:15:01 +0000355 100);
Harald Alvestrand7087b832021-03-11 17:21:13 +0000356 if (callee()->data_observer()->received_message_count() == message_count) {
357 ASSERT_EQ(kMessageSizeThatIsNotDelivered, message_size);
358 failure_seen = true;
359 break;
360 }
361 }
362 ASSERT_TRUE(failure_seen);
363}
364
Harald Alvestrand39993842021-02-17 09:05:31 +0000365// Ensure that when the callee closes an SCTP data channel, the closing
366// procedure results in the data channel being closed for the caller as well.
367TEST_P(DataChannelIntegrationTest, CalleeClosesSctpDataChannel) {
368 // Same procedure as above test.
369 ASSERT_TRUE(CreatePeerConnectionWrappers());
370 ConnectFakeSignaling();
371 caller()->CreateDataChannel();
372 caller()->AddAudioVideoTracks();
373 callee()->AddAudioVideoTracks();
374 caller()->CreateAndSetAndSignalOffer();
375 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
376 ASSERT_NE(nullptr, caller()->data_channel());
377 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
378 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
379 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
380
381 // Close the data channel on the callee side, and wait for it to reach the
382 // "closed" state on both sides.
383 callee()->data_channel()->Close();
Florent Castelli141a4de2021-04-29 12:49:25 +0200384
385 DataChannelInterface::DataState expected_states[] = {
386 DataChannelInterface::DataState::kConnecting,
387 DataChannelInterface::DataState::kOpen,
388 DataChannelInterface::DataState::kClosing,
389 DataChannelInterface::DataState::kClosed};
390
391 EXPECT_EQ_WAIT(DataChannelInterface::DataState::kClosed,
392 caller()->data_observer()->state(), kDefaultTimeout);
393 EXPECT_THAT(caller()->data_observer()->states(),
394 ::testing::ElementsAreArray(expected_states));
395
396 EXPECT_EQ_WAIT(DataChannelInterface::DataState::kClosed,
397 callee()->data_observer()->state(), kDefaultTimeout);
398 EXPECT_THAT(callee()->data_observer()->states(),
399 ::testing::ElementsAreArray(expected_states));
Harald Alvestrand39993842021-02-17 09:05:31 +0000400}
401
402TEST_P(DataChannelIntegrationTest, SctpDataChannelConfigSentToOtherSide) {
403 ASSERT_TRUE(CreatePeerConnectionWrappers());
404 ConnectFakeSignaling();
405 webrtc::DataChannelInit init;
406 init.id = 53;
407 init.maxRetransmits = 52;
408 caller()->CreateDataChannel("data-channel", &init);
409 caller()->AddAudioVideoTracks();
410 callee()->AddAudioVideoTracks();
411 caller()->CreateAndSetAndSignalOffer();
412 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
413 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
414 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
415 // Since "negotiated" is false, the "id" parameter should be ignored.
416 EXPECT_NE(init.id, callee()->data_channel()->id());
417 EXPECT_EQ("data-channel", callee()->data_channel()->label());
418 EXPECT_EQ(init.maxRetransmits, callee()->data_channel()->maxRetransmits());
419 EXPECT_FALSE(callee()->data_channel()->negotiated());
420}
421
Florent Castellif2599a72022-03-31 19:15:10 +0200422// Test sctp's ability to process unordered data stream, where data actually
Harald Alvestrand39993842021-02-17 09:05:31 +0000423// arrives out of order using simulated delays. Previously there have been some
424// bugs in this area.
425TEST_P(DataChannelIntegrationTest, StressTestUnorderedSctpDataChannel) {
426 // Introduce random network delays.
427 // Otherwise it's not a true "unordered" test.
428 virtual_socket_server()->set_delay_mean(20);
429 virtual_socket_server()->set_delay_stddev(5);
430 virtual_socket_server()->UpdateDelayDistribution();
431 // Normal procedure, but with unordered data channel config.
432 ASSERT_TRUE(CreatePeerConnectionWrappers());
433 ConnectFakeSignaling();
434 webrtc::DataChannelInit init;
435 init.ordered = false;
436 caller()->CreateDataChannel(&init);
437 caller()->CreateAndSetAndSignalOffer();
438 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
439 ASSERT_NE(nullptr, caller()->data_channel());
440 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
441 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
442 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
443
444 static constexpr int kNumMessages = 100;
445 // Deliberately chosen to be larger than the MTU so messages get fragmented.
446 static constexpr size_t kMaxMessageSize = 4096;
447 // Create and send random messages.
448 std::vector<std::string> sent_messages;
449 for (int i = 0; i < kNumMessages; ++i) {
450 size_t length =
451 (rand() % kMaxMessageSize) + 1; // NOLINT (rand_r instead of rand)
452 std::string message;
453 ASSERT_TRUE(rtc::CreateRandomString(length, &message));
454 caller()->data_channel()->Send(DataBuffer(message));
455 callee()->data_channel()->Send(DataBuffer(message));
456 sent_messages.push_back(message);
457 }
458
459 // Wait for all messages to be received.
460 EXPECT_EQ_WAIT(rtc::checked_cast<size_t>(kNumMessages),
461 caller()->data_observer()->received_message_count(),
462 kDefaultTimeout);
463 EXPECT_EQ_WAIT(rtc::checked_cast<size_t>(kNumMessages),
464 callee()->data_observer()->received_message_count(),
465 kDefaultTimeout);
466
467 // Sort and compare to make sure none of the messages were corrupted.
Florent Castelli88f4b332021-04-22 13:32:39 +0200468 std::vector<std::string> caller_received_messages;
469 absl::c_transform(caller()->data_observer()->messages(),
470 std::back_inserter(caller_received_messages),
471 [](const auto& a) { return a.data; });
472
473 std::vector<std::string> callee_received_messages;
474 absl::c_transform(callee()->data_observer()->messages(),
475 std::back_inserter(callee_received_messages),
476 [](const auto& a) { return a.data; });
477
Harald Alvestrand39993842021-02-17 09:05:31 +0000478 absl::c_sort(sent_messages);
479 absl::c_sort(caller_received_messages);
480 absl::c_sort(callee_received_messages);
481 EXPECT_EQ(sent_messages, caller_received_messages);
482 EXPECT_EQ(sent_messages, callee_received_messages);
483}
484
485// This test sets up a call between two parties with audio, and video. When
486// audio and video are setup and flowing, an SCTP data channel is negotiated.
487TEST_P(DataChannelIntegrationTest, AddSctpDataChannelInSubsequentOffer) {
488 ASSERT_TRUE(CreatePeerConnectionWrappers());
489 ConnectFakeSignaling();
490 // Do initial offer/answer with audio/video.
491 caller()->AddAudioVideoTracks();
492 callee()->AddAudioVideoTracks();
493 caller()->CreateAndSetAndSignalOffer();
494 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
495 // Create data channel and do new offer and answer.
496 caller()->CreateDataChannel();
497 caller()->CreateAndSetAndSignalOffer();
498 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
499 // Caller data channel should already exist (it created one). Callee data
500 // channel may not exist yet, since negotiation happens in-band, not in SDP.
501 ASSERT_NE(nullptr, caller()->data_channel());
502 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
503 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
504 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
505 // Ensure data can be sent in both directions.
506 std::string data = "hello world";
507 caller()->data_channel()->Send(DataBuffer(data));
508 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
509 kDefaultTimeout);
510 callee()->data_channel()->Send(DataBuffer(data));
511 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
512 kDefaultTimeout);
513}
514
515// Set up a connection initially just using SCTP data channels, later upgrading
516// to audio/video, ensuring frames are received end-to-end. Effectively the
517// inverse of the test above.
518// This was broken in M57; see https://crbug.com/711243
519TEST_P(DataChannelIntegrationTest, SctpDataChannelToAudioVideoUpgrade) {
520 ASSERT_TRUE(CreatePeerConnectionWrappers());
521 ConnectFakeSignaling();
522 // Do initial offer/answer with just data channel.
523 caller()->CreateDataChannel();
524 caller()->CreateAndSetAndSignalOffer();
525 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
526 // Wait until data can be sent over the data channel.
527 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
528 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
529 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
530
531 // Do subsequent offer/answer with two-way audio and video. Audio and video
532 // should end up bundled on the DTLS/ICE transport already used for data.
533 caller()->AddAudioVideoTracks();
534 callee()->AddAudioVideoTracks();
535 caller()->CreateAndSetAndSignalOffer();
536 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
537 MediaExpectations media_expectations;
538 media_expectations.ExpectBidirectionalAudioAndVideo();
539 ASSERT_TRUE(ExpectNewFrames(media_expectations));
540}
541
542static void MakeSpecCompliantSctpOffer(cricket::SessionDescription* desc) {
543 cricket::SctpDataContentDescription* dcd_offer =
544 GetFirstSctpDataContentDescription(desc);
545 // See https://crbug.com/webrtc/11211 - this function is a no-op
546 ASSERT_TRUE(dcd_offer);
547 dcd_offer->set_use_sctpmap(false);
548 dcd_offer->set_protocol("UDP/DTLS/SCTP");
549}
550
551// Test that the data channel works when a spec-compliant SCTP m= section is
552// offered (using "a=sctp-port" instead of "a=sctpmap", and using
553// "UDP/DTLS/SCTP" as the protocol).
554TEST_P(DataChannelIntegrationTest,
555 DataChannelWorksWhenSpecCompliantSctpOfferReceived) {
556 ASSERT_TRUE(CreatePeerConnectionWrappers());
557 ConnectFakeSignaling();
558 caller()->CreateDataChannel();
559 caller()->SetGeneratedSdpMunger(MakeSpecCompliantSctpOffer);
560 caller()->CreateAndSetAndSignalOffer();
561 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
562 ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
563 EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
564 EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
565
566 // Ensure data can be sent in both directions.
567 std::string data = "hello world";
568 caller()->data_channel()->Send(DataBuffer(data));
569 EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
570 kDefaultTimeout);
571 callee()->data_channel()->Send(DataBuffer(data));
572 EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
573 kDefaultTimeout);
574}
575
Harald Alvestrand39993842021-02-17 09:05:31 +0000576// Test that after closing PeerConnections, they stop sending any packets (ICE,
577// DTLS, RTP...).
578TEST_P(DataChannelIntegrationTest, ClosingConnectionStopsPacketFlow) {
579 // Set up audio/video/data, wait for some frames to be received.
580 ASSERT_TRUE(CreatePeerConnectionWrappers());
581 ConnectFakeSignaling();
582 caller()->AddAudioVideoTracks();
Harald Alvestrand39993842021-02-17 09:05:31 +0000583 caller()->CreateDataChannel();
Harald Alvestrand39993842021-02-17 09:05:31 +0000584 caller()->CreateAndSetAndSignalOffer();
585 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
586 MediaExpectations media_expectations;
587 media_expectations.CalleeExpectsSomeAudioAndVideo();
588 ASSERT_TRUE(ExpectNewFrames(media_expectations));
589 // Close PeerConnections.
590 ClosePeerConnections();
591 // Pump messages for a second, and ensure no new packets end up sent.
592 uint32_t sent_packets_a = virtual_socket_server()->sent_packets();
593 WAIT(false, 1000);
594 uint32_t sent_packets_b = virtual_socket_server()->sent_packets();
595 EXPECT_EQ(sent_packets_a, sent_packets_b);
596}
597
Harald Alvestrand321ec3b2022-02-10 13:42:18 +0000598TEST_P(DataChannelIntegrationTest, DtlsRoleIsSetNormally) {
599 ASSERT_TRUE(CreatePeerConnectionWrappers());
600 ConnectFakeSignaling();
601 caller()->CreateDataChannel();
602 ASSERT_FALSE(caller()->pc()->GetSctpTransport());
603 caller()->CreateAndSetAndSignalOffer();
604 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
605 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
606 ASSERT_TRUE(caller()->pc()->GetSctpTransport());
607 ASSERT_TRUE(
608 caller()->pc()->GetSctpTransport()->Information().dtls_transport());
609 EXPECT_TRUE(caller()
610 ->pc()
611 ->GetSctpTransport()
612 ->Information()
613 .dtls_transport()
614 ->Information()
615 .role());
616 EXPECT_EQ(caller()
617 ->pc()
618 ->GetSctpTransport()
619 ->Information()
620 .dtls_transport()
621 ->Information()
622 .role(),
623 DtlsTransportTlsRole::kServer);
624 EXPECT_EQ(callee()
625 ->pc()
626 ->GetSctpTransport()
627 ->Information()
628 .dtls_transport()
629 ->Information()
630 .role(),
631 DtlsTransportTlsRole::kClient);
632 // ID should be assigned according to the odd/even rule based on role; client
633 // gets even numbers, server gets odd ones.
634 // RFC 8832 section 6.
635 // TODO(hta): Test multiple channels.
636 EXPECT_EQ(caller()->data_channel()->id(), 1);
637}
638
639TEST_P(DataChannelIntegrationTest, DtlsRoleIsSetWhenReversed) {
640 ASSERT_TRUE(CreatePeerConnectionWrappers());
641 ConnectFakeSignaling();
642 caller()->CreateDataChannel();
643 callee()->SetReceivedSdpMunger(MakeActiveSctpOffer);
644 caller()->CreateAndSetAndSignalOffer();
645 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
646 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
647 EXPECT_TRUE(caller()
648 ->pc()
649 ->GetSctpTransport()
650 ->Information()
651 .dtls_transport()
652 ->Information()
653 .role());
654 EXPECT_EQ(caller()
655 ->pc()
656 ->GetSctpTransport()
657 ->Information()
658 .dtls_transport()
659 ->Information()
660 .role(),
661 DtlsTransportTlsRole::kClient);
662 EXPECT_EQ(callee()
663 ->pc()
664 ->GetSctpTransport()
665 ->Information()
666 .dtls_transport()
667 ->Information()
668 .role(),
669 DtlsTransportTlsRole::kServer);
670 // ID should be assigned according to the odd/even rule based on role; client
671 // gets even numbers, server gets odd ones.
672 // RFC 8832 section 6.
673 // TODO(hta): Test multiple channels.
674 EXPECT_EQ(caller()->data_channel()->id(), 0);
675}
676
Harald Alvestrand06c87a12022-02-11 13:12:16 +0000677TEST_P(DataChannelIntegrationTest,
678 DtlsRoleIsSetWhenReversedWithChannelCollision) {
679 ASSERT_TRUE(CreatePeerConnectionWrappers());
680 ConnectFakeSignaling();
681 caller()->CreateDataChannel();
682
683 callee()->SetReceivedSdpMunger([this](cricket::SessionDescription* desc) {
684 MakeActiveSctpOffer(desc);
685 callee()->CreateDataChannel();
686 });
687 caller()->CreateAndSetAndSignalOffer();
688 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
689 ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
690 ASSERT_EQ_WAIT(callee()->data_channels().size(), 2U, kDefaultTimeout);
691 ASSERT_EQ_WAIT(caller()->data_channels().size(), 2U, kDefaultTimeout);
692 EXPECT_TRUE(caller()
693 ->pc()
694 ->GetSctpTransport()
695 ->Information()
696 .dtls_transport()
697 ->Information()
698 .role());
699 EXPECT_EQ(caller()
700 ->pc()
701 ->GetSctpTransport()
702 ->Information()
703 .dtls_transport()
704 ->Information()
705 .role(),
706 DtlsTransportTlsRole::kClient);
707 EXPECT_EQ(callee()
708 ->pc()
709 ->GetSctpTransport()
710 ->Information()
711 .dtls_transport()
712 ->Information()
713 .role(),
714 DtlsTransportTlsRole::kServer);
715 // ID should be assigned according to the odd/even rule based on role; client
716 // gets even numbers, server gets odd ones.
717 // RFC 8832 section 6.
718 ASSERT_EQ(caller()->data_channels().size(), 2U);
719 ASSERT_EQ(callee()->data_channels().size(), 2U);
720 EXPECT_EQ(caller()->data_channels()[0]->id(), 0);
721 EXPECT_EQ(caller()->data_channels()[1]->id(), 1);
722 EXPECT_EQ(callee()->data_channels()[0]->id(), 1);
723 EXPECT_EQ(callee()->data_channels()[1]->id(), 0);
724}
725
Harald Alvestrand39993842021-02-17 09:05:31 +0000726// Test that transport stats are generated by the RTCStatsCollector for a
727// connection that only involves data channels. This is a regression test for
728// crbug.com/826972.
Harald Alvestrand39993842021-02-17 09:05:31 +0000729TEST_P(DataChannelIntegrationTest,
730 TransportStatsReportedForDataChannelOnlyConnection) {
731 ASSERT_TRUE(CreatePeerConnectionWrappers());
732 ConnectFakeSignaling();
733 caller()->CreateDataChannel();
734
735 caller()->CreateAndSetAndSignalOffer();
736 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
737 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
738
739 auto caller_report = caller()->NewGetStats();
740 EXPECT_EQ(1u, caller_report->GetStatsOfType<RTCTransportStats>().size());
741 auto callee_report = callee()->NewGetStats();
742 EXPECT_EQ(1u, callee_report->GetStatsOfType<RTCTransportStats>().size());
743}
744
Harald Alvestrandfeb6eb92021-04-21 18:52:32 +0000745TEST_P(DataChannelIntegrationTest, QueuedPacketsGetDeliveredInReliableMode) {
746 CreatePeerConnectionWrappers();
747 ConnectFakeSignaling();
748 caller()->CreateDataChannel();
749 caller()->CreateAndSetAndSignalOffer();
750 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
751 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
752
753 caller()->data_channel()->Send(DataBuffer("hello first"));
754 ASSERT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(),
755 kDefaultTimeout);
756 // Cause a temporary network outage
757 virtual_socket_server()->set_drop_probability(1.0);
758 for (int i = 1; i <= 10; i++) {
759 caller()->data_channel()->Send(DataBuffer("Sent while blocked"));
760 }
761 // Nothing should be delivered during outage. Short wait.
762 EXPECT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(), 10);
763 // Reverse outage
764 virtual_socket_server()->set_drop_probability(0.0);
765 // All packets should be delivered.
766 EXPECT_EQ_WAIT(11u, callee()->data_observer()->received_message_count(),
767 kDefaultTimeout);
768}
769
Harald Alvestrand86bd92f2021-05-19 16:17:04 +0000770TEST_P(DataChannelIntegrationTest, QueuedPacketsGetDroppedInUnreliableMode) {
Harald Alvestrandfeb6eb92021-04-21 18:52:32 +0000771 CreatePeerConnectionWrappers();
772 ConnectFakeSignaling();
773 DataChannelInit init;
774 init.maxRetransmits = 0;
775 init.ordered = false;
776 caller()->CreateDataChannel(&init);
777 caller()->CreateAndSetAndSignalOffer();
778 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
779 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
780 caller()->data_channel()->Send(DataBuffer("hello first"));
781 ASSERT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(),
782 kDefaultTimeout);
783 // Cause a temporary network outage
784 virtual_socket_server()->set_drop_probability(1.0);
Harald Alvestrand86bd92f2021-05-19 16:17:04 +0000785 // Send a few packets. Note that all get dropped only when all packets
786 // fit into the receiver receive window/congestion window, so that they
787 // actually get sent.
Harald Alvestrandfeb6eb92021-04-21 18:52:32 +0000788 for (int i = 1; i <= 10; i++) {
789 caller()->data_channel()->Send(DataBuffer("Sent while blocked"));
790 }
791 // Nothing should be delivered during outage.
792 // We do a short wait to verify that delivery count is still 1.
793 WAIT(false, 10);
794 EXPECT_EQ(1u, callee()->data_observer()->received_message_count());
795 // Reverse the network outage.
796 virtual_socket_server()->set_drop_probability(0.0);
797 // Send a new packet, and wait for it to be delivered.
798 caller()->data_channel()->Send(DataBuffer("After block"));
799 EXPECT_EQ_WAIT("After block", callee()->data_observer()->last_message(),
800 kDefaultTimeout);
801 // Some messages should be lost, but first and last message should have
802 // been delivered.
803 // First, check that the protocol guarantee is preserved.
804 EXPECT_GT(11u, callee()->data_observer()->received_message_count());
805 EXPECT_LE(2u, callee()->data_observer()->received_message_count());
806 // Then, check that observed behavior (lose all messages) has not changed
807 EXPECT_EQ(2u, callee()->data_observer()->received_message_count());
808}
809
Harald Alvestrand86bd92f2021-05-19 16:17:04 +0000810TEST_P(DataChannelIntegrationTest,
811 QueuedPacketsGetDroppedInLifetimeLimitedMode) {
812 CreatePeerConnectionWrappers();
813 ConnectFakeSignaling();
814 DataChannelInit init;
815 init.maxRetransmitTime = 1;
816 init.ordered = false;
817 caller()->CreateDataChannel(&init);
818 caller()->CreateAndSetAndSignalOffer();
819 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
820 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
821 caller()->data_channel()->Send(DataBuffer("hello first"));
822 ASSERT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(),
823 kDefaultTimeout);
824 // Cause a temporary network outage
825 virtual_socket_server()->set_drop_probability(1.0);
826 for (int i = 1; i <= 200; i++) {
827 caller()->data_channel()->Send(DataBuffer("Sent while blocked"));
828 }
829 // Nothing should be delivered during outage.
830 // We do a short wait to verify that delivery count is still 1,
831 // and to make sure max packet lifetime (which is in ms) is exceeded.
832 WAIT(false, 10);
833 EXPECT_EQ(1u, callee()->data_observer()->received_message_count());
834 // Reverse the network outage.
835 virtual_socket_server()->set_drop_probability(0.0);
836 // Send a new packet, and wait for it to be delivered.
837 caller()->data_channel()->Send(DataBuffer("After block"));
838 EXPECT_EQ_WAIT("After block", callee()->data_observer()->last_message(),
839 kDefaultTimeout);
840 // Some messages should be lost, but first and last message should have
841 // been delivered.
842 // First, check that the protocol guarantee is preserved.
843 EXPECT_GT(202u, callee()->data_observer()->received_message_count());
844 EXPECT_LE(2u, callee()->data_observer()->received_message_count());
845 // Then, check that observed behavior (lose some messages) has not changed
Florent Castellif2599a72022-03-31 19:15:10 +0200846 // DcSctp loses all messages. This is correct.
847 EXPECT_EQ(2u, callee()->data_observer()->received_message_count());
Harald Alvestrand86bd92f2021-05-19 16:17:04 +0000848}
849
850TEST_P(DataChannelIntegrationTest,
Victor Boiviefe968df2022-02-01 11:26:05 +0100851 DISABLED_ON_ANDROID(SomeQueuedPacketsGetDroppedInMaxRetransmitsMode)) {
Harald Alvestrand86bd92f2021-05-19 16:17:04 +0000852 CreatePeerConnectionWrappers();
853 ConnectFakeSignaling();
854 DataChannelInit init;
855 init.maxRetransmits = 0;
856 init.ordered = false;
857 caller()->CreateDataChannel(&init);
858 caller()->CreateAndSetAndSignalOffer();
859 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
860 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
861 caller()->data_channel()->Send(DataBuffer("hello first"));
862 ASSERT_EQ_WAIT(1u, callee()->data_observer()->received_message_count(),
863 kDefaultTimeout);
864 // Cause a temporary network outage
865 virtual_socket_server()->set_drop_probability(1.0);
866 // Fill the buffer until queued data starts to build
867 size_t packet_counter = 0;
868 while (caller()->data_channel()->buffered_amount() < 1 &&
869 packet_counter < 10000) {
870 packet_counter++;
871 caller()->data_channel()->Send(DataBuffer("Sent while blocked"));
872 }
873 if (caller()->data_channel()->buffered_amount()) {
874 RTC_LOG(LS_INFO) << "Buffered data after " << packet_counter << " packets";
875 } else {
876 RTC_LOG(LS_INFO) << "No buffered data after " << packet_counter
877 << " packets";
878 }
879 // Nothing should be delivered during outage.
880 // We do a short wait to verify that delivery count is still 1.
881 WAIT(false, 10);
882 EXPECT_EQ(1u, callee()->data_observer()->received_message_count());
883 // Reverse the network outage.
884 virtual_socket_server()->set_drop_probability(0.0);
885 // Send a new packet, and wait for it to be delivered.
886 caller()->data_channel()->Send(DataBuffer("After block"));
887 EXPECT_EQ_WAIT("After block", callee()->data_observer()->last_message(),
888 kDefaultTimeout);
889 // Some messages should be lost, but first and last message should have
890 // been delivered.
891 // Due to the fact that retransmissions are only counted when the packet
892 // goes on the wire, NOT when they are stalled in queue due to
893 // congestion, we expect some of the packets to be delivered, because
894 // congestion prevented them from being sent.
895 // Citation: https://tools.ietf.org/html/rfc7496#section-3.1
896
897 // First, check that the protocol guarantee is preserved.
898 EXPECT_GT(packet_counter,
899 callee()->data_observer()->received_message_count());
900 EXPECT_LE(2u, callee()->data_observer()->received_message_count());
901 // Then, check that observed behavior (lose between 100 and 200 messages)
902 // has not changed.
903 // Usrsctp behavior is different on Android (177) and other platforms (122).
904 // Dcsctp loses 432 packets.
905 EXPECT_GT(2 + packet_counter - 100,
906 callee()->data_observer()->received_message_count());
907 EXPECT_LT(2 + packet_counter - 500,
908 callee()->data_observer()->received_message_count());
909}
910
Florent Castellif2599a72022-03-31 19:15:10 +0200911INSTANTIATE_TEST_SUITE_P(DataChannelIntegrationTest,
912 DataChannelIntegrationTest,
913 Values(SdpSemantics::kPlanB,
914 SdpSemantics::kUnifiedPlan));
Harald Alvestrand39993842021-02-17 09:05:31 +0000915
Harald Alvestrand39993842021-02-17 09:05:31 +0000916TEST_F(DataChannelIntegrationTestUnifiedPlan,
917 EndToEndCallWithBundledSctpDataChannel) {
918 ASSERT_TRUE(CreatePeerConnectionWrappers());
919 ConnectFakeSignaling();
920 caller()->CreateDataChannel();
921 caller()->AddAudioVideoTracks();
922 callee()->AddAudioVideoTracks();
923 caller()->CreateAndSetAndSignalOffer();
924 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000925 ASSERT_TRUE_WAIT(caller()->pc()->GetSctpTransport(), kDefaultTimeout);
926 ASSERT_EQ_WAIT(SctpTransportState::kConnected,
927 caller()->pc()->GetSctpTransport()->Information().state(),
928 kDefaultTimeout);
Harald Alvestrand39993842021-02-17 09:05:31 +0000929 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
930 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
931}
932
933TEST_F(DataChannelIntegrationTestUnifiedPlan,
934 EndToEndCallWithDataChannelOnlyConnects) {
935 ASSERT_TRUE(CreatePeerConnectionWrappers());
936 ConnectFakeSignaling();
937 caller()->CreateDataChannel();
938 caller()->CreateAndSetAndSignalOffer();
939 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
940 ASSERT_TRUE_WAIT(callee()->data_channel(), kDefaultTimeout);
941 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
942 ASSERT_TRUE(caller()->data_observer()->IsOpen());
943}
944
945TEST_F(DataChannelIntegrationTestUnifiedPlan, DataChannelClosesWhenClosed) {
946 ASSERT_TRUE(CreatePeerConnectionWrappers());
947 ConnectFakeSignaling();
948 caller()->CreateDataChannel();
949 caller()->CreateAndSetAndSignalOffer();
950 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
951 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
952 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
953 caller()->data_channel()->Close();
954 ASSERT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
955}
956
957TEST_F(DataChannelIntegrationTestUnifiedPlan,
958 DataChannelClosesWhenClosedReverse) {
959 ASSERT_TRUE(CreatePeerConnectionWrappers());
960 ConnectFakeSignaling();
961 caller()->CreateDataChannel();
962 caller()->CreateAndSetAndSignalOffer();
963 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
964 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
965 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
966 callee()->data_channel()->Close();
967 ASSERT_TRUE_WAIT(!caller()->data_observer()->IsOpen(), kDefaultTimeout);
968}
969
970TEST_F(DataChannelIntegrationTestUnifiedPlan,
971 DataChannelClosesWhenPeerConnectionClosed) {
972 ASSERT_TRUE(CreatePeerConnectionWrappers());
973 ConnectFakeSignaling();
974 caller()->CreateDataChannel();
975 caller()->CreateAndSetAndSignalOffer();
976 ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
977 ASSERT_TRUE_WAIT(callee()->data_observer(), kDefaultTimeout);
978 ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
979 caller()->pc()->Close();
980 ASSERT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
981}
982
983#endif // WEBRTC_HAVE_SCTP
984
985} // namespace
986
987} // namespace webrtc