blob: a27a66c3de6646cfca69de39bcdde352f1e27fd5 [file] [log] [blame]
wu@webrtc.orgd64719d2013-08-01 00:00:071/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
wu@webrtc.orgd64719d2013-08-01 00:00:073 *
kjellanderb24317b2016-02-10 15:54:434 * 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.
wu@webrtc.orgd64719d2013-08-01 00:00:079 */
10
Harald Alvestrandc24a2182022-02-23 13:44:5911#include <stdint.h>
Yves Gerey3e707812018-11-28 15:47:4912#include <string.h>
Jonas Olssona4d87372019-07-05 17:08:3313
kwibergd1fe2812016-04-27 13:47:2914#include <memory>
Harald Alvestrandc24a2182022-02-23 13:44:5915#include <string>
Steve Anton36b29d12017-10-30 16:57:4216#include <vector>
kwibergd1fe2812016-04-27 13:47:2917
Harald Alvestrandc24a2182022-02-23 13:44:5918#include "api/data_channel_interface.h"
19#include "api/rtc_error.h"
20#include "api/scoped_refptr.h"
21#include "api/transport/data_channel_transport_interface.h"
22#include "media/base/media_channel.h"
Florent Castellidcb9ffc2021-06-29 12:58:2323#include "media/sctp/sctp_transport_internal.h"
Taylor Brandstetter3a034e12020-07-09 22:32:3424#include "pc/sctp_data_channel.h"
Steve Anton10542f22019-01-11 17:11:0025#include "pc/sctp_utils.h"
Harald Alvestrand9e5aeb92022-05-11 09:35:3626#include "pc/test/fake_data_channel_controller.h"
Harald Alvestrandc24a2182022-02-23 13:44:5927#include "rtc_base/copy_on_write_buffer.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3128#include "rtc_base/gunit.h"
Tommi55f72802023-03-27 10:39:3329#include "rtc_base/null_socket_server.h"
Harald Alvestrandc24a2182022-02-23 13:44:5930#include "rtc_base/ssl_stream_adapter.h"
Harald Alvestrandc24a2182022-02-23 13:44:5931#include "rtc_base/thread.h"
Yves Gerey3e707812018-11-28 15:47:4932#include "test/gtest.h"
Tommi55f72802023-03-27 10:39:3333#include "test/run_loop.h"
wu@webrtc.orgd64719d2013-08-01 00:00:0734
Tommia50a81a2023-04-11 15:32:3435#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
36#include "test/testsupport/rtc_expect_death.h"
37#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
38
Tommi492296c2023-03-12 15:59:2539namespace webrtc {
40
41namespace {
wu@webrtc.orgd64719d2013-08-01 00:00:0742
Taylor Brandstetter4cb5b642016-08-12 17:10:3143static constexpr int kDefaultTimeout = 10000;
44
Tommi492296c2023-03-12 15:59:2545class FakeDataChannelObserver : public DataChannelObserver {
sergeyu@chromium.orga23f0ca2013-11-13 22:48:5246 public:
Tommia13b4d12023-04-05 15:17:1747 FakeDataChannelObserver() { RTC_DCHECK(!IsOkToCallOnTheNetworkThread()); }
jiayl@webrtc.org5dc51fb2014-05-29 15:33:5448
Tommia13b4d12023-04-05 15:17:1749 void OnStateChange() override { ++on_state_change_count_; }
jiayl@webrtc.org9f8164c2014-05-30 21:53:1750
Tommia13b4d12023-04-05 15:17:1751 void OnBufferedAmountChange(uint64_t previous_amount) override {
bemasc0edd50c2015-07-01 20:34:3352 ++on_buffered_amount_change_count_;
53 }
54
Tommia13b4d12023-04-05 15:17:1755 void OnMessage(const DataBuffer& buffer) override { ++messages_received_; }
jiayl@webrtc.org5dc51fb2014-05-29 15:33:5456
Yves Gerey665174f2018-06-19 13:03:0557 size_t messages_received() const { return messages_received_; }
jiayl@webrtc.org5dc51fb2014-05-29 15:33:5458
Yves Gerey665174f2018-06-19 13:03:0559 void ResetOnStateChangeCount() { on_state_change_count_ = 0; }
jiayl@webrtc.org9f8164c2014-05-30 21:53:1760
bemasc0edd50c2015-07-01 20:34:3361 void ResetOnBufferedAmountChangeCount() {
62 on_buffered_amount_change_count_ = 0;
63 }
64
Yves Gerey665174f2018-06-19 13:03:0565 size_t on_state_change_count() const { return on_state_change_count_; }
jiayl@webrtc.org9f8164c2014-05-30 21:53:1766
bemasc0edd50c2015-07-01 20:34:3367 size_t on_buffered_amount_change_count() const {
68 return on_buffered_amount_change_count_;
69 }
70
jiayl@webrtc.org5dc51fb2014-05-29 15:33:5471 private:
Tommia13b4d12023-04-05 15:17:1772 size_t messages_received_ = 0u;
73 size_t on_state_change_count_ = 0u;
74 size_t on_buffered_amount_change_count_ = 0u;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:5275};
76
Mirko Bonadei6a489f22019-04-09 13:11:1277class SctpDataChannelTest : public ::testing::Test {
wu@webrtc.orgd64719d2013-08-01 00:00:0778 protected:
79 SctpDataChannelTest()
Tommi55f72802023-03-27 10:39:3380 : network_thread_(std::make_unique<rtc::NullSocketServer>()),
Tommi4f7ade52023-03-29 18:46:5981 controller_(new FakeDataChannelController(&network_thread_)) {
Tommi55f72802023-03-27 10:39:3382 network_thread_.Start();
Tommi80558f42023-03-31 09:07:3183 inner_channel_ = controller_->CreateDataChannel("test", init_);
Harald Alvestranda6544372023-11-13 09:33:5684 channel_ = SctpDataChannel::CreateProxy(inner_channel_, signaling_safety_);
Tommi55f72802023-03-27 10:39:3385 }
86 ~SctpDataChannelTest() override {
87 run_loop_.Flush();
Tommif9e13f82023-04-06 19:21:4588 signaling_safety_->SetNotAlive();
Tommi80558f42023-03-31 09:07:3189 inner_channel_ = nullptr;
90 channel_ = nullptr;
91 controller_.reset();
92 observer_.reset();
Tommi55f72802023-03-27 10:39:3393 network_thread_.Stop();
94 }
wu@webrtc.orgd64719d2013-08-01 00:00:0795
wu@webrtc.org78187522013-10-07 23:32:0296 void SetChannelReady() {
Harald Alvestrand9e5aeb92022-05-11 09:35:3697 controller_->set_transport_available(true);
Tommif9e13f82023-04-06 19:21:4598 StreamId sid(0);
99 network_thread_.BlockingCall([&]() {
100 RTC_DCHECK_RUN_ON(&network_thread_);
101 if (!inner_channel_->sid_n().HasValue()) {
102 inner_channel_->SetSctpSid_n(sid);
103 controller_->AddSctpDataStream(sid);
104 }
105 inner_channel_->OnTransportChannelCreated();
106 });
Harald Alvestrand9e5aeb92022-05-11 09:35:36107 controller_->set_ready_to_send(true);
Tommif9e13f82023-04-06 19:21:45108 run_loop_.Flush();
wu@webrtc.orgd64719d2013-08-01 00:00:07109 }
wu@webrtc.org78187522013-10-07 23:32:02110
Tommi4f7ade52023-03-29 18:46:59111 // TODO(bugs.webrtc.org/11547): This mirrors what the DataChannelController
112 // currently does when assigning stream ids to a channel. Right now the sid
113 // in the SctpDataChannel code is (still) tied to the signaling thread, but
114 // the `AddSctpDataStream` operation is a bridge to the transport and needs
115 // to run on the network thread.
116 void SetChannelSid(const rtc::scoped_refptr<SctpDataChannel>& channel,
117 StreamId sid) {
118 RTC_DCHECK(sid.HasValue());
Tommif9e13f82023-04-06 19:21:45119 network_thread_.BlockingCall([&]() {
120 channel->SetSctpSid_n(sid);
121 controller_->AddSctpDataStream(sid);
122 });
Tommi4f7ade52023-03-29 18:46:59123 }
124
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52125 void AddObserver() {
126 observer_.reset(new FakeDataChannelObserver());
Tommi80558f42023-03-31 09:07:31127 channel_->RegisterObserver(observer_.get());
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52128 }
129
Tommia50a81a2023-04-11 15:32:34130 // Wait for queued up methods to run on the network thread.
131 void FlushNetworkThread() {
132 RTC_DCHECK_RUN_ON(run_loop_.task_queue());
133 network_thread_.BlockingCall([] {});
134 }
135
136 // Used to complete pending methods on the network thread
137 // that might queue up methods on the signaling (main) thread
138 // that are run too.
139 void FlushNetworkThreadAndPendingOperations() {
140 FlushNetworkThread();
141 run_loop_.Flush();
142 }
143
Tommi55f72802023-03-27 10:39:33144 test::RunLoop run_loop_;
145 rtc::Thread network_thread_;
Tommi492296c2023-03-12 15:59:25146 InternalDataChannelInit init_;
Tommif9e13f82023-04-06 19:21:45147 rtc::scoped_refptr<PendingTaskSafetyFlag> signaling_safety_ =
148 PendingTaskSafetyFlag::Create();
Harald Alvestrand9e5aeb92022-05-11 09:35:36149 std::unique_ptr<FakeDataChannelController> controller_;
kwibergd1fe2812016-04-27 13:47:29150 std::unique_ptr<FakeDataChannelObserver> observer_;
Tommi80558f42023-03-31 09:07:31151 rtc::scoped_refptr<SctpDataChannel> inner_channel_;
152 rtc::scoped_refptr<DataChannelInterface> channel_;
wu@webrtc.orgd64719d2013-08-01 00:00:07153};
154
Tommi492296c2023-03-12 15:59:25155TEST_F(SctpDataChannelTest, VerifyConfigurationGetters) {
Tommi80558f42023-03-31 09:07:31156 EXPECT_EQ(channel_->label(), "test");
157 EXPECT_EQ(channel_->protocol(), init_.protocol);
Tommi492296c2023-03-12 15:59:25158
159 // Note that the `init_.reliable` field is deprecated, so we directly set
160 // it here to match spec behavior for purposes of checking the `reliable()`
161 // getter.
162 init_.reliable = (!init_.maxRetransmits && !init_.maxRetransmitTime);
Tommi80558f42023-03-31 09:07:31163 EXPECT_EQ(channel_->reliable(), init_.reliable);
164 EXPECT_EQ(channel_->ordered(), init_.ordered);
165 EXPECT_EQ(channel_->negotiated(), init_.negotiated);
166 EXPECT_EQ(channel_->priority(), Priority::kLow);
167 EXPECT_EQ(channel_->maxRetransmitTime(), static_cast<uint16_t>(-1));
168 EXPECT_EQ(channel_->maxPacketLifeTime(), init_.maxRetransmitTime);
169 EXPECT_EQ(channel_->maxRetransmits(), static_cast<uint16_t>(-1));
170 EXPECT_EQ(channel_->maxRetransmitsOpt(), init_.maxRetransmits);
Tommi492296c2023-03-12 15:59:25171
172 // Check the non-const part of the configuration.
Tommi80558f42023-03-31 09:07:31173 EXPECT_EQ(channel_->id(), init_.id);
Tommif9e13f82023-04-06 19:21:45174 network_thread_.BlockingCall(
175 [&]() { EXPECT_EQ(inner_channel_->sid_n(), StreamId()); });
Tommi492296c2023-03-12 15:59:25176
177 SetChannelReady();
Tommi80558f42023-03-31 09:07:31178 EXPECT_EQ(channel_->id(), 0);
Tommif9e13f82023-04-06 19:21:45179 network_thread_.BlockingCall(
180 [&]() { EXPECT_EQ(inner_channel_->sid_n(), StreamId(0)); });
Tommi492296c2023-03-12 15:59:25181}
182
wu@webrtc.orgcecfd182013-10-30 05:18:12183// Verifies that the data channel is connected to the transport after creation.
184TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
Harald Alvestrand9e5aeb92022-05-11 09:35:36185 controller_->set_transport_available(true);
Taylor Brandstetter3a034e12020-07-09 22:32:34186 rtc::scoped_refptr<SctpDataChannel> dc =
Tommie9aa8672023-03-20 13:43:09187 controller_->CreateDataChannel("test1", init_);
Andrey Logvin7f16fcd2023-04-05 08:53:13188 EXPECT_TRUE(controller_->IsConnected(dc.get()));
Tommif9e13f82023-04-06 19:21:45189
wu@webrtc.org07a6fbe2013-11-04 18:41:34190 // The sid is not set yet, so it should not have added the streams.
Tommif9e13f82023-04-06 19:21:45191 StreamId sid = network_thread_.BlockingCall([&]() { return dc->sid_n(); });
192 EXPECT_FALSE(controller_->IsStreamAdded(sid));
wu@webrtc.org07a6fbe2013-11-04 18:41:34193
Tommi4f7ade52023-03-29 18:46:59194 SetChannelSid(dc, StreamId(0));
Tommif9e13f82023-04-06 19:21:45195 sid = network_thread_.BlockingCall([&]() { return dc->sid_n(); });
196 EXPECT_TRUE(controller_->IsStreamAdded(sid));
wu@webrtc.orgcecfd182013-10-30 05:18:12197}
198
wu@webrtc.org78187522013-10-07 23:32:02199// Tests the state of the data channel.
200TEST_F(SctpDataChannelTest, StateTransition) {
Tommi51edb562023-03-14 08:23:51201 AddObserver();
202
Tommi80558f42023-03-31 09:07:31203 EXPECT_EQ(DataChannelInterface::kConnecting, channel_->state());
Tommi51edb562023-03-14 08:23:51204 EXPECT_EQ(observer_->on_state_change_count(), 0u);
wu@webrtc.org78187522013-10-07 23:32:02205 SetChannelReady();
wu@webrtc.org07a6fbe2013-11-04 18:41:34206
Tommi80558f42023-03-31 09:07:31207 EXPECT_EQ(DataChannelInterface::kOpen, channel_->state());
Tommi51edb562023-03-14 08:23:51208 EXPECT_EQ(observer_->on_state_change_count(), 1u);
Tommid2afbaf2023-03-02 09:51:16209
Tommi51edb562023-03-14 08:23:51210 // `Close()` should trigger two state changes, first `kClosing`, then
211 // `kClose`.
Tommi80558f42023-03-31 09:07:31212 channel_->Close();
Tommi55f72802023-03-27 10:39:33213 // The (simulated) transport close notifications runs on the network thread
214 // and posts a completion notification to the signaling (current) thread.
Tommif9e13f82023-04-06 19:21:45215 // Allow that operation to complete before checking the state.
Tommi55f72802023-03-27 10:39:33216 run_loop_.Flush();
Tommi80558f42023-03-31 09:07:31217 EXPECT_EQ(DataChannelInterface::kClosed, channel_->state());
Tommi51edb562023-03-14 08:23:51218 EXPECT_EQ(observer_->on_state_change_count(), 3u);
Tommi80558f42023-03-31 09:07:31219 EXPECT_TRUE(channel_->error().ok());
wu@webrtc.orgcecfd182013-10-30 05:18:12220 // Verifies that it's disconnected from the transport.
Tommi80558f42023-03-31 09:07:31221 EXPECT_FALSE(controller_->IsConnected(inner_channel_.get()));
wu@webrtc.org78187522013-10-07 23:32:02222}
223
wu@webrtc.orgd64719d2013-08-01 00:00:07224// Tests that DataChannel::buffered_amount() is correct after the channel is
225// blocked.
226TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
bemasc0edd50c2015-07-01 20:34:33227 AddObserver();
wu@webrtc.org78187522013-10-07 23:32:02228 SetChannelReady();
Tommi492296c2023-03-12 15:59:25229 DataBuffer buffer("abcd");
Tommia50a81a2023-04-11 15:32:34230 size_t successful_sends = 0;
231 auto send_complete = [&](RTCError err) {
232 EXPECT_TRUE(err.ok());
233 ++successful_sends;
234 };
235 channel_->SendAsync(buffer, send_complete);
236 FlushNetworkThreadAndPendingOperations();
237 EXPECT_EQ(channel_->buffered_amount(), 0u);
238 size_t successful_send_count = 1;
239 EXPECT_EQ(successful_send_count, successful_sends);
240 EXPECT_EQ(successful_send_count,
241 observer_->on_buffered_amount_change_count());
242
243 controller_->set_send_blocked(true);
244 const int number_of_packets = 3;
245 for (int i = 0; i < number_of_packets; ++i) {
246 channel_->SendAsync(buffer, send_complete);
247 ++successful_send_count;
248 }
249 FlushNetworkThreadAndPendingOperations();
250 EXPECT_EQ(buffer.data.size() * number_of_packets,
251 channel_->buffered_amount());
252 EXPECT_EQ(successful_send_count, successful_sends);
253
254 // An event should not have been fired for buffered amount.
255 EXPECT_EQ(1u, observer_->on_buffered_amount_change_count());
256
257 // Now buffered amount events should get fired and the value
258 // get down to 0u.
259 controller_->set_send_blocked(false);
260 run_loop_.Flush();
261 EXPECT_EQ(channel_->buffered_amount(), 0u);
262 EXPECT_EQ(successful_send_count, successful_sends);
263 EXPECT_EQ(successful_send_count,
264 observer_->on_buffered_amount_change_count());
265}
266
267// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
268TEST_F(SctpDataChannelTest, DeprecatedBufferedAmountWhenBlocked) {
269 AddObserver();
270 SetChannelReady();
271 DataBuffer buffer("abcd");
Tommi80558f42023-03-31 09:07:31272 EXPECT_TRUE(channel_->Send(buffer));
Marina Cioceae448a3f2019-03-04 14:52:21273 size_t successful_send_count = 1;
wu@webrtc.orgd64719d2013-08-01 00:00:07274
Tommif9e13f82023-04-06 19:21:45275 run_loop_.Flush();
Tommi80558f42023-03-31 09:07:31276 EXPECT_EQ(0U, channel_->buffered_amount());
Marina Cioceae448a3f2019-03-04 14:52:21277 EXPECT_EQ(successful_send_count,
278 observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07279
Harald Alvestrand9e5aeb92022-05-11 09:35:36280 controller_->set_send_blocked(true);
wu@webrtc.org78187522013-10-07 23:32:02281
wu@webrtc.orgd64719d2013-08-01 00:00:07282 const int number_of_packets = 3;
283 for (int i = 0; i < number_of_packets; ++i) {
Tommi80558f42023-03-31 09:07:31284 EXPECT_TRUE(channel_->Send(buffer));
wu@webrtc.orgd64719d2013-08-01 00:00:07285 }
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06286 EXPECT_EQ(buffer.data.size() * number_of_packets,
Tommi80558f42023-03-31 09:07:31287 channel_->buffered_amount());
Marina Cioceae448a3f2019-03-04 14:52:21288 EXPECT_EQ(successful_send_count,
289 observer_->on_buffered_amount_change_count());
290
Harald Alvestrand9e5aeb92022-05-11 09:35:36291 controller_->set_send_blocked(false);
Tommif9e13f82023-04-06 19:21:45292 run_loop_.Flush();
Marina Cioceae448a3f2019-03-04 14:52:21293 successful_send_count += number_of_packets;
Tommia50a81a2023-04-11 15:32:34294 EXPECT_EQ(channel_->buffered_amount(), 0u);
Marina Cioceae448a3f2019-03-04 14:52:21295 EXPECT_EQ(successful_send_count,
Mirko Bonadeie12c1fe2018-07-03 10:53:23296 observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07297}
298
299// Tests that the queued data are sent when the channel transitions from blocked
300// to unblocked.
301TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
bemasc0edd50c2015-07-01 20:34:33302 AddObserver();
wu@webrtc.org78187522013-10-07 23:32:02303 SetChannelReady();
Tommi492296c2023-03-12 15:59:25304 DataBuffer buffer("abcd");
Harald Alvestrand9e5aeb92022-05-11 09:35:36305 controller_->set_send_blocked(true);
Tommia50a81a2023-04-11 15:32:34306 size_t successful_send = 0u;
307 auto send_complete = [&](RTCError err) {
308 EXPECT_TRUE(err.ok());
309 ++successful_send;
310 };
311 channel_->SendAsync(buffer, send_complete);
312 FlushNetworkThreadAndPendingOperations();
313 EXPECT_EQ(1U, successful_send);
314 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
315
316 controller_->set_send_blocked(false);
317 SetChannelReady();
318 EXPECT_EQ(channel_->buffered_amount(), 0u);
319 EXPECT_EQ(observer_->on_buffered_amount_change_count(), 1u);
320}
321
322// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
323TEST_F(SctpDataChannelTest, DeprecatedQueuedDataSentWhenUnblocked) {
324 AddObserver();
325 SetChannelReady();
326 DataBuffer buffer("abcd");
327 controller_->set_send_blocked(true);
Tommi80558f42023-03-31 09:07:31328 EXPECT_TRUE(channel_->Send(buffer));
wu@webrtc.orgd64719d2013-08-01 00:00:07329
Marina Cioceae448a3f2019-03-04 14:52:21330 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
bemasc0edd50c2015-07-01 20:34:33331
Harald Alvestrand9e5aeb92022-05-11 09:35:36332 controller_->set_send_blocked(false);
wu@webrtc.org78187522013-10-07 23:32:02333 SetChannelReady();
Tommi80558f42023-03-31 09:07:31334 EXPECT_EQ(0U, channel_->buffered_amount());
Marina Cioceae448a3f2019-03-04 14:52:21335 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07336}
wu@webrtc.org78187522013-10-07 23:32:02337
jiayl@webrtc.orgcceb1662015-01-22 00:55:10338// Tests that no crash when the channel is blocked right away while trying to
339// send queued data.
340TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
bemasc0edd50c2015-07-01 20:34:33341 AddObserver();
jiayl@webrtc.orgcceb1662015-01-22 00:55:10342 SetChannelReady();
Tommi492296c2023-03-12 15:59:25343 DataBuffer buffer("abcd");
Harald Alvestrand9e5aeb92022-05-11 09:35:36344 controller_->set_send_blocked(true);
Tommia50a81a2023-04-11 15:32:34345 size_t successful_send = 0u;
346 auto send_complete = [&](RTCError err) {
347 EXPECT_TRUE(err.ok());
348 ++successful_send;
349 };
350 channel_->SendAsync(buffer, send_complete);
351 FlushNetworkThreadAndPendingOperations();
352 EXPECT_EQ(1U, successful_send);
353 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
354
355 // Set channel ready while it is still blocked.
356 SetChannelReady();
357 EXPECT_EQ(buffer.size(), channel_->buffered_amount());
358 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
359
360 // Unblock the channel to send queued data again, there should be no crash.
361 controller_->set_send_blocked(false);
362 SetChannelReady();
363 EXPECT_EQ(0U, channel_->buffered_amount());
364 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
365}
366
367// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
368TEST_F(SctpDataChannelTest, DeprecatedBlockedWhenSendQueuedDataNoCrash) {
369 AddObserver();
370 SetChannelReady();
371 DataBuffer buffer("abcd");
372 controller_->set_send_blocked(true);
Tommi80558f42023-03-31 09:07:31373 EXPECT_TRUE(channel_->Send(buffer));
Marina Cioceae448a3f2019-03-04 14:52:21374 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10375
376 // Set channel ready while it is still blocked.
377 SetChannelReady();
Tommi80558f42023-03-31 09:07:31378 EXPECT_EQ(buffer.size(), channel_->buffered_amount());
Marina Cioceae448a3f2019-03-04 14:52:21379 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10380
381 // Unblock the channel to send queued data again, there should be no crash.
Harald Alvestrand9e5aeb92022-05-11 09:35:36382 controller_->set_send_blocked(false);
jiayl@webrtc.orgcceb1662015-01-22 00:55:10383 SetChannelReady();
Tommi80558f42023-03-31 09:07:31384 EXPECT_EQ(0U, channel_->buffered_amount());
Marina Cioceae448a3f2019-03-04 14:52:21385 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10386}
387
hbos84ffdee2016-10-12 21:14:39388// Tests that DataChannel::messages_sent() and DataChannel::bytes_sent() are
389// correct, sending data both while unblocked and while blocked.
390TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesSent) {
391 AddObserver();
392 SetChannelReady();
Tommi492296c2023-03-12 15:59:25393 std::vector<DataBuffer> buffers({
394 DataBuffer("message 1"),
395 DataBuffer("msg 2"),
396 DataBuffer("message three"),
397 DataBuffer("quadra message"),
398 DataBuffer("fifthmsg"),
399 DataBuffer("message of the beast"),
hbos84ffdee2016-10-12 21:14:39400 });
401
402 // Default values.
Tommi80558f42023-03-31 09:07:31403 EXPECT_EQ(0U, channel_->messages_sent());
404 EXPECT_EQ(0U, channel_->bytes_sent());
hbos84ffdee2016-10-12 21:14:39405
406 // Send three buffers while not blocked.
Harald Alvestrand9e5aeb92022-05-11 09:35:36407 controller_->set_send_blocked(false);
Tommia50a81a2023-04-11 15:32:34408 for (int i : {0, 1, 2}) {
409 channel_->SendAsync(buffers[i], nullptr);
410 }
411 FlushNetworkThreadAndPendingOperations();
412
413 size_t bytes_sent = buffers[0].size() + buffers[1].size() + buffers[2].size();
414 EXPECT_EQ_WAIT(0U, channel_->buffered_amount(), kDefaultTimeout);
415 EXPECT_EQ(3U, channel_->messages_sent());
416 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
417
418 // Send three buffers while blocked, queuing the buffers.
419 controller_->set_send_blocked(true);
420 for (int i : {3, 4, 5}) {
421 channel_->SendAsync(buffers[i], nullptr);
422 }
423 FlushNetworkThreadAndPendingOperations();
424 size_t bytes_queued =
425 buffers[3].size() + buffers[4].size() + buffers[5].size();
426 EXPECT_EQ(bytes_queued, channel_->buffered_amount());
427 EXPECT_EQ(3U, channel_->messages_sent());
428 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
429
430 // Unblock and make sure everything was sent.
431 controller_->set_send_blocked(false);
432 EXPECT_EQ_WAIT(0U, channel_->buffered_amount(), kDefaultTimeout);
433 bytes_sent += bytes_queued;
434 EXPECT_EQ(6U, channel_->messages_sent());
435 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
436}
437
438// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
439TEST_F(SctpDataChannelTest, DeprecatedVerifyMessagesAndBytesSent) {
440 AddObserver();
441 SetChannelReady();
442 std::vector<DataBuffer> buffers({
443 DataBuffer("message 1"),
444 DataBuffer("msg 2"),
445 DataBuffer("message three"),
446 DataBuffer("quadra message"),
447 DataBuffer("fifthmsg"),
448 DataBuffer("message of the beast"),
449 });
450
451 // Default values.
452 EXPECT_EQ(0U, channel_->messages_sent());
453 EXPECT_EQ(0U, channel_->bytes_sent());
454
455 // Send three buffers while not blocked.
456 controller_->set_send_blocked(false);
Tommi80558f42023-03-31 09:07:31457 EXPECT_TRUE(channel_->Send(buffers[0]));
458 EXPECT_TRUE(channel_->Send(buffers[1]));
459 EXPECT_TRUE(channel_->Send(buffers[2]));
hbos84ffdee2016-10-12 21:14:39460 size_t bytes_sent = buffers[0].size() + buffers[1].size() + buffers[2].size();
Tommi80558f42023-03-31 09:07:31461 EXPECT_EQ_WAIT(0U, channel_->buffered_amount(), kDefaultTimeout);
462 EXPECT_EQ(3U, channel_->messages_sent());
463 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
hbos84ffdee2016-10-12 21:14:39464
465 // Send three buffers while blocked, queuing the buffers.
Harald Alvestrand9e5aeb92022-05-11 09:35:36466 controller_->set_send_blocked(true);
Tommi80558f42023-03-31 09:07:31467 EXPECT_TRUE(channel_->Send(buffers[3]));
468 EXPECT_TRUE(channel_->Send(buffers[4]));
469 EXPECT_TRUE(channel_->Send(buffers[5]));
hbos84ffdee2016-10-12 21:14:39470 size_t bytes_queued =
471 buffers[3].size() + buffers[4].size() + buffers[5].size();
Tommi80558f42023-03-31 09:07:31472 EXPECT_EQ(bytes_queued, channel_->buffered_amount());
473 EXPECT_EQ(3U, channel_->messages_sent());
474 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
hbos84ffdee2016-10-12 21:14:39475
476 // Unblock and make sure everything was sent.
Harald Alvestrand9e5aeb92022-05-11 09:35:36477 controller_->set_send_blocked(false);
Tommi80558f42023-03-31 09:07:31478 EXPECT_EQ_WAIT(0U, channel_->buffered_amount(), kDefaultTimeout);
hbos84ffdee2016-10-12 21:14:39479 bytes_sent += bytes_queued;
Tommi80558f42023-03-31 09:07:31480 EXPECT_EQ(6U, channel_->messages_sent());
481 EXPECT_EQ(bytes_sent, channel_->bytes_sent());
hbos84ffdee2016-10-12 21:14:39482}
483
wu@webrtc.org78187522013-10-07 23:32:02484// Tests that the queued control message is sent when channel is ready.
wu@webrtc.orgcecfd182013-10-30 05:18:12485TEST_F(SctpDataChannelTest, OpenMessageSent) {
486 // Initially the id is unassigned.
Tommi80558f42023-03-31 09:07:31487 EXPECT_EQ(-1, channel_->id());
wu@webrtc.orgcecfd182013-10-30 05:18:12488
wu@webrtc.org78187522013-10-07 23:32:02489 SetChannelReady();
Tommi80558f42023-03-31 09:07:31490 EXPECT_GE(channel_->id(), 0);
Tommi492296c2023-03-12 15:59:25491 EXPECT_EQ(DataMessageType::kControl,
Harald Alvestrand9e5aeb92022-05-11 09:35:36492 controller_->last_send_data_params().type);
Tommi80558f42023-03-31 09:07:31493 EXPECT_EQ(controller_->last_sid(), channel_->id());
wu@webrtc.org78187522013-10-07 23:32:02494}
wu@webrtc.org07a6fbe2013-11-04 18:41:34495
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14496TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
Harald Alvestrand9e5aeb92022-05-11 09:35:36497 controller_->set_send_blocked(true);
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14498 SetChannelReady();
Harald Alvestrand9e5aeb92022-05-11 09:35:36499 controller_->set_send_blocked(false);
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14500
Tommi492296c2023-03-12 15:59:25501 EXPECT_EQ(DataMessageType::kControl,
Harald Alvestrand9e5aeb92022-05-11 09:35:36502 controller_->last_send_data_params().type);
Tommi80558f42023-03-31 09:07:31503 EXPECT_EQ(controller_->last_sid(), channel_->id());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14504}
505
wu@webrtc.org07a6fbe2013-11-04 18:41:34506// Tests that the DataChannel created after transport gets ready can enter OPEN
507// state.
508TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
509 SetChannelReady();
Tommi492296c2023-03-12 15:59:25510 InternalDataChannelInit init;
wu@webrtc.org07a6fbe2013-11-04 18:41:34511 init.id = 1;
Harald Alvestranda6544372023-11-13 09:33:56512 auto dc = SctpDataChannel::CreateProxy(
Tommif9e13f82023-04-06 19:21:45513 controller_->CreateDataChannel("test1", init), signaling_safety_);
514 EXPECT_EQ(DataChannelInterface::kOpen, dc->state());
wu@webrtc.org07a6fbe2013-11-04 18:41:34515}
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52516
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58517// Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
518// message is received.
519TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
520 SetChannelReady();
Tommi492296c2023-03-12 15:59:25521 InternalDataChannelInit init;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58522 init.id = 1;
523 init.ordered = false;
Taylor Brandstetter3a034e12020-07-09 22:32:34524 rtc::scoped_refptr<SctpDataChannel> dc =
Tommie9aa8672023-03-20 13:43:09525 controller_->CreateDataChannel("test1", init);
Harald Alvestranda6544372023-11-13 09:33:56526 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58527
Tommif9e13f82023-04-06 19:21:45528 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58529
530 // Sends a message and verifies it's ordered.
Tommi492296c2023-03-12 15:59:25531 DataBuffer buffer("some data");
Tommia50a81a2023-04-11 15:32:34532 proxy->SendAsync(buffer, nullptr);
533 EXPECT_TRUE(controller_->last_send_data_params().ordered);
534
535 // Emulates receiving an OPEN_ACK message.
536 rtc::CopyOnWriteBuffer payload;
537 WriteDataChannelOpenAckMessage(&payload);
538 network_thread_.BlockingCall(
539 [&] { dc->OnDataReceived(DataMessageType::kControl, payload); });
540
541 // Sends another message and verifies it's unordered.
542 proxy->SendAsync(buffer, nullptr);
543 FlushNetworkThreadAndPendingOperations();
544 EXPECT_FALSE(controller_->last_send_data_params().ordered);
545}
546
547// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
548TEST_F(SctpDataChannelTest, DeprecatedSendUnorderedAfterReceivesOpenAck) {
549 SetChannelReady();
550 InternalDataChannelInit init;
551 init.id = 1;
552 init.ordered = false;
553 rtc::scoped_refptr<SctpDataChannel> dc =
554 controller_->CreateDataChannel("test1", init);
Harald Alvestranda6544372023-11-13 09:33:56555 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
Tommia50a81a2023-04-11 15:32:34556
557 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
558
559 // Sends a message and verifies it's ordered.
560 DataBuffer buffer("some data");
Tommif9e13f82023-04-06 19:21:45561 ASSERT_TRUE(proxy->Send(buffer));
Harald Alvestrand9e5aeb92022-05-11 09:35:36562 EXPECT_TRUE(controller_->last_send_data_params().ordered);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58563
564 // Emulates receiving an OPEN_ACK message.
jbaucheec21bd2016-03-20 13:15:43565 rtc::CopyOnWriteBuffer payload;
Tommi492296c2023-03-12 15:59:25566 WriteDataChannelOpenAckMessage(&payload);
Tommif9e13f82023-04-06 19:21:45567 network_thread_.BlockingCall(
568 [&] { dc->OnDataReceived(DataMessageType::kControl, payload); });
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58569
570 // Sends another message and verifies it's unordered.
Tommif9e13f82023-04-06 19:21:45571 ASSERT_TRUE(proxy->Send(buffer));
Harald Alvestrand9e5aeb92022-05-11 09:35:36572 EXPECT_FALSE(controller_->last_send_data_params().ordered);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58573}
574
575// Tests that an unordered DataChannel sends unordered data after any DATA
576// message is received.
577TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
578 SetChannelReady();
Tommi492296c2023-03-12 15:59:25579 InternalDataChannelInit init;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58580 init.id = 1;
581 init.ordered = false;
Taylor Brandstetter3a034e12020-07-09 22:32:34582 rtc::scoped_refptr<SctpDataChannel> dc =
Tommie9aa8672023-03-20 13:43:09583 controller_->CreateDataChannel("test1", init);
Harald Alvestranda6544372023-11-13 09:33:56584 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58585
Tommif9e13f82023-04-06 19:21:45586 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58587
588 // Emulates receiving a DATA message.
Tommi492296c2023-03-12 15:59:25589 DataBuffer buffer("data");
Tommif9e13f82023-04-06 19:21:45590 network_thread_.BlockingCall(
591 [&] { dc->OnDataReceived(DataMessageType::kText, buffer.data); });
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58592
593 // Sends a message and verifies it's unordered.
Tommia50a81a2023-04-11 15:32:34594 proxy->SendAsync(buffer, nullptr);
595 FlushNetworkThreadAndPendingOperations();
596 EXPECT_FALSE(controller_->last_send_data_params().ordered);
597}
598
599// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
600TEST_F(SctpDataChannelTest, DeprecatedSendUnorderedAfterReceiveData) {
601 SetChannelReady();
602 InternalDataChannelInit init;
603 init.id = 1;
604 init.ordered = false;
605 rtc::scoped_refptr<SctpDataChannel> dc =
606 controller_->CreateDataChannel("test1", init);
Harald Alvestranda6544372023-11-13 09:33:56607 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
Tommia50a81a2023-04-11 15:32:34608
609 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
610
611 // Emulates receiving a DATA message.
612 DataBuffer buffer("data");
613 network_thread_.BlockingCall(
614 [&] { dc->OnDataReceived(DataMessageType::kText, buffer.data); });
615
616 // Sends a message and verifies it's unordered.
Tommif9e13f82023-04-06 19:21:45617 ASSERT_TRUE(proxy->Send(buffer));
Harald Alvestrand9e5aeb92022-05-11 09:35:36618 EXPECT_FALSE(controller_->last_send_data_params().ordered);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58619}
620
Lally Singh5c6c6e02015-05-29 15:52:39621// Tests that the channel can't open until it's successfully sent the OPEN
622// message.
623TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
Tommi492296c2023-03-12 15:59:25624 DataBuffer buffer("foo");
Lally Singh5c6c6e02015-05-29 15:52:39625
Harald Alvestrand9e5aeb92022-05-11 09:35:36626 controller_->set_send_blocked(true);
Lally Singh5c6c6e02015-05-29 15:52:39627 SetChannelReady();
Tommi80558f42023-03-31 09:07:31628 EXPECT_EQ(DataChannelInterface::kConnecting, channel_->state());
Harald Alvestrand9e5aeb92022-05-11 09:35:36629 controller_->set_send_blocked(false);
Tommi80558f42023-03-31 09:07:31630 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, channel_->state(), 1000);
Tommi492296c2023-03-12 15:59:25631 EXPECT_EQ(DataMessageType::kControl,
Harald Alvestrand9e5aeb92022-05-11 09:35:36632 controller_->last_send_data_params().type);
Lally Singh5c6c6e02015-05-29 15:52:39633}
634
635// Tests that close first makes sure all queued data gets sent.
636TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
Tommi492296c2023-03-12 15:59:25637 DataBuffer buffer("foo");
Lally Singh5c6c6e02015-05-29 15:52:39638
Harald Alvestrand9e5aeb92022-05-11 09:35:36639 controller_->set_send_blocked(true);
Lally Singh5c6c6e02015-05-29 15:52:39640 SetChannelReady();
Tommi80558f42023-03-31 09:07:31641 EXPECT_EQ(DataChannelInterface::kConnecting, channel_->state());
Harald Alvestrand9e5aeb92022-05-11 09:35:36642 controller_->set_send_blocked(false);
Tommi80558f42023-03-31 09:07:31643 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, channel_->state(), 1000);
Harald Alvestrand9e5aeb92022-05-11 09:35:36644 controller_->set_send_blocked(true);
Tommia50a81a2023-04-11 15:32:34645 channel_->SendAsync(buffer, nullptr);
646 channel_->Close();
647 controller_->set_send_blocked(false);
648 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, channel_->state(), 1000);
649 EXPECT_TRUE(channel_->error().ok());
650 EXPECT_EQ(DataMessageType::kText, controller_->last_send_data_params().type);
651}
652
653// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
654TEST_F(SctpDataChannelTest, DeprecatedQueuedCloseFlushes) {
655 DataBuffer buffer("foo");
656
657 controller_->set_send_blocked(true);
658 SetChannelReady();
659 EXPECT_EQ(DataChannelInterface::kConnecting, channel_->state());
660 controller_->set_send_blocked(false);
661 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, channel_->state(), 1000);
662 controller_->set_send_blocked(true);
Tommi80558f42023-03-31 09:07:31663 channel_->Send(buffer);
664 channel_->Close();
Harald Alvestrand9e5aeb92022-05-11 09:35:36665 controller_->set_send_blocked(false);
Tommi80558f42023-03-31 09:07:31666 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, channel_->state(), 1000);
667 EXPECT_TRUE(channel_->error().ok());
Tommi492296c2023-03-12 15:59:25668 EXPECT_EQ(DataMessageType::kText, controller_->last_send_data_params().type);
Lally Singh5c6c6e02015-05-29 15:52:39669}
670
Harald Alvestrand7af57c62021-04-16 11:12:14671// Tests that messages are sent with the right id.
672TEST_F(SctpDataChannelTest, SendDataId) {
Tommi80558f42023-03-31 09:07:31673 SetChannelSid(inner_channel_, StreamId(1));
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52674 SetChannelReady();
Tommi492296c2023-03-12 15:59:25675 DataBuffer buffer("data");
Tommia50a81a2023-04-11 15:32:34676 channel_->SendAsync(buffer, nullptr);
677 FlushNetworkThreadAndPendingOperations();
678 EXPECT_EQ(1, controller_->last_sid());
679}
680
681// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
682TEST_F(SctpDataChannelTest, DeprecatedSendDataId) {
683 SetChannelSid(inner_channel_, StreamId(1));
684 SetChannelReady();
685 DataBuffer buffer("data");
Tommi80558f42023-03-31 09:07:31686 EXPECT_TRUE(channel_->Send(buffer));
Harald Alvestrand9e5aeb92022-05-11 09:35:36687 EXPECT_EQ(1, controller_->last_sid());
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52688}
689
Harald Alvestrand7af57c62021-04-16 11:12:14690// Tests that the incoming messages with right ids are accepted.
691TEST_F(SctpDataChannelTest, ReceiveDataWithValidId) {
Tommi80558f42023-03-31 09:07:31692 SetChannelSid(inner_channel_, StreamId(1));
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52693 SetChannelReady();
694
695 AddObserver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52696
Tommi492296c2023-03-12 15:59:25697 DataBuffer buffer("abcd");
Tommif9e13f82023-04-06 19:21:45698 network_thread_.BlockingCall([&] {
699 inner_channel_->OnDataReceived(DataMessageType::kText, buffer.data);
700 });
701 run_loop_.Flush();
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54702 EXPECT_EQ(1U, observer_->messages_received());
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52703}
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58704
705// Tests that no CONTROL message is sent if the datachannel is negotiated and
706// not created from an OPEN message.
707TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
Tommi492296c2023-03-12 15:59:25708 InternalDataChannelInit config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58709 config.id = 1;
710 config.negotiated = true;
Tommi492296c2023-03-12 15:59:25711 config.open_handshake_role = InternalDataChannelInit::kNone;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58712
713 SetChannelReady();
Taylor Brandstetter3a034e12020-07-09 22:32:34714 rtc::scoped_refptr<SctpDataChannel> dc =
Tommie9aa8672023-03-20 13:43:09715 controller_->CreateDataChannel("test1", config);
Harald Alvestranda6544372023-11-13 09:33:56716 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58717
Tommif9e13f82023-04-06 19:21:45718 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
Harald Alvestrand9e5aeb92022-05-11 09:35:36719 EXPECT_EQ(0, controller_->last_sid());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58720}
721
hbos84ffdee2016-10-12 21:14:39722// Tests that DataChannel::messages_received() and DataChannel::bytes_received()
723// are correct, receiving data both while not open and while open.
724TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesReceived) {
725 AddObserver();
Tommi492296c2023-03-12 15:59:25726 std::vector<DataBuffer> buffers({
727 DataBuffer("message 1"),
728 DataBuffer("msg 2"),
729 DataBuffer("message three"),
730 DataBuffer("quadra message"),
731 DataBuffer("fifthmsg"),
732 DataBuffer("message of the beast"),
hbos84ffdee2016-10-12 21:14:39733 });
734
Tommi80558f42023-03-31 09:07:31735 SetChannelSid(inner_channel_, StreamId(1));
hbos84ffdee2016-10-12 21:14:39736
737 // Default values.
Tommi80558f42023-03-31 09:07:31738 EXPECT_EQ(0U, channel_->messages_received());
739 EXPECT_EQ(0U, channel_->bytes_received());
hbos84ffdee2016-10-12 21:14:39740
741 // Receive three buffers while data channel isn't open.
Tommif9e13f82023-04-06 19:21:45742 network_thread_.BlockingCall([&] {
743 for (int i : {0, 1, 2})
744 inner_channel_->OnDataReceived(DataMessageType::kText, buffers[i].data);
745 });
hbos84ffdee2016-10-12 21:14:39746 EXPECT_EQ(0U, observer_->messages_received());
Tommi80558f42023-03-31 09:07:31747 EXPECT_EQ(0U, channel_->messages_received());
748 EXPECT_EQ(0U, channel_->bytes_received());
hbos84ffdee2016-10-12 21:14:39749
750 // Open channel and make sure everything was received.
751 SetChannelReady();
752 size_t bytes_received =
753 buffers[0].size() + buffers[1].size() + buffers[2].size();
754 EXPECT_EQ(3U, observer_->messages_received());
Tommi80558f42023-03-31 09:07:31755 EXPECT_EQ(3U, channel_->messages_received());
756 EXPECT_EQ(bytes_received, channel_->bytes_received());
hbos84ffdee2016-10-12 21:14:39757
758 // Receive three buffers while open.
Tommif9e13f82023-04-06 19:21:45759 network_thread_.BlockingCall([&] {
760 for (int i : {3, 4, 5})
761 inner_channel_->OnDataReceived(DataMessageType::kText, buffers[i].data);
762 });
763 run_loop_.Flush();
hbos84ffdee2016-10-12 21:14:39764 bytes_received += buffers[3].size() + buffers[4].size() + buffers[5].size();
765 EXPECT_EQ(6U, observer_->messages_received());
Tommi80558f42023-03-31 09:07:31766 EXPECT_EQ(6U, channel_->messages_received());
767 EXPECT_EQ(bytes_received, channel_->bytes_received());
hbos84ffdee2016-10-12 21:14:39768}
769
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58770// Tests that OPEN_ACK message is sent if the datachannel is created from an
771// OPEN message.
772TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
Tommi492296c2023-03-12 15:59:25773 InternalDataChannelInit config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58774 config.id = 1;
775 config.negotiated = true;
Tommi492296c2023-03-12 15:59:25776 config.open_handshake_role = InternalDataChannelInit::kAcker;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58777
778 SetChannelReady();
Taylor Brandstetter3a034e12020-07-09 22:32:34779 rtc::scoped_refptr<SctpDataChannel> dc =
Tommie9aa8672023-03-20 13:43:09780 controller_->CreateDataChannel("test1", config);
Harald Alvestranda6544372023-11-13 09:33:56781 auto proxy = SctpDataChannel::CreateProxy(dc, signaling_safety_);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58782
Tommif9e13f82023-04-06 19:21:45783 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, proxy->state(), 1000);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58784
Harald Alvestrand9e5aeb92022-05-11 09:35:36785 EXPECT_EQ(config.id, controller_->last_sid());
Tommi492296c2023-03-12 15:59:25786 EXPECT_EQ(DataMessageType::kControl,
Harald Alvestrand9e5aeb92022-05-11 09:35:36787 controller_->last_send_data_params().type);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58788}
789
790// Tests the OPEN_ACK role assigned by InternalDataChannelInit.
791TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
Tommi492296c2023-03-12 15:59:25792 InternalDataChannelInit init;
793 EXPECT_EQ(InternalDataChannelInit::kOpener, init.open_handshake_role);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58794 EXPECT_FALSE(init.negotiated);
795
Tommi492296c2023-03-12 15:59:25796 DataChannelInit base;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58797 base.negotiated = true;
Tommi492296c2023-03-12 15:59:25798 InternalDataChannelInit init2(base);
799 EXPECT_EQ(InternalDataChannelInit::kNone, init2.open_handshake_role);
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58800}
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54801
Florent Castelli01343032021-11-03 15:09:46802// Tests that that Send() returns false if the sending buffer is full
803// and the channel stays open.
804TEST_F(SctpDataChannelTest, OpenWhenSendBufferFull) {
Tommia50a81a2023-04-11 15:32:34805 AddObserver();
806 SetChannelReady();
807
808 const size_t packetSize = 1024;
809
810 rtc::CopyOnWriteBuffer buffer(packetSize);
811 memset(buffer.MutableData(), 0, buffer.size());
812
813 DataBuffer packet(buffer, true);
814 controller_->set_send_blocked(true);
815 size_t successful_send = 0u, failed_send = 0u;
816 auto send_complete = [&](RTCError err) {
817 err.ok() ? ++successful_send : ++failed_send;
818 };
819
820 size_t count = DataChannelInterface::MaxSendQueueSize() / packetSize;
821 for (size_t i = 0; i < count; ++i) {
822 channel_->SendAsync(packet, send_complete);
823 }
824
825 // The sending buffer should be full, `Send()` returns false.
826 channel_->SendAsync(packet, std::move(send_complete));
827 FlushNetworkThreadAndPendingOperations();
828 EXPECT_TRUE(DataChannelInterface::kOpen == channel_->state());
829 EXPECT_EQ(successful_send, count);
830 EXPECT_EQ(failed_send, 1u);
831}
832
833// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
834TEST_F(SctpDataChannelTest, DeprecatedOpenWhenSendBufferFull) {
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54835 SetChannelReady();
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14836
Florent Castelli01343032021-11-03 15:09:46837 const size_t packetSize = 1024;
838
839 rtc::CopyOnWriteBuffer buffer(packetSize);
Danil Chapovalove15dc582021-01-07 14:24:05840 memset(buffer.MutableData(), 0, buffer.size());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14841
Tommi492296c2023-03-12 15:59:25842 DataBuffer packet(buffer, true);
Harald Alvestrand9e5aeb92022-05-11 09:35:36843 controller_->set_send_blocked(true);
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54844
Tommi492296c2023-03-12 15:59:25845 for (size_t i = 0; i < DataChannelInterface::MaxSendQueueSize() / packetSize;
846 ++i) {
Tommi80558f42023-03-31 09:07:31847 EXPECT_TRUE(channel_->Send(packet));
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54848 }
849
Tommif9e13f82023-04-06 19:21:45850 // The sending buffer should be full, `Send()` returns false.
Tommi80558f42023-03-31 09:07:31851 EXPECT_FALSE(channel_->Send(packet));
Tommi80558f42023-03-31 09:07:31852 EXPECT_TRUE(DataChannelInterface::kOpen == channel_->state());
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54853}
854
855// Tests that the DataChannel is closed on transport errors.
856TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
857 SetChannelReady();
Tommi492296c2023-03-12 15:59:25858 DataBuffer buffer("abcd");
Harald Alvestrand9e5aeb92022-05-11 09:35:36859 controller_->set_transport_error();
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54860
Tommia50a81a2023-04-11 15:32:34861 channel_->SendAsync(buffer, nullptr);
862
863 EXPECT_EQ(DataChannelInterface::kClosed, channel_->state());
864 EXPECT_FALSE(channel_->error().ok());
865 EXPECT_EQ(RTCErrorType::NETWORK_ERROR, channel_->error().type());
866 EXPECT_EQ(RTCErrorDetailType::NONE, channel_->error().error_detail());
867}
868
869// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
870TEST_F(SctpDataChannelTest, DeprecatedClosedOnTransportError) {
871 SetChannelReady();
872 DataBuffer buffer("abcd");
873 controller_->set_transport_error();
874
Tommi80558f42023-03-31 09:07:31875 EXPECT_TRUE(channel_->Send(buffer));
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54876
Tommi80558f42023-03-31 09:07:31877 EXPECT_EQ(DataChannelInterface::kClosed, channel_->state());
878 EXPECT_FALSE(channel_->error().ok());
879 EXPECT_EQ(RTCErrorType::NETWORK_ERROR, channel_->error().type());
880 EXPECT_EQ(RTCErrorDetailType::NONE, channel_->error().error_detail());
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54881}
jiayl@webrtc.org9f8164c2014-05-30 21:53:17882
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14883// Tests that the DataChannel is closed if the received buffer is full.
884TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) {
885 SetChannelReady();
jbaucheec21bd2016-03-20 13:15:43886 rtc::CopyOnWriteBuffer buffer(1024);
Danil Chapovalove15dc582021-01-07 14:24:05887 memset(buffer.MutableData(), 0, buffer.size());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14888
Tommif9e13f82023-04-06 19:21:45889 network_thread_.BlockingCall([&] {
890 // Receiving data without having an observer will overflow the buffer.
891 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
892 inner_channel_->OnDataReceived(DataMessageType::kText, buffer);
893 }
894 });
Tommi80558f42023-03-31 09:07:31895 EXPECT_EQ(DataChannelInterface::kClosed, channel_->state());
896 EXPECT_FALSE(channel_->error().ok());
897 EXPECT_EQ(RTCErrorType::RESOURCE_EXHAUSTED, channel_->error().type());
898 EXPECT_EQ(RTCErrorDetailType::NONE, channel_->error().error_detail());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14899}
jiayl@webrtc.org3edbaaf2014-07-18 23:57:50900
901// Tests that sending empty data returns no error and keeps the channel open.
902TEST_F(SctpDataChannelTest, SendEmptyData) {
Tommi80558f42023-03-31 09:07:31903 SetChannelSid(inner_channel_, StreamId(1));
jiayl@webrtc.org3edbaaf2014-07-18 23:57:50904 SetChannelReady();
Tommi80558f42023-03-31 09:07:31905 EXPECT_EQ(DataChannelInterface::kOpen, channel_->state());
jiayl@webrtc.org3edbaaf2014-07-18 23:57:50906
Tommi492296c2023-03-12 15:59:25907 DataBuffer buffer("");
Tommia50a81a2023-04-11 15:32:34908 channel_->SendAsync(buffer, nullptr);
909 EXPECT_EQ(DataChannelInterface::kOpen, channel_->state());
910}
911
912// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
913TEST_F(SctpDataChannelTest, DeprecatedSendEmptyData) {
914 SetChannelSid(inner_channel_, StreamId(1));
915 SetChannelReady();
916 EXPECT_EQ(DataChannelInterface::kOpen, channel_->state());
917
918 DataBuffer buffer("");
Tommi80558f42023-03-31 09:07:31919 EXPECT_TRUE(channel_->Send(buffer));
920 EXPECT_EQ(DataChannelInterface::kOpen, channel_->state());
jiayl@webrtc.org3edbaaf2014-07-18 23:57:50921}
bemasc@webrtc.org9b5467e2014-12-04 23:16:52922
923// Tests that a channel can be closed without being opened or assigned an sid.
924TEST_F(SctpDataChannelTest, NeverOpened) {
Harald Alvestrand9e5aeb92022-05-11 09:35:36925 controller_->set_transport_available(true);
Tommif9e13f82023-04-06 19:21:45926 network_thread_.BlockingCall(
927 [&] { inner_channel_->OnTransportChannelCreated(); });
Tommi80558f42023-03-31 09:07:31928 channel_->Close();
bemasc@webrtc.org9b5467e2014-12-04 23:16:52929}
deadbeefab9b2d12015-10-14 18:33:11930
Tommif21354c2023-03-07 07:43:24931// Tests that a data channel that's not connected to a transport can transition
932// directly to the `kClosed` state when closed.
933// See also chromium:1421534.
934TEST_F(SctpDataChannelTest, UnusedTransitionsDirectlyToClosed) {
Tommi80558f42023-03-31 09:07:31935 channel_->Close();
936 EXPECT_EQ(DataChannelInterface::kClosed, channel_->state());
Tommif21354c2023-03-07 07:43:24937}
938
Taylor Brandstetter4cb5b642016-08-12 17:10:31939// Test that the data channel goes to the "closed" state (and doesn't crash)
940// when its transport goes away, even while data is buffered.
941TEST_F(SctpDataChannelTest, TransportDestroyedWhileDataBuffered) {
Tommia50a81a2023-04-11 15:32:34942 AddObserver();
943 SetChannelReady();
944
945 rtc::CopyOnWriteBuffer buffer(1024);
946 memset(buffer.MutableData(), 0, buffer.size());
947 DataBuffer packet(buffer, true);
948
949 // Send a packet while sending is blocked so it ends up buffered.
950 controller_->set_send_blocked(true);
951 channel_->SendAsync(packet, nullptr);
952
953 // Tell the data channel that its transport is being destroyed.
954 // It should then stop using the transport (allowing us to delete it) and
955 // transition to the "closed" state.
956 RTCError error(RTCErrorType::OPERATION_ERROR_WITH_DATA, "");
957 error.set_error_detail(RTCErrorDetailType::SCTP_FAILURE);
958 network_thread_.BlockingCall(
959 [&] { inner_channel_->OnTransportChannelClosed(error); });
960 controller_.reset(nullptr);
961 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, channel_->state(),
962 kDefaultTimeout);
963 EXPECT_FALSE(channel_->error().ok());
964 EXPECT_EQ(RTCErrorType::OPERATION_ERROR_WITH_DATA, channel_->error().type());
965 EXPECT_EQ(RTCErrorDetailType::SCTP_FAILURE, channel_->error().error_detail());
966}
967
968// TODO(tommi): This test uses `Send()`. Remove once fully deprecated.
969TEST_F(SctpDataChannelTest, DeprecatedTransportDestroyedWhileDataBuffered) {
Taylor Brandstetter4cb5b642016-08-12 17:10:31970 SetChannelReady();
971
972 rtc::CopyOnWriteBuffer buffer(1024);
Danil Chapovalove15dc582021-01-07 14:24:05973 memset(buffer.MutableData(), 0, buffer.size());
Tommi492296c2023-03-12 15:59:25974 DataBuffer packet(buffer, true);
Taylor Brandstetter4cb5b642016-08-12 17:10:31975
976 // Send a packet while sending is blocked so it ends up buffered.
Harald Alvestrand9e5aeb92022-05-11 09:35:36977 controller_->set_send_blocked(true);
Tommi80558f42023-03-31 09:07:31978 EXPECT_TRUE(channel_->Send(packet));
Taylor Brandstetter4cb5b642016-08-12 17:10:31979
Harald Alvestrand408cb4b2019-11-16 11:09:08980 // Tell the data channel that its transport is being destroyed.
Taylor Brandstetter4cb5b642016-08-12 17:10:31981 // It should then stop using the transport (allowing us to delete it) and
982 // transition to the "closed" state.
Tommi492296c2023-03-12 15:59:25983 RTCError error(RTCErrorType::OPERATION_ERROR_WITH_DATA, "");
984 error.set_error_detail(RTCErrorDetailType::SCTP_FAILURE);
Tommif9e13f82023-04-06 19:21:45985 network_thread_.BlockingCall(
986 [&] { inner_channel_->OnTransportChannelClosed(error); });
Harald Alvestrand9e5aeb92022-05-11 09:35:36987 controller_.reset(nullptr);
Tommi80558f42023-03-31 09:07:31988 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, channel_->state(),
Tommi492296c2023-03-12 15:59:25989 kDefaultTimeout);
Tommi80558f42023-03-31 09:07:31990 EXPECT_FALSE(channel_->error().ok());
991 EXPECT_EQ(RTCErrorType::OPERATION_ERROR_WITH_DATA, channel_->error().type());
992 EXPECT_EQ(RTCErrorDetailType::SCTP_FAILURE, channel_->error().error_detail());
Taylor Brandstetter4cb5b642016-08-12 17:10:31993}
994
Florent Castellidcb9ffc2021-06-29 12:58:23995TEST_F(SctpDataChannelTest, TransportGotErrorCode) {
996 SetChannelReady();
997
998 // Tell the data channel that its transport is being destroyed with an
999 // error code.
1000 // It should then report that error code.
Tommi492296c2023-03-12 15:59:251001 RTCError error(RTCErrorType::OPERATION_ERROR_WITH_DATA,
1002 "Transport channel closed");
1003 error.set_error_detail(RTCErrorDetailType::SCTP_FAILURE);
Florent Castellidcb9ffc2021-06-29 12:58:231004 error.set_sctp_cause_code(
1005 static_cast<uint16_t>(cricket::SctpErrorCauseCode::kProtocolViolation));
Tommif9e13f82023-04-06 19:21:451006 network_thread_.BlockingCall(
1007 [&] { inner_channel_->OnTransportChannelClosed(error); });
Harald Alvestrand9e5aeb92022-05-11 09:35:361008 controller_.reset(nullptr);
Tommi80558f42023-03-31 09:07:311009 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, channel_->state(),
Tommi492296c2023-03-12 15:59:251010 kDefaultTimeout);
Tommi80558f42023-03-31 09:07:311011 EXPECT_FALSE(channel_->error().ok());
1012 EXPECT_EQ(RTCErrorType::OPERATION_ERROR_WITH_DATA, channel_->error().type());
1013 EXPECT_EQ(RTCErrorDetailType::SCTP_FAILURE, channel_->error().error_detail());
Florent Castellidcb9ffc2021-06-29 12:58:231014 EXPECT_EQ(
1015 static_cast<uint16_t>(cricket::SctpErrorCauseCode::kProtocolViolation),
Tommi80558f42023-03-31 09:07:311016 channel_->error().sctp_cause_code());
Florent Castellidcb9ffc2021-06-29 12:58:231017}
1018
Mirko Bonadei6a489f22019-04-09 13:11:121019class SctpSidAllocatorTest : public ::testing::Test {
deadbeefab9b2d12015-10-14 18:33:111020 protected:
1021 SctpSidAllocator allocator_;
1022};
1023
1024// Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for
1025// SSL_SERVER.
1026TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) {
Tommi8efaec62023-03-21 17:45:241027 EXPECT_EQ(allocator_.AllocateSid(rtc::SSL_SERVER), StreamId(1));
1028 EXPECT_EQ(allocator_.AllocateSid(rtc::SSL_CLIENT), StreamId(0));
1029 EXPECT_EQ(allocator_.AllocateSid(rtc::SSL_SERVER), StreamId(3));
1030 EXPECT_EQ(allocator_.AllocateSid(rtc::SSL_CLIENT), StreamId(2));
deadbeefab9b2d12015-10-14 18:33:111031}
1032
1033// Verifies that SCTP ids of existing DataChannels are not reused.
1034TEST_F(SctpSidAllocatorTest, SctpIdAllocationNoReuse) {
Tommi492296c2023-03-12 15:59:251035 StreamId old_id(1);
deadbeefab9b2d12015-10-14 18:33:111036 EXPECT_TRUE(allocator_.ReserveSid(old_id));
1037
Tommi8efaec62023-03-21 17:45:241038 StreamId new_id = allocator_.AllocateSid(rtc::SSL_SERVER);
1039 EXPECT_TRUE(new_id.HasValue());
deadbeefab9b2d12015-10-14 18:33:111040 EXPECT_NE(old_id, new_id);
1041
Tommi492296c2023-03-12 15:59:251042 old_id = StreamId(0);
deadbeefab9b2d12015-10-14 18:33:111043 EXPECT_TRUE(allocator_.ReserveSid(old_id));
Tommi8efaec62023-03-21 17:45:241044 new_id = allocator_.AllocateSid(rtc::SSL_CLIENT);
1045 EXPECT_TRUE(new_id.HasValue());
deadbeefab9b2d12015-10-14 18:33:111046 EXPECT_NE(old_id, new_id);
1047}
1048
1049// Verifies that SCTP ids of removed DataChannels can be reused.
1050TEST_F(SctpSidAllocatorTest, SctpIdReusedForRemovedDataChannel) {
Tommi492296c2023-03-12 15:59:251051 StreamId odd_id(1);
1052 StreamId even_id(0);
deadbeefab9b2d12015-10-14 18:33:111053 EXPECT_TRUE(allocator_.ReserveSid(odd_id));
1054 EXPECT_TRUE(allocator_.ReserveSid(even_id));
1055
Tommi8efaec62023-03-21 17:45:241056 StreamId allocated_id = allocator_.AllocateSid(rtc::SSL_SERVER);
Tommi492296c2023-03-12 15:59:251057 EXPECT_EQ(odd_id.stream_id_int() + 2, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111058
Tommi8efaec62023-03-21 17:45:241059 allocated_id = allocator_.AllocateSid(rtc::SSL_CLIENT);
Tommi492296c2023-03-12 15:59:251060 EXPECT_EQ(even_id.stream_id_int() + 2, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111061
Tommi8efaec62023-03-21 17:45:241062 allocated_id = allocator_.AllocateSid(rtc::SSL_SERVER);
Tommi492296c2023-03-12 15:59:251063 EXPECT_EQ(odd_id.stream_id_int() + 4, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111064
Tommi8efaec62023-03-21 17:45:241065 allocated_id = allocator_.AllocateSid(rtc::SSL_CLIENT);
Tommi492296c2023-03-12 15:59:251066 EXPECT_EQ(even_id.stream_id_int() + 4, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111067
1068 allocator_.ReleaseSid(odd_id);
1069 allocator_.ReleaseSid(even_id);
1070
1071 // Verifies that removed ids are reused.
Tommi8efaec62023-03-21 17:45:241072 allocated_id = allocator_.AllocateSid(rtc::SSL_SERVER);
deadbeefab9b2d12015-10-14 18:33:111073 EXPECT_EQ(odd_id, allocated_id);
1074
Tommi8efaec62023-03-21 17:45:241075 allocated_id = allocator_.AllocateSid(rtc::SSL_CLIENT);
deadbeefab9b2d12015-10-14 18:33:111076 EXPECT_EQ(even_id, allocated_id);
1077
1078 // Verifies that used higher ids are not reused.
Tommi8efaec62023-03-21 17:45:241079 allocated_id = allocator_.AllocateSid(rtc::SSL_SERVER);
Tommi492296c2023-03-12 15:59:251080 EXPECT_EQ(odd_id.stream_id_int() + 6, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111081
Tommi8efaec62023-03-21 17:45:241082 allocated_id = allocator_.AllocateSid(rtc::SSL_CLIENT);
Tommi492296c2023-03-12 15:59:251083 EXPECT_EQ(even_id.stream_id_int() + 6, allocated_id.stream_id_int());
deadbeefab9b2d12015-10-14 18:33:111084}
Tommi492296c2023-03-12 15:59:251085
Tommia50a81a2023-04-11 15:32:341086// Code coverage tests for default implementations in data_channel_interface.*.
1087namespace {
1088class NoImplDataChannel : public DataChannelInterface {
1089 public:
1090 NoImplDataChannel() = default;
1091 // Send and SendAsync implementations are public and implementation
1092 // is in data_channel_interface.cc.
1093
1094 private:
1095 // Implementation for pure virtual methods, just for compilation sake.
1096 void RegisterObserver(DataChannelObserver* observer) override {}
1097 void UnregisterObserver() override {}
1098 std::string label() const override { return ""; }
1099 bool reliable() const override { return false; }
1100 int id() const override { return -1; }
1101 DataState state() const override { return DataChannelInterface::kClosed; }
1102 uint32_t messages_sent() const override { return 0u; }
1103 uint64_t bytes_sent() const override { return 0u; }
1104 uint32_t messages_received() const override { return 0u; }
1105 uint64_t bytes_received() const override { return 0u; }
1106 uint64_t buffered_amount() const override { return 0u; }
1107 void Close() override {}
1108};
1109
1110class NoImplObserver : public DataChannelObserver {
1111 public:
1112 NoImplObserver() = default;
1113
1114 private:
1115 void OnStateChange() override {}
1116 void OnMessage(const DataBuffer& buffer) override {}
1117};
1118} // namespace
1119
1120TEST(DataChannelInterfaceTest, Coverage) {
1121 auto channel = rtc::make_ref_counted<NoImplDataChannel>();
1122 EXPECT_FALSE(channel->ordered());
1123 EXPECT_EQ(channel->maxRetransmitTime(), 0u);
1124 EXPECT_EQ(channel->maxRetransmits(), 0u);
1125 EXPECT_FALSE(channel->maxRetransmitsOpt());
1126 EXPECT_FALSE(channel->maxPacketLifeTime());
1127 EXPECT_TRUE(channel->protocol().empty());
1128 EXPECT_FALSE(channel->negotiated());
1129 EXPECT_EQ(channel->MaxSendQueueSize(), 16u * 1024u * 1024u);
1130
1131 NoImplObserver observer;
1132 observer.OnBufferedAmountChange(0u);
1133 EXPECT_FALSE(observer.IsOkToCallOnTheNetworkThread());
1134}
1135
1136#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1137
1138TEST(DataChannelInterfaceDeathTest, SendDefaultImplDchecks) {
1139 auto channel = rtc::make_ref_counted<NoImplDataChannel>();
1140 RTC_EXPECT_DEATH(channel->Send(DataBuffer("Foo")), "Check failed: false");
1141}
1142
1143TEST(DataChannelInterfaceDeathTest, SendAsyncDefaultImplDchecks) {
1144 auto channel = rtc::make_ref_counted<NoImplDataChannel>();
1145 RTC_EXPECT_DEATH(channel->SendAsync(DataBuffer("Foo"), nullptr),
1146 "Check failed: false");
1147}
1148#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1149
Tommi492296c2023-03-12 15:59:251150} // namespace
1151} // namespace webrtc