xref: /aosp_15_r20/external/webrtc/pc/data_channel_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2013 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 #include <string.h>
13 
14 #include <memory>
15 #include <string>
16 #include <vector>
17 
18 #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"
23 #include "media/sctp/sctp_transport_internal.h"
24 #include "pc/sctp_data_channel.h"
25 #include "pc/sctp_utils.h"
26 #include "pc/test/fake_data_channel_controller.h"
27 #include "rtc_base/copy_on_write_buffer.h"
28 #include "rtc_base/gunit.h"
29 #include "rtc_base/ssl_stream_adapter.h"
30 #include "rtc_base/third_party/sigslot/sigslot.h"
31 #include "rtc_base/thread.h"
32 #include "test/gtest.h"
33 
34 using webrtc::DataChannelInterface;
35 using webrtc::SctpDataChannel;
36 using webrtc::SctpSidAllocator;
37 
38 static constexpr int kDefaultTimeout = 10000;
39 
40 class FakeDataChannelObserver : public webrtc::DataChannelObserver {
41  public:
FakeDataChannelObserver()42   FakeDataChannelObserver()
43       : messages_received_(0),
44         on_state_change_count_(0),
45         on_buffered_amount_change_count_(0) {}
46 
OnStateChange()47   void OnStateChange() { ++on_state_change_count_; }
48 
OnBufferedAmountChange(uint64_t previous_amount)49   void OnBufferedAmountChange(uint64_t previous_amount) {
50     ++on_buffered_amount_change_count_;
51   }
52 
OnMessage(const webrtc::DataBuffer & buffer)53   void OnMessage(const webrtc::DataBuffer& buffer) { ++messages_received_; }
54 
messages_received() const55   size_t messages_received() const { return messages_received_; }
56 
ResetOnStateChangeCount()57   void ResetOnStateChangeCount() { on_state_change_count_ = 0; }
58 
ResetOnBufferedAmountChangeCount()59   void ResetOnBufferedAmountChangeCount() {
60     on_buffered_amount_change_count_ = 0;
61   }
62 
on_state_change_count() const63   size_t on_state_change_count() const { return on_state_change_count_; }
64 
on_buffered_amount_change_count() const65   size_t on_buffered_amount_change_count() const {
66     return on_buffered_amount_change_count_;
67   }
68 
69  private:
70   size_t messages_received_;
71   size_t on_state_change_count_;
72   size_t on_buffered_amount_change_count_;
73 };
74 
75 // TODO(deadbeef): The fact that these tests use a fake controller makes them
76 // not too valuable. Should rewrite using the
77 // peerconnection_datachannel_unittest.cc infrastructure.
78 // TODO(bugs.webrtc.org/11547): Incorporate a dedicated network thread.
79 class SctpDataChannelTest : public ::testing::Test {
80  protected:
SctpDataChannelTest()81   SctpDataChannelTest()
82       : controller_(new FakeDataChannelController()),
83         webrtc_data_channel_(SctpDataChannel::Create(controller_.get(),
84                                                      "test",
85                                                      init_,
86                                                      rtc::Thread::Current(),
87                                                      rtc::Thread::Current())) {}
88 
SetChannelReady()89   void SetChannelReady() {
90     controller_->set_transport_available(true);
91     webrtc_data_channel_->OnTransportChannelCreated();
92     if (webrtc_data_channel_->id() < 0) {
93       webrtc_data_channel_->SetSctpSid(0);
94     }
95     controller_->set_ready_to_send(true);
96   }
97 
AddObserver()98   void AddObserver() {
99     observer_.reset(new FakeDataChannelObserver());
100     webrtc_data_channel_->RegisterObserver(observer_.get());
101   }
102 
103   rtc::AutoThread main_thread_;
104   webrtc::InternalDataChannelInit init_;
105   std::unique_ptr<FakeDataChannelController> controller_;
106   std::unique_ptr<FakeDataChannelObserver> observer_;
107   rtc::scoped_refptr<SctpDataChannel> webrtc_data_channel_;
108 };
109 
110 class StateSignalsListener : public sigslot::has_slots<> {
111  public:
opened_count() const112   int opened_count() const { return opened_count_; }
closed_count() const113   int closed_count() const { return closed_count_; }
114 
OnSignalOpened(DataChannelInterface * data_channel)115   void OnSignalOpened(DataChannelInterface* data_channel) { ++opened_count_; }
116 
OnSignalClosed(DataChannelInterface * data_channel)117   void OnSignalClosed(DataChannelInterface* data_channel) { ++closed_count_; }
118 
119  private:
120   int opened_count_ = 0;
121   int closed_count_ = 0;
122 };
123 
124 // Verifies that the data channel is connected to the transport after creation.
TEST_F(SctpDataChannelTest,ConnectedToTransportOnCreated)125 TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
126   controller_->set_transport_available(true);
127   rtc::scoped_refptr<SctpDataChannel> dc =
128       SctpDataChannel::Create(controller_.get(), "test1", init_,
129                               rtc::Thread::Current(), rtc::Thread::Current());
130 
131   EXPECT_TRUE(controller_->IsConnected(dc.get()));
132   // The sid is not set yet, so it should not have added the streams.
133   EXPECT_FALSE(controller_->IsSendStreamAdded(dc->id()));
134   EXPECT_FALSE(controller_->IsRecvStreamAdded(dc->id()));
135 
136   dc->SetSctpSid(0);
137   EXPECT_TRUE(controller_->IsSendStreamAdded(dc->id()));
138   EXPECT_TRUE(controller_->IsRecvStreamAdded(dc->id()));
139 }
140 
141 // Verifies that the data channel is connected to the transport if the transport
142 // is not available initially and becomes available later.
TEST_F(SctpDataChannelTest,ConnectedAfterTransportBecomesAvailable)143 TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) {
144   EXPECT_FALSE(controller_->IsConnected(webrtc_data_channel_.get()));
145 
146   controller_->set_transport_available(true);
147   webrtc_data_channel_->OnTransportChannelCreated();
148   EXPECT_TRUE(controller_->IsConnected(webrtc_data_channel_.get()));
149 }
150 
151 // Tests the state of the data channel.
TEST_F(SctpDataChannelTest,StateTransition)152 TEST_F(SctpDataChannelTest, StateTransition) {
153   StateSignalsListener state_signals_listener;
154   webrtc_data_channel_->SignalOpened.connect(
155       &state_signals_listener, &StateSignalsListener::OnSignalOpened);
156   webrtc_data_channel_->SignalClosed.connect(
157       &state_signals_listener, &StateSignalsListener::OnSignalClosed);
158   EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
159             webrtc_data_channel_->state());
160   EXPECT_EQ(state_signals_listener.opened_count(), 0);
161   EXPECT_EQ(state_signals_listener.closed_count(), 0);
162   SetChannelReady();
163 
164   EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
165   EXPECT_EQ(state_signals_listener.opened_count(), 1);
166   EXPECT_EQ(state_signals_listener.closed_count(), 0);
167   webrtc_data_channel_->Close();
168   EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
169             webrtc_data_channel_->state());
170   EXPECT_TRUE(webrtc_data_channel_->error().ok());
171   EXPECT_EQ(state_signals_listener.opened_count(), 1);
172   EXPECT_EQ(state_signals_listener.closed_count(), 1);
173   // Verifies that it's disconnected from the transport.
174   EXPECT_FALSE(controller_->IsConnected(webrtc_data_channel_.get()));
175 }
176 
177 // Tests that DataChannel::buffered_amount() is correct after the channel is
178 // blocked.
TEST_F(SctpDataChannelTest,BufferedAmountWhenBlocked)179 TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
180   AddObserver();
181   SetChannelReady();
182   webrtc::DataBuffer buffer("abcd");
183   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
184   size_t successful_send_count = 1;
185 
186   EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
187   EXPECT_EQ(successful_send_count,
188             observer_->on_buffered_amount_change_count());
189 
190   controller_->set_send_blocked(true);
191 
192   const int number_of_packets = 3;
193   for (int i = 0; i < number_of_packets; ++i) {
194     EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
195   }
196   EXPECT_EQ(buffer.data.size() * number_of_packets,
197             webrtc_data_channel_->buffered_amount());
198   EXPECT_EQ(successful_send_count,
199             observer_->on_buffered_amount_change_count());
200 
201   controller_->set_send_blocked(false);
202   successful_send_count += number_of_packets;
203   EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
204   EXPECT_EQ(successful_send_count,
205             observer_->on_buffered_amount_change_count());
206 }
207 
208 // Tests that the queued data are sent when the channel transitions from blocked
209 // to unblocked.
TEST_F(SctpDataChannelTest,QueuedDataSentWhenUnblocked)210 TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
211   AddObserver();
212   SetChannelReady();
213   webrtc::DataBuffer buffer("abcd");
214   controller_->set_send_blocked(true);
215   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
216 
217   EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
218 
219   controller_->set_send_blocked(false);
220   SetChannelReady();
221   EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
222   EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
223 }
224 
225 // Tests that no crash when the channel is blocked right away while trying to
226 // send queued data.
TEST_F(SctpDataChannelTest,BlockedWhenSendQueuedDataNoCrash)227 TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
228   AddObserver();
229   SetChannelReady();
230   webrtc::DataBuffer buffer("abcd");
231   controller_->set_send_blocked(true);
232   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
233   EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
234 
235   // Set channel ready while it is still blocked.
236   SetChannelReady();
237   EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount());
238   EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
239 
240   // Unblock the channel to send queued data again, there should be no crash.
241   controller_->set_send_blocked(false);
242   SetChannelReady();
243   EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
244   EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
245 }
246 
247 // Tests that DataChannel::messages_sent() and DataChannel::bytes_sent() are
248 // correct, sending data both while unblocked and while blocked.
TEST_F(SctpDataChannelTest,VerifyMessagesAndBytesSent)249 TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesSent) {
250   AddObserver();
251   SetChannelReady();
252   std::vector<webrtc::DataBuffer> buffers({
253       webrtc::DataBuffer("message 1"),
254       webrtc::DataBuffer("msg 2"),
255       webrtc::DataBuffer("message three"),
256       webrtc::DataBuffer("quadra message"),
257       webrtc::DataBuffer("fifthmsg"),
258       webrtc::DataBuffer("message of the beast"),
259   });
260 
261   // Default values.
262   EXPECT_EQ(0U, webrtc_data_channel_->messages_sent());
263   EXPECT_EQ(0U, webrtc_data_channel_->bytes_sent());
264 
265   // Send three buffers while not blocked.
266   controller_->set_send_blocked(false);
267   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[0]));
268   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[1]));
269   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[2]));
270   size_t bytes_sent = buffers[0].size() + buffers[1].size() + buffers[2].size();
271   EXPECT_EQ_WAIT(0U, webrtc_data_channel_->buffered_amount(), kDefaultTimeout);
272   EXPECT_EQ(3U, webrtc_data_channel_->messages_sent());
273   EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
274 
275   // Send three buffers while blocked, queuing the buffers.
276   controller_->set_send_blocked(true);
277   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[3]));
278   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[4]));
279   EXPECT_TRUE(webrtc_data_channel_->Send(buffers[5]));
280   size_t bytes_queued =
281       buffers[3].size() + buffers[4].size() + buffers[5].size();
282   EXPECT_EQ(bytes_queued, webrtc_data_channel_->buffered_amount());
283   EXPECT_EQ(3U, webrtc_data_channel_->messages_sent());
284   EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
285 
286   // Unblock and make sure everything was sent.
287   controller_->set_send_blocked(false);
288   EXPECT_EQ_WAIT(0U, webrtc_data_channel_->buffered_amount(), kDefaultTimeout);
289   bytes_sent += bytes_queued;
290   EXPECT_EQ(6U, webrtc_data_channel_->messages_sent());
291   EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
292 }
293 
294 // Tests that the queued control message is sent when channel is ready.
TEST_F(SctpDataChannelTest,OpenMessageSent)295 TEST_F(SctpDataChannelTest, OpenMessageSent) {
296   // Initially the id is unassigned.
297   EXPECT_EQ(-1, webrtc_data_channel_->id());
298 
299   SetChannelReady();
300   EXPECT_GE(webrtc_data_channel_->id(), 0);
301   EXPECT_EQ(webrtc::DataMessageType::kControl,
302             controller_->last_send_data_params().type);
303   EXPECT_EQ(controller_->last_sid(), webrtc_data_channel_->id());
304 }
305 
TEST_F(SctpDataChannelTest,QueuedOpenMessageSent)306 TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
307   controller_->set_send_blocked(true);
308   SetChannelReady();
309   controller_->set_send_blocked(false);
310 
311   EXPECT_EQ(webrtc::DataMessageType::kControl,
312             controller_->last_send_data_params().type);
313   EXPECT_EQ(controller_->last_sid(), webrtc_data_channel_->id());
314 }
315 
316 // Tests that the DataChannel created after transport gets ready can enter OPEN
317 // state.
TEST_F(SctpDataChannelTest,LateCreatedChannelTransitionToOpen)318 TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
319   SetChannelReady();
320   webrtc::InternalDataChannelInit init;
321   init.id = 1;
322   rtc::scoped_refptr<SctpDataChannel> dc =
323       SctpDataChannel::Create(controller_.get(), "test1", init,
324                               rtc::Thread::Current(), rtc::Thread::Current());
325   EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state());
326   EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(), 1000);
327 }
328 
329 // Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
330 // message is received.
TEST_F(SctpDataChannelTest,SendUnorderedAfterReceivesOpenAck)331 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
332   SetChannelReady();
333   webrtc::InternalDataChannelInit init;
334   init.id = 1;
335   init.ordered = false;
336   rtc::scoped_refptr<SctpDataChannel> dc =
337       SctpDataChannel::Create(controller_.get(), "test1", init,
338                               rtc::Thread::Current(), rtc::Thread::Current());
339 
340   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
341 
342   // Sends a message and verifies it's ordered.
343   webrtc::DataBuffer buffer("some data");
344   ASSERT_TRUE(dc->Send(buffer));
345   EXPECT_TRUE(controller_->last_send_data_params().ordered);
346 
347   // Emulates receiving an OPEN_ACK message.
348   cricket::ReceiveDataParams params;
349   params.sid = init.id;
350   params.type = webrtc::DataMessageType::kControl;
351   rtc::CopyOnWriteBuffer payload;
352   webrtc::WriteDataChannelOpenAckMessage(&payload);
353   dc->OnDataReceived(params, payload);
354 
355   // Sends another message and verifies it's unordered.
356   ASSERT_TRUE(dc->Send(buffer));
357   EXPECT_FALSE(controller_->last_send_data_params().ordered);
358 }
359 
360 // Tests that an unordered DataChannel sends unordered data after any DATA
361 // message is received.
TEST_F(SctpDataChannelTest,SendUnorderedAfterReceiveData)362 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
363   SetChannelReady();
364   webrtc::InternalDataChannelInit init;
365   init.id = 1;
366   init.ordered = false;
367   rtc::scoped_refptr<SctpDataChannel> dc =
368       SctpDataChannel::Create(controller_.get(), "test1", init,
369                               rtc::Thread::Current(), rtc::Thread::Current());
370 
371   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
372 
373   // Emulates receiving a DATA message.
374   cricket::ReceiveDataParams params;
375   params.sid = init.id;
376   params.type = webrtc::DataMessageType::kText;
377   webrtc::DataBuffer buffer("data");
378   dc->OnDataReceived(params, buffer.data);
379 
380   // Sends a message and verifies it's unordered.
381   ASSERT_TRUE(dc->Send(buffer));
382   EXPECT_FALSE(controller_->last_send_data_params().ordered);
383 }
384 
385 // Tests that the channel can't open until it's successfully sent the OPEN
386 // message.
TEST_F(SctpDataChannelTest,OpenWaitsForOpenMesssage)387 TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
388   webrtc::DataBuffer buffer("foo");
389 
390   controller_->set_send_blocked(true);
391   SetChannelReady();
392   EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
393             webrtc_data_channel_->state());
394   controller_->set_send_blocked(false);
395   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
396                  webrtc_data_channel_->state(), 1000);
397   EXPECT_EQ(webrtc::DataMessageType::kControl,
398             controller_->last_send_data_params().type);
399 }
400 
401 // Tests that close first makes sure all queued data gets sent.
TEST_F(SctpDataChannelTest,QueuedCloseFlushes)402 TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
403   webrtc::DataBuffer buffer("foo");
404 
405   controller_->set_send_blocked(true);
406   SetChannelReady();
407   EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
408             webrtc_data_channel_->state());
409   controller_->set_send_blocked(false);
410   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
411                  webrtc_data_channel_->state(), 1000);
412   controller_->set_send_blocked(true);
413   webrtc_data_channel_->Send(buffer);
414   webrtc_data_channel_->Close();
415   controller_->set_send_blocked(false);
416   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
417                  webrtc_data_channel_->state(), 1000);
418   EXPECT_TRUE(webrtc_data_channel_->error().ok());
419   EXPECT_EQ(webrtc::DataMessageType::kText,
420             controller_->last_send_data_params().type);
421 }
422 
423 // Tests that messages are sent with the right id.
TEST_F(SctpDataChannelTest,SendDataId)424 TEST_F(SctpDataChannelTest, SendDataId) {
425   webrtc_data_channel_->SetSctpSid(1);
426   SetChannelReady();
427   webrtc::DataBuffer buffer("data");
428   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
429   EXPECT_EQ(1, controller_->last_sid());
430 }
431 
432 // Tests that the incoming messages with wrong ids are rejected.
TEST_F(SctpDataChannelTest,ReceiveDataWithInvalidId)433 TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidId) {
434   webrtc_data_channel_->SetSctpSid(1);
435   SetChannelReady();
436 
437   AddObserver();
438 
439   cricket::ReceiveDataParams params;
440   params.sid = 0;
441   webrtc::DataBuffer buffer("abcd");
442   webrtc_data_channel_->OnDataReceived(params, buffer.data);
443 
444   EXPECT_EQ(0U, observer_->messages_received());
445 }
446 
447 // Tests that the incoming messages with right ids are accepted.
TEST_F(SctpDataChannelTest,ReceiveDataWithValidId)448 TEST_F(SctpDataChannelTest, ReceiveDataWithValidId) {
449   webrtc_data_channel_->SetSctpSid(1);
450   SetChannelReady();
451 
452   AddObserver();
453 
454   cricket::ReceiveDataParams params;
455   params.sid = 1;
456   webrtc::DataBuffer buffer("abcd");
457 
458   webrtc_data_channel_->OnDataReceived(params, buffer.data);
459   EXPECT_EQ(1U, observer_->messages_received());
460 }
461 
462 // Tests that no CONTROL message is sent if the datachannel is negotiated and
463 // not created from an OPEN message.
TEST_F(SctpDataChannelTest,NoMsgSentIfNegotiatedAndNotFromOpenMsg)464 TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
465   webrtc::InternalDataChannelInit config;
466   config.id = 1;
467   config.negotiated = true;
468   config.open_handshake_role = webrtc::InternalDataChannelInit::kNone;
469 
470   SetChannelReady();
471   rtc::scoped_refptr<SctpDataChannel> dc =
472       SctpDataChannel::Create(controller_.get(), "test1", config,
473                               rtc::Thread::Current(), rtc::Thread::Current());
474 
475   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
476   EXPECT_EQ(0, controller_->last_sid());
477 }
478 
479 // Tests that DataChannel::messages_received() and DataChannel::bytes_received()
480 // are correct, receiving data both while not open and while open.
TEST_F(SctpDataChannelTest,VerifyMessagesAndBytesReceived)481 TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesReceived) {
482   AddObserver();
483   std::vector<webrtc::DataBuffer> buffers({
484       webrtc::DataBuffer("message 1"),
485       webrtc::DataBuffer("msg 2"),
486       webrtc::DataBuffer("message three"),
487       webrtc::DataBuffer("quadra message"),
488       webrtc::DataBuffer("fifthmsg"),
489       webrtc::DataBuffer("message of the beast"),
490   });
491 
492   webrtc_data_channel_->SetSctpSid(1);
493   cricket::ReceiveDataParams params;
494   params.sid = 1;
495 
496   // Default values.
497   EXPECT_EQ(0U, webrtc_data_channel_->messages_received());
498   EXPECT_EQ(0U, webrtc_data_channel_->bytes_received());
499 
500   // Receive three buffers while data channel isn't open.
501   webrtc_data_channel_->OnDataReceived(params, buffers[0].data);
502   webrtc_data_channel_->OnDataReceived(params, buffers[1].data);
503   webrtc_data_channel_->OnDataReceived(params, buffers[2].data);
504   EXPECT_EQ(0U, observer_->messages_received());
505   EXPECT_EQ(0U, webrtc_data_channel_->messages_received());
506   EXPECT_EQ(0U, webrtc_data_channel_->bytes_received());
507 
508   // Open channel and make sure everything was received.
509   SetChannelReady();
510   size_t bytes_received =
511       buffers[0].size() + buffers[1].size() + buffers[2].size();
512   EXPECT_EQ(3U, observer_->messages_received());
513   EXPECT_EQ(3U, webrtc_data_channel_->messages_received());
514   EXPECT_EQ(bytes_received, webrtc_data_channel_->bytes_received());
515 
516   // Receive three buffers while open.
517   webrtc_data_channel_->OnDataReceived(params, buffers[3].data);
518   webrtc_data_channel_->OnDataReceived(params, buffers[4].data);
519   webrtc_data_channel_->OnDataReceived(params, buffers[5].data);
520   bytes_received += buffers[3].size() + buffers[4].size() + buffers[5].size();
521   EXPECT_EQ(6U, observer_->messages_received());
522   EXPECT_EQ(6U, webrtc_data_channel_->messages_received());
523   EXPECT_EQ(bytes_received, webrtc_data_channel_->bytes_received());
524 }
525 
526 // Tests that OPEN_ACK message is sent if the datachannel is created from an
527 // OPEN message.
TEST_F(SctpDataChannelTest,OpenAckSentIfCreatedFromOpenMessage)528 TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
529   webrtc::InternalDataChannelInit config;
530   config.id = 1;
531   config.negotiated = true;
532   config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker;
533 
534   SetChannelReady();
535   rtc::scoped_refptr<SctpDataChannel> dc =
536       SctpDataChannel::Create(controller_.get(), "test1", config,
537                               rtc::Thread::Current(), rtc::Thread::Current());
538 
539   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
540 
541   EXPECT_EQ(config.id, controller_->last_sid());
542   EXPECT_EQ(webrtc::DataMessageType::kControl,
543             controller_->last_send_data_params().type);
544 }
545 
546 // Tests the OPEN_ACK role assigned by InternalDataChannelInit.
TEST_F(SctpDataChannelTest,OpenAckRoleInitialization)547 TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
548   webrtc::InternalDataChannelInit init;
549   EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role);
550   EXPECT_FALSE(init.negotiated);
551 
552   webrtc::DataChannelInit base;
553   base.negotiated = true;
554   webrtc::InternalDataChannelInit init2(base);
555   EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role);
556 }
557 
558 // Tests that that Send() returns false if the sending buffer is full
559 // and the channel stays open.
TEST_F(SctpDataChannelTest,OpenWhenSendBufferFull)560 TEST_F(SctpDataChannelTest, OpenWhenSendBufferFull) {
561   SetChannelReady();
562 
563   const size_t packetSize = 1024;
564 
565   rtc::CopyOnWriteBuffer buffer(packetSize);
566   memset(buffer.MutableData(), 0, buffer.size());
567 
568   webrtc::DataBuffer packet(buffer, true);
569   controller_->set_send_blocked(true);
570 
571   for (size_t i = 0;
572        i < webrtc::DataChannelInterface::MaxSendQueueSize() / packetSize; ++i) {
573     EXPECT_TRUE(webrtc_data_channel_->Send(packet));
574   }
575 
576   // The sending buffer shoul be full, send returns false.
577   EXPECT_FALSE(webrtc_data_channel_->Send(packet));
578 
579   EXPECT_TRUE(webrtc::DataChannelInterface::kOpen ==
580               webrtc_data_channel_->state());
581 }
582 
583 // Tests that the DataChannel is closed on transport errors.
TEST_F(SctpDataChannelTest,ClosedOnTransportError)584 TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
585   SetChannelReady();
586   webrtc::DataBuffer buffer("abcd");
587   controller_->set_transport_error();
588 
589   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
590 
591   EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
592             webrtc_data_channel_->state());
593   EXPECT_FALSE(webrtc_data_channel_->error().ok());
594   EXPECT_EQ(webrtc::RTCErrorType::NETWORK_ERROR,
595             webrtc_data_channel_->error().type());
596   EXPECT_EQ(webrtc::RTCErrorDetailType::NONE,
597             webrtc_data_channel_->error().error_detail());
598 }
599 
600 // Tests that the DataChannel is closed if the received buffer is full.
TEST_F(SctpDataChannelTest,ClosedWhenReceivedBufferFull)601 TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) {
602   SetChannelReady();
603   rtc::CopyOnWriteBuffer buffer(1024);
604   memset(buffer.MutableData(), 0, buffer.size());
605 
606   cricket::ReceiveDataParams params;
607   params.sid = 0;
608 
609   // Receiving data without having an observer will overflow the buffer.
610   for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
611     webrtc_data_channel_->OnDataReceived(params, buffer);
612   }
613   EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
614             webrtc_data_channel_->state());
615   EXPECT_FALSE(webrtc_data_channel_->error().ok());
616   EXPECT_EQ(webrtc::RTCErrorType::RESOURCE_EXHAUSTED,
617             webrtc_data_channel_->error().type());
618   EXPECT_EQ(webrtc::RTCErrorDetailType::NONE,
619             webrtc_data_channel_->error().error_detail());
620 }
621 
622 // Tests that sending empty data returns no error and keeps the channel open.
TEST_F(SctpDataChannelTest,SendEmptyData)623 TEST_F(SctpDataChannelTest, SendEmptyData) {
624   webrtc_data_channel_->SetSctpSid(1);
625   SetChannelReady();
626   EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
627 
628   webrtc::DataBuffer buffer("");
629   EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
630   EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
631 }
632 
633 // Tests that a channel can be closed without being opened or assigned an sid.
TEST_F(SctpDataChannelTest,NeverOpened)634 TEST_F(SctpDataChannelTest, NeverOpened) {
635   controller_->set_transport_available(true);
636   webrtc_data_channel_->OnTransportChannelCreated();
637   webrtc_data_channel_->Close();
638 }
639 
640 // Test that the data channel goes to the "closed" state (and doesn't crash)
641 // when its transport goes away, even while data is buffered.
TEST_F(SctpDataChannelTest,TransportDestroyedWhileDataBuffered)642 TEST_F(SctpDataChannelTest, TransportDestroyedWhileDataBuffered) {
643   SetChannelReady();
644 
645   rtc::CopyOnWriteBuffer buffer(1024);
646   memset(buffer.MutableData(), 0, buffer.size());
647   webrtc::DataBuffer packet(buffer, true);
648 
649   // Send a packet while sending is blocked so it ends up buffered.
650   controller_->set_send_blocked(true);
651   EXPECT_TRUE(webrtc_data_channel_->Send(packet));
652 
653   // Tell the data channel that its transport is being destroyed.
654   // It should then stop using the transport (allowing us to delete it) and
655   // transition to the "closed" state.
656   webrtc::RTCError error(webrtc::RTCErrorType::OPERATION_ERROR_WITH_DATA, "");
657   error.set_error_detail(webrtc::RTCErrorDetailType::SCTP_FAILURE);
658   webrtc_data_channel_->OnTransportChannelClosed(error);
659   controller_.reset(nullptr);
660   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
661                  webrtc_data_channel_->state(), kDefaultTimeout);
662   EXPECT_FALSE(webrtc_data_channel_->error().ok());
663   EXPECT_EQ(webrtc::RTCErrorType::OPERATION_ERROR_WITH_DATA,
664             webrtc_data_channel_->error().type());
665   EXPECT_EQ(webrtc::RTCErrorDetailType::SCTP_FAILURE,
666             webrtc_data_channel_->error().error_detail());
667 }
668 
TEST_F(SctpDataChannelTest,TransportGotErrorCode)669 TEST_F(SctpDataChannelTest, TransportGotErrorCode) {
670   SetChannelReady();
671 
672   // Tell the data channel that its transport is being destroyed with an
673   // error code.
674   // It should then report that error code.
675   webrtc::RTCError error(webrtc::RTCErrorType::OPERATION_ERROR_WITH_DATA,
676                          "Transport channel closed");
677   error.set_error_detail(webrtc::RTCErrorDetailType::SCTP_FAILURE);
678   error.set_sctp_cause_code(
679       static_cast<uint16_t>(cricket::SctpErrorCauseCode::kProtocolViolation));
680   webrtc_data_channel_->OnTransportChannelClosed(error);
681   controller_.reset(nullptr);
682   EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
683                  webrtc_data_channel_->state(), kDefaultTimeout);
684   EXPECT_FALSE(webrtc_data_channel_->error().ok());
685   EXPECT_EQ(webrtc::RTCErrorType::OPERATION_ERROR_WITH_DATA,
686             webrtc_data_channel_->error().type());
687   EXPECT_EQ(webrtc::RTCErrorDetailType::SCTP_FAILURE,
688             webrtc_data_channel_->error().error_detail());
689   EXPECT_EQ(
690       static_cast<uint16_t>(cricket::SctpErrorCauseCode::kProtocolViolation),
691       webrtc_data_channel_->error().sctp_cause_code());
692 }
693 
694 class SctpSidAllocatorTest : public ::testing::Test {
695  protected:
696   SctpSidAllocator allocator_;
697 };
698 
699 // Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for
700 // SSL_SERVER.
TEST_F(SctpSidAllocatorTest,SctpIdAllocationBasedOnRole)701 TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) {
702   int id;
703   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
704   EXPECT_EQ(1, id);
705   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
706   EXPECT_EQ(0, id);
707   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
708   EXPECT_EQ(3, id);
709   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
710   EXPECT_EQ(2, id);
711 }
712 
713 // Verifies that SCTP ids of existing DataChannels are not reused.
TEST_F(SctpSidAllocatorTest,SctpIdAllocationNoReuse)714 TEST_F(SctpSidAllocatorTest, SctpIdAllocationNoReuse) {
715   int old_id = 1;
716   EXPECT_TRUE(allocator_.ReserveSid(old_id));
717 
718   int new_id;
719   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &new_id));
720   EXPECT_NE(old_id, new_id);
721 
722   old_id = 0;
723   EXPECT_TRUE(allocator_.ReserveSid(old_id));
724   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &new_id));
725   EXPECT_NE(old_id, new_id);
726 }
727 
728 // Verifies that SCTP ids of removed DataChannels can be reused.
TEST_F(SctpSidAllocatorTest,SctpIdReusedForRemovedDataChannel)729 TEST_F(SctpSidAllocatorTest, SctpIdReusedForRemovedDataChannel) {
730   int odd_id = 1;
731   int even_id = 0;
732   EXPECT_TRUE(allocator_.ReserveSid(odd_id));
733   EXPECT_TRUE(allocator_.ReserveSid(even_id));
734 
735   int allocated_id = -1;
736   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
737   EXPECT_EQ(odd_id + 2, allocated_id);
738 
739   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
740   EXPECT_EQ(even_id + 2, allocated_id);
741 
742   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
743   EXPECT_EQ(odd_id + 4, allocated_id);
744 
745   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
746   EXPECT_EQ(even_id + 4, allocated_id);
747 
748   allocator_.ReleaseSid(odd_id);
749   allocator_.ReleaseSid(even_id);
750 
751   // Verifies that removed ids are reused.
752   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
753   EXPECT_EQ(odd_id, allocated_id);
754 
755   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
756   EXPECT_EQ(even_id, allocated_id);
757 
758   // Verifies that used higher ids are not reused.
759   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
760   EXPECT_EQ(odd_id + 6, allocated_id);
761 
762   EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
763   EXPECT_EQ(even_id + 6, allocated_id);
764 }
765