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

Side by Side Diff: webrtc/api/datachannel_unittest.cc

Issue 2235843003: Fix for data channels perpetually stuck in "closing" state. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 4 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 | « webrtc/api/datachannel.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <memory> 11 #include <memory>
12 12
13 #include "webrtc/api/datachannel.h" 13 #include "webrtc/api/datachannel.h"
14 #include "webrtc/api/sctputils.h" 14 #include "webrtc/api/sctputils.h"
15 #include "webrtc/api/test/fakedatachannelprovider.h" 15 #include "webrtc/api/test/fakedatachannelprovider.h"
16 #include "webrtc/base/gunit.h" 16 #include "webrtc/base/gunit.h"
17 17
18 using webrtc::DataChannel; 18 using webrtc::DataChannel;
19 using webrtc::SctpSidAllocator; 19 using webrtc::SctpSidAllocator;
20 20
21 static constexpr int kDefaultTimeout = 10000;
22
21 class FakeDataChannelObserver : public webrtc::DataChannelObserver { 23 class FakeDataChannelObserver : public webrtc::DataChannelObserver {
22 public: 24 public:
23 FakeDataChannelObserver() 25 FakeDataChannelObserver()
24 : messages_received_(0), 26 : messages_received_(0),
25 on_state_change_count_(0), 27 on_state_change_count_(0),
26 on_buffered_amount_change_count_(0) {} 28 on_buffered_amount_change_count_(0) {}
27 29
28 void OnStateChange() { 30 void OnStateChange() {
29 ++on_state_change_count_; 31 ++on_state_change_count_;
30 } 32 }
(...skipping 28 matching lines...) Expand all
59 61
60 private: 62 private:
61 size_t messages_received_; 63 size_t messages_received_;
62 size_t on_state_change_count_; 64 size_t on_state_change_count_;
63 size_t on_buffered_amount_change_count_; 65 size_t on_buffered_amount_change_count_;
64 }; 66 };
65 67
66 class SctpDataChannelTest : public testing::Test { 68 class SctpDataChannelTest : public testing::Test {
67 protected: 69 protected:
68 SctpDataChannelTest() 70 SctpDataChannelTest()
69 : webrtc_data_channel_( 71 : provider_(new FakeDataChannelProvider()),
70 DataChannel::Create( 72 webrtc_data_channel_(DataChannel::Create(provider_.get(),
71 &provider_, cricket::DCT_SCTP, "test", init_)) { 73 cricket::DCT_SCTP,
72 } 74 "test",
75 init_)) {}
73 76
74 void SetChannelReady() { 77 void SetChannelReady() {
75 provider_.set_transport_available(true); 78 provider_->set_transport_available(true);
76 webrtc_data_channel_->OnTransportChannelCreated(); 79 webrtc_data_channel_->OnTransportChannelCreated();
77 if (webrtc_data_channel_->id() < 0) { 80 if (webrtc_data_channel_->id() < 0) {
78 webrtc_data_channel_->SetSctpSid(0); 81 webrtc_data_channel_->SetSctpSid(0);
79 } 82 }
80 provider_.set_ready_to_send(true); 83 provider_->set_ready_to_send(true);
81 } 84 }
82 85
83 void AddObserver() { 86 void AddObserver() {
84 observer_.reset(new FakeDataChannelObserver()); 87 observer_.reset(new FakeDataChannelObserver());
85 webrtc_data_channel_->RegisterObserver(observer_.get()); 88 webrtc_data_channel_->RegisterObserver(observer_.get());
86 } 89 }
87 90
88 webrtc::InternalDataChannelInit init_; 91 webrtc::InternalDataChannelInit init_;
89 FakeDataChannelProvider provider_; 92 std::unique_ptr<FakeDataChannelProvider> provider_;
90 std::unique_ptr<FakeDataChannelObserver> observer_; 93 std::unique_ptr<FakeDataChannelObserver> observer_;
91 rtc::scoped_refptr<DataChannel> webrtc_data_channel_; 94 rtc::scoped_refptr<DataChannel> webrtc_data_channel_;
92 }; 95 };
93 96
94 // Verifies that the data channel is connected to the transport after creation. 97 // Verifies that the data channel is connected to the transport after creation.
95 TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) { 98 TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
96 provider_.set_transport_available(true); 99 provider_->set_transport_available(true);
97 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 100 rtc::scoped_refptr<DataChannel> dc =
98 &provider_, cricket::DCT_SCTP, "test1", init_); 101 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init_);
99 102
100 EXPECT_TRUE(provider_.IsConnected(dc.get())); 103 EXPECT_TRUE(provider_->IsConnected(dc.get()));
101 // The sid is not set yet, so it should not have added the streams. 104 // The sid is not set yet, so it should not have added the streams.
102 EXPECT_FALSE(provider_.IsSendStreamAdded(dc->id())); 105 EXPECT_FALSE(provider_->IsSendStreamAdded(dc->id()));
103 EXPECT_FALSE(provider_.IsRecvStreamAdded(dc->id())); 106 EXPECT_FALSE(provider_->IsRecvStreamAdded(dc->id()));
104 107
105 dc->SetSctpSid(0); 108 dc->SetSctpSid(0);
106 EXPECT_TRUE(provider_.IsSendStreamAdded(dc->id())); 109 EXPECT_TRUE(provider_->IsSendStreamAdded(dc->id()));
107 EXPECT_TRUE(provider_.IsRecvStreamAdded(dc->id())); 110 EXPECT_TRUE(provider_->IsRecvStreamAdded(dc->id()));
108 } 111 }
109 112
110 // Verifies that the data channel is connected to the transport if the transport 113 // Verifies that the data channel is connected to the transport if the transport
111 // is not available initially and becomes available later. 114 // is not available initially and becomes available later.
112 TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) { 115 TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) {
113 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get())); 116 EXPECT_FALSE(provider_->IsConnected(webrtc_data_channel_.get()));
114 117
115 provider_.set_transport_available(true); 118 provider_->set_transport_available(true);
116 webrtc_data_channel_->OnTransportChannelCreated(); 119 webrtc_data_channel_->OnTransportChannelCreated();
117 EXPECT_TRUE(provider_.IsConnected(webrtc_data_channel_.get())); 120 EXPECT_TRUE(provider_->IsConnected(webrtc_data_channel_.get()));
118 } 121 }
119 122
120 // Tests the state of the data channel. 123 // Tests the state of the data channel.
121 TEST_F(SctpDataChannelTest, StateTransition) { 124 TEST_F(SctpDataChannelTest, StateTransition) {
122 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, 125 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
123 webrtc_data_channel_->state()); 126 webrtc_data_channel_->state());
124 SetChannelReady(); 127 SetChannelReady();
125 128
126 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state()); 129 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
127 webrtc_data_channel_->Close(); 130 webrtc_data_channel_->Close();
128 EXPECT_EQ(webrtc::DataChannelInterface::kClosed, 131 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
129 webrtc_data_channel_->state()); 132 webrtc_data_channel_->state());
130 // Verifies that it's disconnected from the transport. 133 // Verifies that it's disconnected from the transport.
131 EXPECT_FALSE(provider_.IsConnected(webrtc_data_channel_.get())); 134 EXPECT_FALSE(provider_->IsConnected(webrtc_data_channel_.get()));
132 } 135 }
133 136
134 // Tests that DataChannel::buffered_amount() is correct after the channel is 137 // Tests that DataChannel::buffered_amount() is correct after the channel is
135 // blocked. 138 // blocked.
136 TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) { 139 TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
137 AddObserver(); 140 AddObserver();
138 SetChannelReady(); 141 SetChannelReady();
139 webrtc::DataBuffer buffer("abcd"); 142 webrtc::DataBuffer buffer("abcd");
140 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 143 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
141 144
142 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount()); 145 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
143 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count()); 146 EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
144 147
145 provider_.set_send_blocked(true); 148 provider_->set_send_blocked(true);
146 149
147 const int number_of_packets = 3; 150 const int number_of_packets = 3;
148 for (int i = 0; i < number_of_packets; ++i) { 151 for (int i = 0; i < number_of_packets; ++i) {
149 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 152 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
150 } 153 }
151 EXPECT_EQ(buffer.data.size() * number_of_packets, 154 EXPECT_EQ(buffer.data.size() * number_of_packets,
152 webrtc_data_channel_->buffered_amount()); 155 webrtc_data_channel_->buffered_amount());
153 EXPECT_EQ(number_of_packets, observer_->on_buffered_amount_change_count()); 156 EXPECT_EQ(number_of_packets, observer_->on_buffered_amount_change_count());
154 } 157 }
155 158
156 // Tests that the queued data are sent when the channel transitions from blocked 159 // Tests that the queued data are sent when the channel transitions from blocked
157 // to unblocked. 160 // to unblocked.
158 TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) { 161 TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
159 AddObserver(); 162 AddObserver();
160 SetChannelReady(); 163 SetChannelReady();
161 webrtc::DataBuffer buffer("abcd"); 164 webrtc::DataBuffer buffer("abcd");
162 provider_.set_send_blocked(true); 165 provider_->set_send_blocked(true);
163 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 166 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
164 167
165 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count()); 168 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
166 169
167 provider_.set_send_blocked(false); 170 provider_->set_send_blocked(false);
168 SetChannelReady(); 171 SetChannelReady();
169 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount()); 172 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
170 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count()); 173 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
171 } 174 }
172 175
173 // Tests that no crash when the channel is blocked right away while trying to 176 // Tests that no crash when the channel is blocked right away while trying to
174 // send queued data. 177 // send queued data.
175 TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) { 178 TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
176 AddObserver(); 179 AddObserver();
177 SetChannelReady(); 180 SetChannelReady();
178 webrtc::DataBuffer buffer("abcd"); 181 webrtc::DataBuffer buffer("abcd");
179 provider_.set_send_blocked(true); 182 provider_->set_send_blocked(true);
180 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 183 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
181 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count()); 184 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
182 185
183 // Set channel ready while it is still blocked. 186 // Set channel ready while it is still blocked.
184 SetChannelReady(); 187 SetChannelReady();
185 EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount()); 188 EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount());
186 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count()); 189 EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
187 190
188 // Unblock the channel to send queued data again, there should be no crash. 191 // Unblock the channel to send queued data again, there should be no crash.
189 provider_.set_send_blocked(false); 192 provider_->set_send_blocked(false);
190 SetChannelReady(); 193 SetChannelReady();
191 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount()); 194 EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
192 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count()); 195 EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
193 } 196 }
194 197
195 // Tests that the queued control message is sent when channel is ready. 198 // Tests that the queued control message is sent when channel is ready.
196 TEST_F(SctpDataChannelTest, OpenMessageSent) { 199 TEST_F(SctpDataChannelTest, OpenMessageSent) {
197 // Initially the id is unassigned. 200 // Initially the id is unassigned.
198 EXPECT_EQ(-1, webrtc_data_channel_->id()); 201 EXPECT_EQ(-1, webrtc_data_channel_->id());
199 202
200 SetChannelReady(); 203 SetChannelReady();
201 EXPECT_GE(webrtc_data_channel_->id(), 0); 204 EXPECT_GE(webrtc_data_channel_->id(), 0);
202 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type); 205 EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
203 EXPECT_EQ(provider_.last_send_data_params().ssrc, 206 EXPECT_EQ(provider_->last_send_data_params().ssrc,
204 static_cast<uint32_t>(webrtc_data_channel_->id())); 207 static_cast<uint32_t>(webrtc_data_channel_->id()));
205 } 208 }
206 209
207 TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) { 210 TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
208 provider_.set_send_blocked(true); 211 provider_->set_send_blocked(true);
209 SetChannelReady(); 212 SetChannelReady();
210 provider_.set_send_blocked(false); 213 provider_->set_send_blocked(false);
211 214
212 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type); 215 EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
213 EXPECT_EQ(provider_.last_send_data_params().ssrc, 216 EXPECT_EQ(provider_->last_send_data_params().ssrc,
214 static_cast<uint32_t>(webrtc_data_channel_->id())); 217 static_cast<uint32_t>(webrtc_data_channel_->id()));
215 } 218 }
216 219
217 // Tests that the DataChannel created after transport gets ready can enter OPEN 220 // Tests that the DataChannel created after transport gets ready can enter OPEN
218 // state. 221 // state.
219 TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) { 222 TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
220 SetChannelReady(); 223 SetChannelReady();
221 webrtc::InternalDataChannelInit init; 224 webrtc::InternalDataChannelInit init;
222 init.id = 1; 225 init.id = 1;
223 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 226 rtc::scoped_refptr<DataChannel> dc =
224 &provider_, cricket::DCT_SCTP, "test1", init); 227 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
225 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state()); 228 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state());
226 EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(), 229 EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(),
227 1000); 230 1000);
228 } 231 }
229 232
230 // Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK 233 // Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
231 // message is received. 234 // message is received.
232 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) { 235 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
233 SetChannelReady(); 236 SetChannelReady();
234 webrtc::InternalDataChannelInit init; 237 webrtc::InternalDataChannelInit init;
235 init.id = 1; 238 init.id = 1;
236 init.ordered = false; 239 init.ordered = false;
237 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 240 rtc::scoped_refptr<DataChannel> dc =
238 &provider_, cricket::DCT_SCTP, "test1", init); 241 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
239 242
240 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); 243 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
241 244
242 // Sends a message and verifies it's ordered. 245 // Sends a message and verifies it's ordered.
243 webrtc::DataBuffer buffer("some data"); 246 webrtc::DataBuffer buffer("some data");
244 ASSERT_TRUE(dc->Send(buffer)); 247 ASSERT_TRUE(dc->Send(buffer));
245 EXPECT_TRUE(provider_.last_send_data_params().ordered); 248 EXPECT_TRUE(provider_->last_send_data_params().ordered);
246 249
247 // Emulates receiving an OPEN_ACK message. 250 // Emulates receiving an OPEN_ACK message.
248 cricket::ReceiveDataParams params; 251 cricket::ReceiveDataParams params;
249 params.ssrc = init.id; 252 params.ssrc = init.id;
250 params.type = cricket::DMT_CONTROL; 253 params.type = cricket::DMT_CONTROL;
251 rtc::CopyOnWriteBuffer payload; 254 rtc::CopyOnWriteBuffer payload;
252 webrtc::WriteDataChannelOpenAckMessage(&payload); 255 webrtc::WriteDataChannelOpenAckMessage(&payload);
253 dc->OnDataReceived(NULL, params, payload); 256 dc->OnDataReceived(NULL, params, payload);
254 257
255 // Sends another message and verifies it's unordered. 258 // Sends another message and verifies it's unordered.
256 ASSERT_TRUE(dc->Send(buffer)); 259 ASSERT_TRUE(dc->Send(buffer));
257 EXPECT_FALSE(provider_.last_send_data_params().ordered); 260 EXPECT_FALSE(provider_->last_send_data_params().ordered);
258 } 261 }
259 262
260 // Tests that an unordered DataChannel sends unordered data after any DATA 263 // Tests that an unordered DataChannel sends unordered data after any DATA
261 // message is received. 264 // message is received.
262 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) { 265 TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
263 SetChannelReady(); 266 SetChannelReady();
264 webrtc::InternalDataChannelInit init; 267 webrtc::InternalDataChannelInit init;
265 init.id = 1; 268 init.id = 1;
266 init.ordered = false; 269 init.ordered = false;
267 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 270 rtc::scoped_refptr<DataChannel> dc =
268 &provider_, cricket::DCT_SCTP, "test1", init); 271 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
269 272
270 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); 273 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
271 274
272 // Emulates receiving a DATA message. 275 // Emulates receiving a DATA message.
273 cricket::ReceiveDataParams params; 276 cricket::ReceiveDataParams params;
274 params.ssrc = init.id; 277 params.ssrc = init.id;
275 params.type = cricket::DMT_TEXT; 278 params.type = cricket::DMT_TEXT;
276 webrtc::DataBuffer buffer("data"); 279 webrtc::DataBuffer buffer("data");
277 dc->OnDataReceived(NULL, params, buffer.data); 280 dc->OnDataReceived(NULL, params, buffer.data);
278 281
279 // Sends a message and verifies it's unordered. 282 // Sends a message and verifies it's unordered.
280 ASSERT_TRUE(dc->Send(buffer)); 283 ASSERT_TRUE(dc->Send(buffer));
281 EXPECT_FALSE(provider_.last_send_data_params().ordered); 284 EXPECT_FALSE(provider_->last_send_data_params().ordered);
282 } 285 }
283 286
284 // Tests that the channel can't open until it's successfully sent the OPEN 287 // Tests that the channel can't open until it's successfully sent the OPEN
285 // message. 288 // message.
286 TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) { 289 TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
287 webrtc::DataBuffer buffer("foo"); 290 webrtc::DataBuffer buffer("foo");
288 291
289 provider_.set_send_blocked(true); 292 provider_->set_send_blocked(true);
290 SetChannelReady(); 293 SetChannelReady();
291 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, 294 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
292 webrtc_data_channel_->state()); 295 webrtc_data_channel_->state());
293 provider_.set_send_blocked(false); 296 provider_->set_send_blocked(false);
294 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, 297 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
295 webrtc_data_channel_->state(), 1000); 298 webrtc_data_channel_->state(), 1000);
296 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type); 299 EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
297 } 300 }
298 301
299 // Tests that close first makes sure all queued data gets sent. 302 // Tests that close first makes sure all queued data gets sent.
300 TEST_F(SctpDataChannelTest, QueuedCloseFlushes) { 303 TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
301 webrtc::DataBuffer buffer("foo"); 304 webrtc::DataBuffer buffer("foo");
302 305
303 provider_.set_send_blocked(true); 306 provider_->set_send_blocked(true);
304 SetChannelReady(); 307 SetChannelReady();
305 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, 308 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
306 webrtc_data_channel_->state()); 309 webrtc_data_channel_->state());
307 provider_.set_send_blocked(false); 310 provider_->set_send_blocked(false);
308 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, 311 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
309 webrtc_data_channel_->state(), 1000); 312 webrtc_data_channel_->state(), 1000);
310 provider_.set_send_blocked(true); 313 provider_->set_send_blocked(true);
311 webrtc_data_channel_->Send(buffer); 314 webrtc_data_channel_->Send(buffer);
312 webrtc_data_channel_->Close(); 315 webrtc_data_channel_->Close();
313 provider_.set_send_blocked(false); 316 provider_->set_send_blocked(false);
314 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, 317 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
315 webrtc_data_channel_->state(), 1000); 318 webrtc_data_channel_->state(), 1000);
316 EXPECT_EQ(cricket::DMT_TEXT, provider_.last_send_data_params().type); 319 EXPECT_EQ(cricket::DMT_TEXT, provider_->last_send_data_params().type);
317 } 320 }
318 321
319 // Tests that messages are sent with the right ssrc. 322 // Tests that messages are sent with the right ssrc.
320 TEST_F(SctpDataChannelTest, SendDataSsrc) { 323 TEST_F(SctpDataChannelTest, SendDataSsrc) {
321 webrtc_data_channel_->SetSctpSid(1); 324 webrtc_data_channel_->SetSctpSid(1);
322 SetChannelReady(); 325 SetChannelReady();
323 webrtc::DataBuffer buffer("data"); 326 webrtc::DataBuffer buffer("data");
324 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 327 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
325 EXPECT_EQ(1U, provider_.last_send_data_params().ssrc); 328 EXPECT_EQ(1U, provider_->last_send_data_params().ssrc);
326 } 329 }
327 330
328 // Tests that the incoming messages with wrong ssrcs are rejected. 331 // Tests that the incoming messages with wrong ssrcs are rejected.
329 TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) { 332 TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) {
330 webrtc_data_channel_->SetSctpSid(1); 333 webrtc_data_channel_->SetSctpSid(1);
331 SetChannelReady(); 334 SetChannelReady();
332 335
333 AddObserver(); 336 AddObserver();
334 337
335 cricket::ReceiveDataParams params; 338 cricket::ReceiveDataParams params;
(...skipping 21 matching lines...) Expand all
357 360
358 // Tests that no CONTROL message is sent if the datachannel is negotiated and 361 // Tests that no CONTROL message is sent if the datachannel is negotiated and
359 // not created from an OPEN message. 362 // not created from an OPEN message.
360 TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) { 363 TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
361 webrtc::InternalDataChannelInit config; 364 webrtc::InternalDataChannelInit config;
362 config.id = 1; 365 config.id = 1;
363 config.negotiated = true; 366 config.negotiated = true;
364 config.open_handshake_role = webrtc::InternalDataChannelInit::kNone; 367 config.open_handshake_role = webrtc::InternalDataChannelInit::kNone;
365 368
366 SetChannelReady(); 369 SetChannelReady();
367 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 370 rtc::scoped_refptr<DataChannel> dc =
368 &provider_, cricket::DCT_SCTP, "test1", config); 371 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", config);
369 372
370 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); 373 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
371 EXPECT_EQ(0U, provider_.last_send_data_params().ssrc); 374 EXPECT_EQ(0U, provider_->last_send_data_params().ssrc);
372 } 375 }
373 376
374 // Tests that OPEN_ACK message is sent if the datachannel is created from an 377 // Tests that OPEN_ACK message is sent if the datachannel is created from an
375 // OPEN message. 378 // OPEN message.
376 TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) { 379 TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
377 webrtc::InternalDataChannelInit config; 380 webrtc::InternalDataChannelInit config;
378 config.id = 1; 381 config.id = 1;
379 config.negotiated = true; 382 config.negotiated = true;
380 config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker; 383 config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker;
381 384
382 SetChannelReady(); 385 SetChannelReady();
383 rtc::scoped_refptr<DataChannel> dc = DataChannel::Create( 386 rtc::scoped_refptr<DataChannel> dc =
384 &provider_, cricket::DCT_SCTP, "test1", config); 387 DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", config);
385 388
386 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); 389 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
387 390
388 EXPECT_EQ(static_cast<unsigned int>(config.id), 391 EXPECT_EQ(static_cast<unsigned int>(config.id),
389 provider_.last_send_data_params().ssrc); 392 provider_->last_send_data_params().ssrc);
390 EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type); 393 EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
391 } 394 }
392 395
393 // Tests the OPEN_ACK role assigned by InternalDataChannelInit. 396 // Tests the OPEN_ACK role assigned by InternalDataChannelInit.
394 TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) { 397 TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
395 webrtc::InternalDataChannelInit init; 398 webrtc::InternalDataChannelInit init;
396 EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role); 399 EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role);
397 EXPECT_FALSE(init.negotiated); 400 EXPECT_FALSE(init.negotiated);
398 401
399 webrtc::DataChannelInit base; 402 webrtc::DataChannelInit base;
400 base.negotiated = true; 403 base.negotiated = true;
401 webrtc::InternalDataChannelInit init2(base); 404 webrtc::InternalDataChannelInit init2(base);
402 EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role); 405 EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role);
403 } 406 }
404 407
405 // Tests that the DataChannel is closed if the sending buffer is full. 408 // Tests that the DataChannel is closed if the sending buffer is full.
406 TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) { 409 TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) {
407 SetChannelReady(); 410 SetChannelReady();
408 411
409 rtc::CopyOnWriteBuffer buffer(1024); 412 rtc::CopyOnWriteBuffer buffer(1024);
410 memset(buffer.data(), 0, buffer.size()); 413 memset(buffer.data(), 0, buffer.size());
411 414
412 webrtc::DataBuffer packet(buffer, true); 415 webrtc::DataBuffer packet(buffer, true);
413 provider_.set_send_blocked(true); 416 provider_->set_send_blocked(true);
414 417
415 for (size_t i = 0; i < 16 * 1024 + 1; ++i) { 418 for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
416 EXPECT_TRUE(webrtc_data_channel_->Send(packet)); 419 EXPECT_TRUE(webrtc_data_channel_->Send(packet));
417 } 420 }
418 421
419 EXPECT_TRUE( 422 EXPECT_TRUE(
420 webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() || 423 webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() ||
421 webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state()); 424 webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state());
422 } 425 }
423 426
424 // Tests that the DataChannel is closed on transport errors. 427 // Tests that the DataChannel is closed on transport errors.
425 TEST_F(SctpDataChannelTest, ClosedOnTransportError) { 428 TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
426 SetChannelReady(); 429 SetChannelReady();
427 webrtc::DataBuffer buffer("abcd"); 430 webrtc::DataBuffer buffer("abcd");
428 provider_.set_transport_error(); 431 provider_->set_transport_error();
429 432
430 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 433 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
431 434
432 EXPECT_EQ(webrtc::DataChannelInterface::kClosed, 435 EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
433 webrtc_data_channel_->state()); 436 webrtc_data_channel_->state());
434 } 437 }
435 438
436 // Tests that a already closed DataChannel does not fire onStateChange again. 439 // Tests that a already closed DataChannel does not fire onStateChange again.
437 TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) { 440 TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) {
438 AddObserver(); 441 AddObserver();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 webrtc_data_channel_->state()); 484 webrtc_data_channel_->state());
482 485
483 webrtc::DataBuffer buffer(""); 486 webrtc::DataBuffer buffer("");
484 EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); 487 EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
485 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, 488 EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
486 webrtc_data_channel_->state()); 489 webrtc_data_channel_->state());
487 } 490 }
488 491
489 // Tests that a channel can be closed without being opened or assigned an sid. 492 // Tests that a channel can be closed without being opened or assigned an sid.
490 TEST_F(SctpDataChannelTest, NeverOpened) { 493 TEST_F(SctpDataChannelTest, NeverOpened) {
491 provider_.set_transport_available(true); 494 provider_->set_transport_available(true);
492 webrtc_data_channel_->OnTransportChannelCreated(); 495 webrtc_data_channel_->OnTransportChannelCreated();
493 webrtc_data_channel_->Close(); 496 webrtc_data_channel_->Close();
494 } 497 }
495 498
499 // Test that the data channel goes to the "closed" state (and doesn't crash)
500 // when its transport goes away, even while data is buffered.
501 TEST_F(SctpDataChannelTest, TransportDestroyedWhileDataBuffered) {
502 SetChannelReady();
503
504 rtc::CopyOnWriteBuffer buffer(1024);
505 memset(buffer.data(), 0, buffer.size());
506 webrtc::DataBuffer packet(buffer, true);
507
508 // Send a packet while sending is blocked so it ends up buffered.
509 provider_->set_send_blocked(true);
510 EXPECT_TRUE(webrtc_data_channel_->Send(packet));
511
512 // Tell the data channel that its tranpsort is being destroyed.
513 // It should then stop using the transport (allowing us to delete it) and
514 // transition to the "closed" state.
515 webrtc_data_channel_->OnTransportChannelDestroyed();
516 provider_.reset(nullptr);
517 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
518 webrtc_data_channel_->state(), kDefaultTimeout);
519 }
520
496 class SctpSidAllocatorTest : public testing::Test { 521 class SctpSidAllocatorTest : public testing::Test {
497 protected: 522 protected:
498 SctpSidAllocator allocator_; 523 SctpSidAllocator allocator_;
499 }; 524 };
500 525
501 // Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for 526 // Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for
502 // SSL_SERVER. 527 // SSL_SERVER.
503 TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) { 528 TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) {
504 int id; 529 int id;
505 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id)); 530 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id)); 582 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
558 EXPECT_EQ(even_id, allocated_id); 583 EXPECT_EQ(even_id, allocated_id);
559 584
560 // Verifies that used higher ids are not reused. 585 // Verifies that used higher ids are not reused.
561 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id)); 586 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
562 EXPECT_EQ(odd_id + 6, allocated_id); 587 EXPECT_EQ(odd_id + 6, allocated_id);
563 588
564 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id)); 589 EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
565 EXPECT_EQ(even_id + 6, allocated_id); 590 EXPECT_EQ(even_id + 6, allocated_id);
566 } 591 }
OLDNEW
« no previous file with comments | « webrtc/api/datachannel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698