blob: e3c290bd9b5739072f4b1b87c544354542a51364 [file] [log] [blame]
wu@webrtc.orgd64719d2013-08-01 00:00:07 +00001/*
2 * libjingle
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 * Copyright 2013 Google Inc.
wu@webrtc.orgd64719d2013-08-01 00:00:07 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "talk/app/webrtc/datachannel.h"
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000029#include "talk/app/webrtc/sctputils.h"
wu@webrtc.orgcecfd182013-10-30 05:18:12 +000030#include "talk/app/webrtc/test/fakedatachannelprovider.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000031#include "webrtc/base/gunit.h"
wu@webrtc.orgd64719d2013-08-01 00:00:07 +000032
wu@webrtc.org78187522013-10-07 23:32:02 +000033using webrtc::DataChannel;
wu@webrtc.orgd64719d2013-08-01 00:00:07 +000034
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000035class FakeDataChannelObserver : public webrtc::DataChannelObserver {
36 public:
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +000037 FakeDataChannelObserver()
bemasc0edd50c2015-07-01 13:34:33 -070038 : messages_received_(0),
39 on_state_change_count_(0),
40 on_buffered_amount_change_count_(0) {}
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +000041
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +000042 void OnStateChange() {
43 ++on_state_change_count_;
44 }
45
bemasc0edd50c2015-07-01 13:34:33 -070046 void OnBufferedAmountChange(uint64 previous_amount) {
47 ++on_buffered_amount_change_count_;
48 }
49
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +000050 void OnMessage(const webrtc::DataBuffer& buffer) {
51 ++messages_received_;
52 }
53
54 size_t messages_received() const {
55 return messages_received_;
56 }
57
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +000058 void ResetOnStateChangeCount() {
59 on_state_change_count_ = 0;
60 }
61
bemasc0edd50c2015-07-01 13:34:33 -070062 void ResetOnBufferedAmountChangeCount() {
63 on_buffered_amount_change_count_ = 0;
64 }
65
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +000066 size_t on_state_change_count() const {
67 return on_state_change_count_;
68 }
69
bemasc0edd50c2015-07-01 13:34:33 -070070 size_t on_buffered_amount_change_count() const {
71 return on_buffered_amount_change_count_;
72 }
73
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +000074 private:
75 size_t messages_received_;
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +000076 size_t on_state_change_count_;
bemasc0edd50c2015-07-01 13:34:33 -070077 size_t on_buffered_amount_change_count_;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000078};
79
wu@webrtc.orgd64719d2013-08-01 00:00:07 +000080class SctpDataChannelTest : public testing::Test {
81 protected:
82 SctpDataChannelTest()
wu@webrtc.org78187522013-10-07 23:32:02 +000083 : webrtc_data_channel_(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000084 DataChannel::Create(
85 &provider_, cricket::DCT_SCTP, "test", init_)) {
wu@webrtc.orgd64719d2013-08-01 00:00:07 +000086 }
87
wu@webrtc.org78187522013-10-07 23:32:02 +000088 void SetChannelReady() {
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +000089 provider_.set_transport_available(true);
wu@webrtc.orgcecfd182013-10-30 05:18:12 +000090 webrtc_data_channel_->OnTransportChannelCreated();
91 if (webrtc_data_channel_->id() < 0) {
92 webrtc_data_channel_->SetSctpSid(0);
93 }
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +000094 provider_.set_ready_to_send(true);
wu@webrtc.orgd64719d2013-08-01 00:00:07 +000095 }
wu@webrtc.org78187522013-10-07 23:32:02 +000096
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000097 void AddObserver() {
98 observer_.reset(new FakeDataChannelObserver());
99 webrtc_data_channel_->RegisterObserver(observer_.get());
100 }
101
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000102 webrtc::InternalDataChannelInit init_;
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000103 FakeDataChannelProvider provider_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 rtc::scoped_ptr<FakeDataChannelObserver> observer_;
105 rtc::scoped_refptr<DataChannel> webrtc_data_channel_;
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000106};
107
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000108// Verifies that the data channel is connected to the transport after creation.
109TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000110 provider_.set_transport_available(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000111 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000112 &provider_, cricket::DCT_SCTP, "test1", init_);
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000113
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000114 EXPECT_TRUE(provider_.IsConnected(dc.get()));
115 // The sid is not set yet, so it should not have added the streams.
116 EXPECT_FALSE(provider_.IsSendStreamAdded(dc->id()));
117 EXPECT_FALSE(provider_.IsRecvStreamAdded(dc->id()));
118
119 dc->SetSctpSid(0);
120 EXPECT_TRUE(provider_.IsSendStreamAdded(dc->id()));
121 EXPECT_TRUE(provider_.IsRecvStreamAdded(dc->id()));
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000122}
123
124// Verifies that the data channel is connected to the transport if the transport
125// is not available initially and becomes available later.
126TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) {
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000127 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get()));
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000128
129 provider_.set_transport_available(true);
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000130 webrtc_data_channel_->OnTransportChannelCreated();
131 EXPECT_TRUE(provider_.IsConnected(webrtc_data_channel_.get()));
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000132}
133
wu@webrtc.org78187522013-10-07 23:32:02 +0000134// Tests the state of the data channel.
135TEST_F(SctpDataChannelTest, StateTransition) {
136 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
137 webrtc_data_channel_->state());
138 SetChannelReady();
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000139
wu@webrtc.org78187522013-10-07 23:32:02 +0000140 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
141 webrtc_data_channel_->Close();
142 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
143 webrtc_data_channel_->state());
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000144 // Verifies that it's disconnected from the transport.
145 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get()));
wu@webrtc.org78187522013-10-07 23:32:02 +0000146}
147
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000148// Tests that DataChannel::buffered_amount() is correct after the channel is
149// blocked.
150TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
bemasc0edd50c2015-07-01 13:34:33 -0700151 AddObserver();
wu@webrtc.org78187522013-10-07 23:32:02 +0000152 SetChannelReady();
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000153 webrtc::DataBuffer buffer("abcd");
154 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
155
156 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
bemasc0edd50c2015-07-01 13:34:33 -0700157 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000158
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000159 provider_.set_send_blocked(true);
wu@webrtc.org78187522013-10-07 23:32:02 +0000160
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000161 const int number_of_packets = 3;
162 for (int i = 0; i < number_of_packets; ++i) {
163 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
164 }
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000165 EXPECT_EQ(buffer.data.size() * number_of_packets,
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000166 webrtc_data_channel_->buffered_amount());
bemasc0edd50c2015-07-01 13:34:33 -0700167 EXPECT_EQ(number_of_packets, observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000168}
169
170// Tests that the queued data are sent when the channel transitions from blocked
171// to unblocked.
172TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
bemasc0edd50c2015-07-01 13:34:33 -0700173 AddObserver();
wu@webrtc.org78187522013-10-07 23:32:02 +0000174 SetChannelReady();
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000175 webrtc::DataBuffer buffer("abcd");
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000176 provider_.set_send_blocked(true);
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000177 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
178
bemasc0edd50c2015-07-01 13:34:33 -0700179 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
180
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000181 provider_.set_send_blocked(false);
wu@webrtc.org78187522013-10-07 23:32:02 +0000182 SetChannelReady();
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000183 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
bemasc0edd50c2015-07-01 13:34:33 -0700184 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000185}
wu@webrtc.org78187522013-10-07 23:32:02 +0000186
jiayl@webrtc.orgcceb1662015-01-22 00:55:10 +0000187// Tests that no crash when the channel is blocked right away while trying to
188// send queued data.
189TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
bemasc0edd50c2015-07-01 13:34:33 -0700190 AddObserver();
jiayl@webrtc.orgcceb1662015-01-22 00:55:10 +0000191 SetChannelReady();
192 webrtc::DataBuffer buffer("abcd");
193 provider_.set_send_blocked(true);
194 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
bemasc0edd50c2015-07-01 13:34:33 -0700195 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10 +0000196
197 // Set channel ready while it is still blocked.
198 SetChannelReady();
199 EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount());
bemasc0edd50c2015-07-01 13:34:33 -0700200 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10 +0000201
202 // Unblock the channel to send queued data again, there should be no crash.
203 provider_.set_send_blocked(false);
204 SetChannelReady();
205 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
bemasc0edd50c2015-07-01 13:34:33 -0700206 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
jiayl@webrtc.orgcceb1662015-01-22 00:55:10 +0000207}
208
wu@webrtc.org78187522013-10-07 23:32:02 +0000209// Tests that the queued control message is sent when channel is ready.
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000210TEST_F(SctpDataChannelTest, OpenMessageSent) {
211 // Initially the id is unassigned.
212 EXPECT_EQ(-1, webrtc_data_channel_->id());
213
wu@webrtc.org78187522013-10-07 23:32:02 +0000214 SetChannelReady();
wu@webrtc.orgcecfd182013-10-30 05:18:12 +0000215 EXPECT_GE(webrtc_data_channel_->id(), 0);
216 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
217 EXPECT_EQ(provider_.last_send_data_params().ssrc,
218 static_cast<uint32>(webrtc_data_channel_->id()));
wu@webrtc.org78187522013-10-07 23:32:02 +0000219}
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000220
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000221TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
222 provider_.set_send_blocked(true);
223 SetChannelReady();
224 provider_.set_send_blocked(false);
225
226 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
227 EXPECT_EQ(provider_.last_send_data_params().ssrc,
228 static_cast<uint32>(webrtc_data_channel_->id()));
229}
230
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000231// Tests that the DataChannel created after transport gets ready can enter OPEN
232// state.
233TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
234 SetChannelReady();
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000235 webrtc::InternalDataChannelInit init;
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000236 init.id = 1;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000237 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000238 &provider_, cricket::DCT_SCTP, "test1", init);
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000239 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state());
240 EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(),
241 1000);
242}
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000243
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000244// Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
245// message is received.
246TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
247 SetChannelReady();
248 webrtc::InternalDataChannelInit init;
249 init.id = 1;
250 init.ordered = false;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000251 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000252 &provider_, cricket::DCT_SCTP, "test1", init);
253
254 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
255
256 // Sends a message and verifies it's ordered.
257 webrtc::DataBuffer buffer("some data");
258 ASSERT_TRUE(dc->Send(buffer));
259 EXPECT_TRUE(provider_.last_send_data_params().ordered);
260
261 // Emulates receiving an OPEN_ACK message.
262 cricket::ReceiveDataParams params;
263 params.ssrc = init.id;
264 params.type = cricket::DMT_CONTROL;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000265 rtc::Buffer payload;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000266 webrtc::WriteDataChannelOpenAckMessage(&payload);
267 dc->OnDataReceived(NULL, params, payload);
268
269 // Sends another message and verifies it's unordered.
270 ASSERT_TRUE(dc->Send(buffer));
271 EXPECT_FALSE(provider_.last_send_data_params().ordered);
272}
273
274// Tests that an unordered DataChannel sends unordered data after any DATA
275// message is received.
276TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
277 SetChannelReady();
278 webrtc::InternalDataChannelInit init;
279 init.id = 1;
280 init.ordered = false;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000281 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000282 &provider_, cricket::DCT_SCTP, "test1", init);
283
284 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
285
286 // Emulates receiving a DATA message.
287 cricket::ReceiveDataParams params;
288 params.ssrc = init.id;
289 params.type = cricket::DMT_TEXT;
290 webrtc::DataBuffer buffer("data");
291 dc->OnDataReceived(NULL, params, buffer.data);
292
293 // Sends a message and verifies it's unordered.
294 ASSERT_TRUE(dc->Send(buffer));
295 EXPECT_FALSE(provider_.last_send_data_params().ordered);
296}
297
Lally Singh5c6c6e02015-05-29 11:52:39 -0400298// Tests that the channel can't open until it's successfully sent the OPEN
299// message.
300TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
301 webrtc::DataBuffer buffer("foo");
302
303 provider_.set_send_blocked(true);
304 SetChannelReady();
305 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
306 webrtc_data_channel_->state());
307 provider_.set_send_blocked(false);
308 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
309 webrtc_data_channel_->state(), 1000);
310 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
311}
312
313// Tests that close first makes sure all queued data gets sent.
314TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
315 webrtc::DataBuffer buffer("foo");
316
317 provider_.set_send_blocked(true);
318 SetChannelReady();
319 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
320 webrtc_data_channel_->state());
321 provider_.set_send_blocked(false);
322 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
323 webrtc_data_channel_->state(), 1000);
324 provider_.set_send_blocked(true);
325 webrtc_data_channel_->Send(buffer);
326 webrtc_data_channel_->Close();
327 provider_.set_send_blocked(false);
328 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
329 webrtc_data_channel_->state(), 1000);
330 EXPECT_EQ(cricket::DMT_TEXT, provider_.last_send_data_params().type);
331}
332
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000333// Tests that messages are sent with the right ssrc.
334TEST_F(SctpDataChannelTest, SendDataSsrc) {
335 webrtc_data_channel_->SetSctpSid(1);
336 SetChannelReady();
337 webrtc::DataBuffer buffer("data");
338 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
339 EXPECT_EQ(1U, provider_.last_send_data_params().ssrc);
340}
341
342// Tests that the incoming messages with wrong ssrcs are rejected.
343TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) {
344 webrtc_data_channel_->SetSctpSid(1);
345 SetChannelReady();
346
347 AddObserver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000348
349 cricket::ReceiveDataParams params;
350 params.ssrc = 0;
351 webrtc::DataBuffer buffer("abcd");
352 webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data);
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000353
354 EXPECT_EQ(0U, observer_->messages_received());
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000355}
356
357// Tests that the incoming messages with right ssrcs are acceted.
358TEST_F(SctpDataChannelTest, ReceiveDataWithValidSsrc) {
359 webrtc_data_channel_->SetSctpSid(1);
360 SetChannelReady();
361
362 AddObserver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000363
364 cricket::ReceiveDataParams params;
365 params.ssrc = 1;
366 webrtc::DataBuffer buffer("abcd");
367
368 webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data);
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000369 EXPECT_EQ(1U, observer_->messages_received());
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000370}
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000371
372// Tests that no CONTROL message is sent if the datachannel is negotiated and
373// not created from an OPEN message.
374TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
375 webrtc::InternalDataChannelInit config;
376 config.id = 1;
377 config.negotiated = true;
378 config.open_handshake_role = webrtc::InternalDataChannelInit::kNone;
379
380 SetChannelReady();
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000381 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000382 &provider_, cricket::DCT_SCTP, "test1", config);
383
384 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
385 EXPECT_EQ(0U, provider_.last_send_data_params().ssrc);
386}
387
388// Tests that OPEN_ACK message is sent if the datachannel is created from an
389// OPEN message.
390TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
391 webrtc::InternalDataChannelInit config;
392 config.id = 1;
393 config.negotiated = true;
394 config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker;
395
396 SetChannelReady();
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000397 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000398 &provider_, cricket::DCT_SCTP, "test1", config);
399
400 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
401
402 EXPECT_EQ(static_cast<unsigned int>(config.id),
403 provider_.last_send_data_params().ssrc);
404 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
405}
406
407// Tests the OPEN_ACK role assigned by InternalDataChannelInit.
408TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
409 webrtc::InternalDataChannelInit init;
410 EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role);
411 EXPECT_FALSE(init.negotiated);
412
413 webrtc::DataChannelInit base;
414 base.negotiated = true;
415 webrtc::InternalDataChannelInit init2(base);
416 EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role);
417}
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000418
419// Tests that the DataChannel is closed if the sending buffer is full.
420TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) {
421 SetChannelReady();
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000422
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000423 rtc::Buffer buffer(1024);
424 memset(buffer.data(), 0, buffer.size());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000425
426 webrtc::DataBuffer packet(buffer, true);
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000427 provider_.set_send_blocked(true);
428
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000429 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
430 EXPECT_TRUE(webrtc_data_channel_->Send(packet));
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000431 }
432
Lally Singh5c6c6e02015-05-29 11:52:39 -0400433 EXPECT_TRUE(
434 webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() ||
435 webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state());
jiayl@webrtc.org5dc51fb2014-05-29 15:33:54 +0000436}
437
438// Tests that the DataChannel is closed on transport errors.
439TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
440 SetChannelReady();
441 webrtc::DataBuffer buffer("abcd");
442 provider_.set_transport_error();
443
444 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
445
446 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
447 webrtc_data_channel_->state());
448}
jiayl@webrtc.org9f8164c2014-05-30 21:53:17 +0000449
450// Tests that a already closed DataChannel does not fire onStateChange again.
451TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) {
452 AddObserver();
453 webrtc_data_channel_->Close();
454 // OnStateChange called for kClosing and kClosed.
455 EXPECT_EQ(2U, observer_->on_state_change_count());
456
457 observer_->ResetOnStateChangeCount();
458 webrtc_data_channel_->RemotePeerRequestClose();
459 EXPECT_EQ(0U, observer_->on_state_change_count());
460}
461
462// Tests that RemotePeerRequestClose closes the local DataChannel.
463TEST_F(SctpDataChannelTest, RemotePeerRequestClose) {
464 AddObserver();
465 webrtc_data_channel_->RemotePeerRequestClose();
466
467 // OnStateChange called for kClosing and kClosed.
468 EXPECT_EQ(2U, observer_->on_state_change_count());
469 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
470 webrtc_data_channel_->state());
471}
472
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000473// Tests that the DataChannel is closed if the received buffer is full.
474TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) {
475 SetChannelReady();
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000476 rtc::Buffer buffer(1024);
477 memset(buffer.data(), 0, buffer.size());
jiayl@webrtc.orgb43c99d2014-06-20 17:11:14 +0000478
479 cricket::ReceiveDataParams params;
480 params.ssrc = 0;
481
482 // Receiving data without having an observer will overflow the buffer.
483 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
484 webrtc_data_channel_->OnDataReceived(NULL, params, buffer);
485 }
486 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
487 webrtc_data_channel_->state());
488}
jiayl@webrtc.org3edbaaf2014-07-18 23:57:50 +0000489
490// Tests that sending empty data returns no error and keeps the channel open.
491TEST_F(SctpDataChannelTest, SendEmptyData) {
492 webrtc_data_channel_->SetSctpSid(1);
493 SetChannelReady();
494 EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
495 webrtc_data_channel_->state());
496
497 webrtc::DataBuffer buffer("");
498 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
499 EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
500 webrtc_data_channel_->state());
501}
bemasc@webrtc.org9b5467e2014-12-04 23:16:52 +0000502
503// Tests that a channel can be closed without being opened or assigned an sid.
504TEST_F(SctpDataChannelTest, NeverOpened) {
505 provider_.set_transport_available(true);
506 webrtc_data_channel_->OnTransportChannelCreated();
507 webrtc_data_channel_->Close();
508}