Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: talk/app/webrtc/datachannel_unittest.cc

Issue 1610243002: Move talk/app/webrtc to webrtc/api (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed processing of api.gyp for Chromium builds Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « talk/app/webrtc/datachannel.cc ('k') | talk/app/webrtc/datachannelinterface.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * libjingle
3 * Copyright 2013 Google Inc.
4 *
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"
29 #include "talk/app/webrtc/sctputils.h"
30 #include "talk/app/webrtc/test/fakedatachannelprovider.h"
31 #include "webrtc/base/gunit.h"
32
33 using webrtc::DataChannel;
34 using webrtc::SctpSidAllocator;
35
36 class FakeDataChannelObserver : public webrtc::DataChannelObserver {
37 public:
38 FakeDataChannelObserver()
39 : messages_received_(0),
40 on_state_change_count_(0),
41 on_buffered_amount_change_count_(0) {}
42
43 void OnStateChange() {
44 ++on_state_change_count_;
45 }
46
47 void OnBufferedAmountChange(uint64_t previous_amount) {
48 ++on_buffered_amount_change_count_;
49 }
50
51 void OnMessage(const webrtc::DataBuffer& buffer) {
52 ++messages_received_;
53 }
54
55 size_t messages_received() const {
56 return messages_received_;
57 }
58
59 void ResetOnStateChangeCount() {
60 on_state_change_count_ = 0;
61 }
62
63 void ResetOnBufferedAmountChangeCount() {
64 on_buffered_amount_change_count_ = 0;
65 }
66
67 size_t on_state_change_count() const {
68 return on_state_change_count_;
69 }
70
71 size_t on_buffered_amount_change_count() const {
72 return on_buffered_amount_change_count_;
73 }
74
75 private:
76 size_t messages_received_;
77 size_t on_state_change_count_;
78 size_t on_buffered_amount_change_count_;
79 };
80
81 class SctpDataChannelTest : public testing::Test {
82 protected:
83 SctpDataChannelTest()
84 : webrtc_data_channel_(
85 DataChannel::Create(
86 &provider_, cricket::DCT_SCTP, "test", init_)) {
87 }
88
89 void SetChannelReady() {
90 provider_.set_transport_available(true);
91 webrtc_data_channel_->OnTransportChannelCreated();
92 if (webrtc_data_channel_->id() < 0) {
93 webrtc_data_channel_->SetSctpSid(0);
94 }
95 provider_.set_ready_to_send(true);
96 }
97
98 void AddObserver() {
99 observer_.reset(new FakeDataChannelObserver());
100 webrtc_data_channel_->RegisterObserver(observer_.get());
101 }
102
103 webrtc::InternalDataChannelInit init_;
104 FakeDataChannelProvider provider_;
105 rtc::scoped_ptr<FakeDataChannelObserver> observer_;
106 rtc::scoped_refptr<DataChannel> webrtc_data_channel_;
107 };
108
109 // Verifies that the data channel is connected to the transport after creation.
110 TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
111 provider_.set_transport_available(true);
112 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
113 &provider_, cricket::DCT_SCTP, "test1", init_);
114
115 EXPECT_TRUE(provider_.IsConnected(dc.get()));
116 // The sid is not set yet, so it should not have added the streams.
117 EXPECT_FALSE(provider_.IsSendStreamAdded(dc->id()));
118 EXPECT_FALSE(provider_.IsRecvStreamAdded(dc->id()));
119
120 dc->SetSctpSid(0);
121 EXPECT_TRUE(provider_.IsSendStreamAdded(dc->id()));
122 EXPECT_TRUE(provider_.IsRecvStreamAdded(dc->id()));
123 }
124
125 // Verifies that the data channel is connected to the transport if the transport
126 // is not available initially and becomes available later.
127 TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) {
128 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get()));
129
130 provider_.set_transport_available(true);
131 webrtc_data_channel_->OnTransportChannelCreated();
132 EXPECT_TRUE(provider_.IsConnected(webrtc_data_channel_.get()));
133 }
134
135 // Tests the state of the data channel.
136 TEST_F(SctpDataChannelTest, StateTransition) {
137 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
138 webrtc_data_channel_->state());
139 SetChannelReady();
140
141 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
142 webrtc_data_channel_->Close();
143 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
144 webrtc_data_channel_->state());
145 // Verifies that it's disconnected from the transport.
146 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get()));
147 }
148
149 // Tests that DataChannel::buffered_amount() is correct after the channel is
150 // blocked.
151 TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
152 AddObserver();
153 SetChannelReady();
154 webrtc::DataBuffer buffer("abcd");
155 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
156
157 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
158 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
159
160 provider_.set_send_blocked(true);
161
162 const int number_of_packets = 3;
163 for (int i = 0; i < number_of_packets; ++i) {
164 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
165 }
166 EXPECT_EQ(buffer.data.size() * number_of_packets,
167 webrtc_data_channel_->buffered_amount());
168 EXPECT_EQ(number_of_packets, observer_->on_buffered_amount_change_count());
169 }
170
171 // Tests that the queued data are sent when the channel transitions from blocked
172 // to unblocked.
173 TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
174 AddObserver();
175 SetChannelReady();
176 webrtc::DataBuffer buffer("abcd");
177 provider_.set_send_blocked(true);
178 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
179
180 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
181
182 provider_.set_send_blocked(false);
183 SetChannelReady();
184 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
185 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
186 }
187
188 // Tests that no crash when the channel is blocked right away while trying to
189 // send queued data.
190 TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
191 AddObserver();
192 SetChannelReady();
193 webrtc::DataBuffer buffer("abcd");
194 provider_.set_send_blocked(true);
195 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
196 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
197
198 // Set channel ready while it is still blocked.
199 SetChannelReady();
200 EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount());
201 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
202
203 // Unblock the channel to send queued data again, there should be no crash.
204 provider_.set_send_blocked(false);
205 SetChannelReady();
206 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
207 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
208 }
209
210 // Tests that the queued control message is sent when channel is ready.
211 TEST_F(SctpDataChannelTest, OpenMessageSent) {
212 // Initially the id is unassigned.
213 EXPECT_EQ(-1, webrtc_data_channel_->id());
214
215 SetChannelReady();
216 EXPECT_GE(webrtc_data_channel_->id(), 0);
217 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
218 EXPECT_EQ(provider_.last_send_data_params().ssrc,
219 static_cast<uint32_t>(webrtc_data_channel_->id()));
220 }
221
222 TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
223 provider_.set_send_blocked(true);
224 SetChannelReady();
225 provider_.set_send_blocked(false);
226
227 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
228 EXPECT_EQ(provider_.last_send_data_params().ssrc,
229 static_cast<uint32_t>(webrtc_data_channel_->id()));
230 }
231
232 // Tests that the DataChannel created after transport gets ready can enter OPEN
233 // state.
234 TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
235 SetChannelReady();
236 webrtc::InternalDataChannelInit init;
237 init.id = 1;
238 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
239 &provider_, cricket::DCT_SCTP, "test1", init);
240 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state());
241 EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(),
242 1000);
243 }
244
245 // Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
246 // message is received.
247 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
248 SetChannelReady();
249 webrtc::InternalDataChannelInit init;
250 init.id = 1;
251 init.ordered = false;
252 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
253 &provider_, cricket::DCT_SCTP, "test1", init);
254
255 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
256
257 // Sends a message and verifies it's ordered.
258 webrtc::DataBuffer buffer("some data");
259 ASSERT_TRUE(dc->Send(buffer));
260 EXPECT_TRUE(provider_.last_send_data_params().ordered);
261
262 // Emulates receiving an OPEN_ACK message.
263 cricket::ReceiveDataParams params;
264 params.ssrc = init.id;
265 params.type = cricket::DMT_CONTROL;
266 rtc::Buffer payload;
267 webrtc::WriteDataChannelOpenAckMessage(&payload);
268 dc->OnDataReceived(NULL, params, payload);
269
270 // Sends another message and verifies it's unordered.
271 ASSERT_TRUE(dc->Send(buffer));
272 EXPECT_FALSE(provider_.last_send_data_params().ordered);
273 }
274
275 // Tests that an unordered DataChannel sends unordered data after any DATA
276 // message is received.
277 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
278 SetChannelReady();
279 webrtc::InternalDataChannelInit init;
280 init.id = 1;
281 init.ordered = false;
282 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
283 &provider_, cricket::DCT_SCTP, "test1", init);
284
285 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
286
287 // Emulates receiving a DATA message.
288 cricket::ReceiveDataParams params;
289 params.ssrc = init.id;
290 params.type = cricket::DMT_TEXT;
291 webrtc::DataBuffer buffer("data");
292 dc->OnDataReceived(NULL, params, buffer.data);
293
294 // Sends a message and verifies it's unordered.
295 ASSERT_TRUE(dc->Send(buffer));
296 EXPECT_FALSE(provider_.last_send_data_params().ordered);
297 }
298
299 // Tests that the channel can't open until it's successfully sent the OPEN
300 // message.
301 TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
302 webrtc::DataBuffer buffer("foo");
303
304 provider_.set_send_blocked(true);
305 SetChannelReady();
306 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
307 webrtc_data_channel_->state());
308 provider_.set_send_blocked(false);
309 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
310 webrtc_data_channel_->state(), 1000);
311 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
312 }
313
314 // Tests that close first makes sure all queued data gets sent.
315 TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
316 webrtc::DataBuffer buffer("foo");
317
318 provider_.set_send_blocked(true);
319 SetChannelReady();
320 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
321 webrtc_data_channel_->state());
322 provider_.set_send_blocked(false);
323 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
324 webrtc_data_channel_->state(), 1000);
325 provider_.set_send_blocked(true);
326 webrtc_data_channel_->Send(buffer);
327 webrtc_data_channel_->Close();
328 provider_.set_send_blocked(false);
329 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
330 webrtc_data_channel_->state(), 1000);
331 EXPECT_EQ(cricket::DMT_TEXT, provider_.last_send_data_params().type);
332 }
333
334 // Tests that messages are sent with the right ssrc.
335 TEST_F(SctpDataChannelTest, SendDataSsrc) {
336 webrtc_data_channel_->SetSctpSid(1);
337 SetChannelReady();
338 webrtc::DataBuffer buffer("data");
339 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
340 EXPECT_EQ(1U, provider_.last_send_data_params().ssrc);
341 }
342
343 // Tests that the incoming messages with wrong ssrcs are rejected.
344 TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) {
345 webrtc_data_channel_->SetSctpSid(1);
346 SetChannelReady();
347
348 AddObserver();
349
350 cricket::ReceiveDataParams params;
351 params.ssrc = 0;
352 webrtc::DataBuffer buffer("abcd");
353 webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data);
354
355 EXPECT_EQ(0U, observer_->messages_received());
356 }
357
358 // Tests that the incoming messages with right ssrcs are acceted.
359 TEST_F(SctpDataChannelTest, ReceiveDataWithValidSsrc) {
360 webrtc_data_channel_->SetSctpSid(1);
361 SetChannelReady();
362
363 AddObserver();
364
365 cricket::ReceiveDataParams params;
366 params.ssrc = 1;
367 webrtc::DataBuffer buffer("abcd");
368
369 webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data);
370 EXPECT_EQ(1U, observer_->messages_received());
371 }
372
373 // Tests that no CONTROL message is sent if the datachannel is negotiated and
374 // not created from an OPEN message.
375 TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
376 webrtc::InternalDataChannelInit config;
377 config.id = 1;
378 config.negotiated = true;
379 config.open_handshake_role = webrtc::InternalDataChannelInit::kNone;
380
381 SetChannelReady();
382 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
383 &provider_, cricket::DCT_SCTP, "test1", config);
384
385 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
386 EXPECT_EQ(0U, provider_.last_send_data_params().ssrc);
387 }
388
389 // Tests that OPEN_ACK message is sent if the datachannel is created from an
390 // OPEN message.
391 TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
392 webrtc::InternalDataChannelInit config;
393 config.id = 1;
394 config.negotiated = true;
395 config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker;
396
397 SetChannelReady();
398 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create(
399 &provider_, cricket::DCT_SCTP, "test1", config);
400
401 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
402
403 EXPECT_EQ(static_cast<unsigned int>(config.id),
404 provider_.last_send_data_params().ssrc);
405 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type);
406 }
407
408 // Tests the OPEN_ACK role assigned by InternalDataChannelInit.
409 TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
410 webrtc::InternalDataChannelInit init;
411 EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role);
412 EXPECT_FALSE(init.negotiated);
413
414 webrtc::DataChannelInit base;
415 base.negotiated = true;
416 webrtc::InternalDataChannelInit init2(base);
417 EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role);
418 }
419
420 // Tests that the DataChannel is closed if the sending buffer is full.
421 TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) {
422 SetChannelReady();
423
424 rtc::Buffer buffer(1024);
425 memset(buffer.data(), 0, buffer.size());
426
427 webrtc::DataBuffer packet(buffer, true);
428 provider_.set_send_blocked(true);
429
430 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
431 EXPECT_TRUE(webrtc_data_channel_->Send(packet));
432 }
433
434 EXPECT_TRUE(
435 webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() ||
436 webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state());
437 }
438
439 // Tests that the DataChannel is closed on transport errors.
440 TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
441 SetChannelReady();
442 webrtc::DataBuffer buffer("abcd");
443 provider_.set_transport_error();
444
445 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
446
447 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
448 webrtc_data_channel_->state());
449 }
450
451 // Tests that a already closed DataChannel does not fire onStateChange again.
452 TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) {
453 AddObserver();
454 webrtc_data_channel_->Close();
455 // OnStateChange called for kClosing and kClosed.
456 EXPECT_EQ(2U, observer_->on_state_change_count());
457
458 observer_->ResetOnStateChangeCount();
459 webrtc_data_channel_->RemotePeerRequestClose();
460 EXPECT_EQ(0U, observer_->on_state_change_count());
461 }
462
463 // Tests that RemotePeerRequestClose closes the local DataChannel.
464 TEST_F(SctpDataChannelTest, RemotePeerRequestClose) {
465 AddObserver();
466 webrtc_data_channel_->RemotePeerRequestClose();
467
468 // OnStateChange called for kClosing and kClosed.
469 EXPECT_EQ(2U, observer_->on_state_change_count());
470 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
471 webrtc_data_channel_->state());
472 }
473
474 // Tests that the DataChannel is closed if the received buffer is full.
475 TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) {
476 SetChannelReady();
477 rtc::Buffer buffer(1024);
478 memset(buffer.data(), 0, buffer.size());
479
480 cricket::ReceiveDataParams params;
481 params.ssrc = 0;
482
483 // Receiving data without having an observer will overflow the buffer.
484 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
485 webrtc_data_channel_->OnDataReceived(NULL, params, buffer);
486 }
487 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
488 webrtc_data_channel_->state());
489 }
490
491 // Tests that sending empty data returns no error and keeps the channel open.
492 TEST_F(SctpDataChannelTest, SendEmptyData) {
493 webrtc_data_channel_->SetSctpSid(1);
494 SetChannelReady();
495 EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
496 webrtc_data_channel_->state());
497
498 webrtc::DataBuffer buffer("");
499 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
500 EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
501 webrtc_data_channel_->state());
502 }
503
504 // Tests that a channel can be closed without being opened or assigned an sid.
505 TEST_F(SctpDataChannelTest, NeverOpened) {
506 provider_.set_transport_available(true);
507 webrtc_data_channel_->OnTransportChannelCreated();
508 webrtc_data_channel_->Close();
509 }
510
511 class SctpSidAllocatorTest : public testing::Test {
512 protected:
513 SctpSidAllocator allocator_;
514 };
515
516 // Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for
517 // SSL_SERVER.
518 TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) {
519 int id;
520 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
521 EXPECT_EQ(1, id);
522 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
523 EXPECT_EQ(0, id);
524 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
525 EXPECT_EQ(3, id);
526 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
527 EXPECT_EQ(2, id);
528 }
529
530 // Verifies that SCTP ids of existing DataChannels are not reused.
531 TEST_F(SctpSidAllocatorTest, SctpIdAllocationNoReuse) {
532 int old_id = 1;
533 EXPECT_TRUE(allocator_.ReserveSid(old_id));
534
535 int new_id;
536 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &new_id));
537 EXPECT_NE(old_id, new_id);
538
539 old_id = 0;
540 EXPECT_TRUE(allocator_.ReserveSid(old_id));
541 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &new_id));
542 EXPECT_NE(old_id, new_id);
543 }
544
545 // Verifies that SCTP ids of removed DataChannels can be reused.
546 TEST_F(SctpSidAllocatorTest, SctpIdReusedForRemovedDataChannel) {
547 int odd_id = 1;
548 int even_id = 0;
549 EXPECT_TRUE(allocator_.ReserveSid(odd_id));
550 EXPECT_TRUE(allocator_.ReserveSid(even_id));
551
552 int allocated_id = -1;
553 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
554 EXPECT_EQ(odd_id + 2, allocated_id);
555
556 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
557 EXPECT_EQ(even_id + 2, allocated_id);
558
559 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
560 EXPECT_EQ(odd_id + 4, allocated_id);
561
562 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
563 EXPECT_EQ(even_id + 4, allocated_id);
564
565 allocator_.ReleaseSid(odd_id);
566 allocator_.ReleaseSid(even_id);
567
568 // Verifies that removed ids are reused.
569 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
570 EXPECT_EQ(odd_id, allocated_id);
571
572 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
573 EXPECT_EQ(even_id, allocated_id);
574
575 // Verifies that used higher ids are not reused.
576 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
577 EXPECT_EQ(odd_id + 6, allocated_id);
578
579 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
580 EXPECT_EQ(even_id + 6, allocated_id);
581 }
OLDNEW
« no previous file with comments | « talk/app/webrtc/datachannel.cc ('k') | talk/app/webrtc/datachannelinterface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698