| OLD | NEW |
| 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/test/peerconnectiontestwrapper.h" | 13 #include "webrtc/api/test/peerconnectiontestwrapper.h" |
| 14 // Notice that mockpeerconnectionobservers.h must be included after the above! | 14 // Notice that mockpeerconnectionobservers.h must be included after the above! |
| 15 #include "webrtc/api/test/mockpeerconnectionobservers.h" | 15 #include "webrtc/api/test/mockpeerconnectionobservers.h" |
| 16 #ifdef WEBRTC_ANDROID | 16 #ifdef WEBRTC_ANDROID |
| 17 #include "webrtc/api/test/androidtestinitializer.h" | 17 #include "webrtc/api/test/androidtestinitializer.h" |
| 18 #endif | 18 #endif |
| 19 #include "webrtc/base/gunit.h" | 19 #include "webrtc/base/gunit.h" |
| 20 #include "webrtc/base/logging.h" | 20 #include "webrtc/base/logging.h" |
| 21 #include "webrtc/base/ssladapter.h" | 21 #include "webrtc/base/ssladapter.h" |
| 22 #include "webrtc/base/thread.h" | 22 #include "webrtc/base/thread.h" |
| 23 #include "webrtc/base/sslstreamadapter.h" | 23 #include "webrtc/base/sslstreamadapter.h" |
| 24 #include "webrtc/base/stringencode.h" | 24 #include "webrtc/base/stringencode.h" |
| 25 #include "webrtc/base/stringutils.h" | 25 #include "webrtc/base/stringutils.h" |
| 26 | 26 |
| 27 #define MAYBE_SKIP_TEST(feature) \ |
| 28 if (!(feature())) { \ |
| 29 LOG(LS_INFO) << "Feature disabled... skipping"; \ |
| 30 return; \ |
| 31 } |
| 32 |
| 27 using webrtc::DataChannelInterface; | 33 using webrtc::DataChannelInterface; |
| 28 using webrtc::FakeConstraints; | 34 using webrtc::FakeConstraints; |
| 29 using webrtc::MediaConstraintsInterface; | 35 using webrtc::MediaConstraintsInterface; |
| 30 using webrtc::MediaStreamInterface; | 36 using webrtc::MediaStreamInterface; |
| 31 using webrtc::PeerConnectionInterface; | 37 using webrtc::PeerConnectionInterface; |
| 32 | 38 |
| 33 namespace { | 39 namespace { |
| 34 | 40 |
| 35 const int kMaxWait = 10000; | 41 const int kMaxWait = 10000; |
| 36 | 42 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 GetAndAddUserMedia(); | 191 GetAndAddUserMedia(); |
| 186 Negotiate(); | 192 Negotiate(); |
| 187 WaitForCallEstablished(); | 193 WaitForCallEstablished(); |
| 188 } | 194 } |
| 189 #endif // !defined(ADDRESS_SANITIZER) | 195 #endif // !defined(ADDRESS_SANITIZER) |
| 190 | 196 |
| 191 #ifdef HAVE_SCTP | 197 #ifdef HAVE_SCTP |
| 192 // Verifies that a DataChannel created before the negotiation can transition to | 198 // Verifies that a DataChannel created before the negotiation can transition to |
| 193 // "OPEN" and transfer data. | 199 // "OPEN" and transfer data. |
| 194 TEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) { | 200 TEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) { |
| 201 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 202 |
| 195 CreatePcs(); | 203 CreatePcs(); |
| 196 | 204 |
| 197 webrtc::DataChannelInit init; | 205 webrtc::DataChannelInit init; |
| 198 rtc::scoped_refptr<DataChannelInterface> caller_dc( | 206 rtc::scoped_refptr<DataChannelInterface> caller_dc( |
| 199 caller_->CreateDataChannel("data", init)); | 207 caller_->CreateDataChannel("data", init)); |
| 200 rtc::scoped_refptr<DataChannelInterface> callee_dc( | 208 rtc::scoped_refptr<DataChannelInterface> callee_dc( |
| 201 callee_->CreateDataChannel("data", init)); | 209 callee_->CreateDataChannel("data", init)); |
| 202 | 210 |
| 203 Negotiate(); | 211 Negotiate(); |
| 204 WaitForConnection(); | 212 WaitForConnection(); |
| 205 | 213 |
| 206 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); | 214 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); |
| 207 WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0); | 215 WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0); |
| 208 | 216 |
| 209 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[0]); | 217 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[0]); |
| 210 TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]); | 218 TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]); |
| 211 | 219 |
| 212 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0); | 220 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0); |
| 213 CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0); | 221 CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0); |
| 214 } | 222 } |
| 215 | 223 |
| 216 // Verifies that a DataChannel created after the negotiation can transition to | 224 // Verifies that a DataChannel created after the negotiation can transition to |
| 217 // "OPEN" and transfer data. | 225 // "OPEN" and transfer data. |
| 218 TEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) { | 226 TEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) { |
| 227 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 228 |
| 219 CreatePcs(); | 229 CreatePcs(); |
| 220 | 230 |
| 221 webrtc::DataChannelInit init; | 231 webrtc::DataChannelInit init; |
| 222 | 232 |
| 223 // This DataChannel is for creating the data content in the negotiation. | 233 // This DataChannel is for creating the data content in the negotiation. |
| 224 rtc::scoped_refptr<DataChannelInterface> dummy( | 234 rtc::scoped_refptr<DataChannelInterface> dummy( |
| 225 caller_->CreateDataChannel("data", init)); | 235 caller_->CreateDataChannel("data", init)); |
| 226 Negotiate(); | 236 Negotiate(); |
| 227 WaitForConnection(); | 237 WaitForConnection(); |
| 228 | 238 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 240 | 250 |
| 241 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]); | 251 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]); |
| 242 TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]); | 252 TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]); |
| 243 | 253 |
| 244 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1); | 254 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1); |
| 245 CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0); | 255 CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0); |
| 246 } | 256 } |
| 247 | 257 |
| 248 // Verifies that DataChannel IDs are even/odd based on the DTLS roles. | 258 // Verifies that DataChannel IDs are even/odd based on the DTLS roles. |
| 249 TEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) { | 259 TEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) { |
| 260 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 261 |
| 250 CreatePcs(); | 262 CreatePcs(); |
| 251 | 263 |
| 252 webrtc::DataChannelInit init; | 264 webrtc::DataChannelInit init; |
| 253 rtc::scoped_refptr<DataChannelInterface> caller_dc_1( | 265 rtc::scoped_refptr<DataChannelInterface> caller_dc_1( |
| 254 caller_->CreateDataChannel("data", init)); | 266 caller_->CreateDataChannel("data", init)); |
| 255 rtc::scoped_refptr<DataChannelInterface> callee_dc_1( | 267 rtc::scoped_refptr<DataChannelInterface> callee_dc_1( |
| 256 callee_->CreateDataChannel("data", init)); | 268 callee_->CreateDataChannel("data", init)); |
| 257 | 269 |
| 258 Negotiate(); | 270 Negotiate(); |
| 259 WaitForConnection(); | 271 WaitForConnection(); |
| 260 | 272 |
| 261 EXPECT_EQ(1U, caller_dc_1->id() % 2); | 273 EXPECT_EQ(1U, caller_dc_1->id() % 2); |
| 262 EXPECT_EQ(0U, callee_dc_1->id() % 2); | 274 EXPECT_EQ(0U, callee_dc_1->id() % 2); |
| 263 | 275 |
| 264 rtc::scoped_refptr<DataChannelInterface> caller_dc_2( | 276 rtc::scoped_refptr<DataChannelInterface> caller_dc_2( |
| 265 caller_->CreateDataChannel("data", init)); | 277 caller_->CreateDataChannel("data", init)); |
| 266 rtc::scoped_refptr<DataChannelInterface> callee_dc_2( | 278 rtc::scoped_refptr<DataChannelInterface> callee_dc_2( |
| 267 callee_->CreateDataChannel("data", init)); | 279 callee_->CreateDataChannel("data", init)); |
| 268 | 280 |
| 269 EXPECT_EQ(1U, caller_dc_2->id() % 2); | 281 EXPECT_EQ(1U, caller_dc_2->id() % 2); |
| 270 EXPECT_EQ(0U, callee_dc_2->id() % 2); | 282 EXPECT_EQ(0U, callee_dc_2->id() % 2); |
| 271 } | 283 } |
| 272 | 284 |
| 273 // Verifies that the message is received by the right remote DataChannel when | 285 // Verifies that the message is received by the right remote DataChannel when |
| 274 // there are multiple DataChannels. | 286 // there are multiple DataChannels. |
| 275 TEST_F(PeerConnectionEndToEndTest, | 287 TEST_F(PeerConnectionEndToEndTest, |
| 276 MessageTransferBetweenTwoPairsOfDataChannels) { | 288 MessageTransferBetweenTwoPairsOfDataChannels) { |
| 289 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 290 |
| 277 CreatePcs(); | 291 CreatePcs(); |
| 278 | 292 |
| 279 webrtc::DataChannelInit init; | 293 webrtc::DataChannelInit init; |
| 280 | 294 |
| 281 rtc::scoped_refptr<DataChannelInterface> caller_dc_1( | 295 rtc::scoped_refptr<DataChannelInterface> caller_dc_1( |
| 282 caller_->CreateDataChannel("data", init)); | 296 caller_->CreateDataChannel("data", init)); |
| 283 rtc::scoped_refptr<DataChannelInterface> caller_dc_2( | 297 rtc::scoped_refptr<DataChannelInterface> caller_dc_2( |
| 284 caller_->CreateDataChannel("data", init)); | 298 caller_->CreateDataChannel("data", init)); |
| 285 | 299 |
| 286 Negotiate(); | 300 Negotiate(); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 // Verifies that a DataChannel added from an OPEN message functions after | 402 // Verifies that a DataChannel added from an OPEN message functions after |
| 389 // a channel has been previously closed (webrtc issue 3778). | 403 // a channel has been previously closed (webrtc issue 3778). |
| 390 // This previously failed because the new channel re-uses the ID of the closed | 404 // This previously failed because the new channel re-uses the ID of the closed |
| 391 // channel, and the closed channel was incorrectly still assigned to the id. | 405 // channel, and the closed channel was incorrectly still assigned to the id. |
| 392 // TODO(deadbeef): This is disabled because there's currently a race condition | 406 // TODO(deadbeef): This is disabled because there's currently a race condition |
| 393 // caused by the fact that a data channel signals that it's closed before it | 407 // caused by the fact that a data channel signals that it's closed before it |
| 394 // really is. Re-enable this test once that's fixed. | 408 // really is. Re-enable this test once that's fixed. |
| 395 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4453 | 409 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4453 |
| 396 TEST_F(PeerConnectionEndToEndTest, | 410 TEST_F(PeerConnectionEndToEndTest, |
| 397 DISABLED_DataChannelFromOpenWorksAfterClose) { | 411 DISABLED_DataChannelFromOpenWorksAfterClose) { |
| 412 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 413 |
| 398 CreatePcs(); | 414 CreatePcs(); |
| 399 | 415 |
| 400 webrtc::DataChannelInit init; | 416 webrtc::DataChannelInit init; |
| 401 rtc::scoped_refptr<DataChannelInterface> caller_dc( | 417 rtc::scoped_refptr<DataChannelInterface> caller_dc( |
| 402 caller_->CreateDataChannel("data", init)); | 418 caller_->CreateDataChannel("data", init)); |
| 403 | 419 |
| 404 Negotiate(); | 420 Negotiate(); |
| 405 WaitForConnection(); | 421 WaitForConnection(); |
| 406 | 422 |
| 407 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); | 423 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); |
| 408 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0); | 424 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0); |
| 409 | 425 |
| 410 // Create a new channel and ensure it works after closing the previous one. | 426 // Create a new channel and ensure it works after closing the previous one. |
| 411 caller_dc = caller_->CreateDataChannel("data2", init); | 427 caller_dc = caller_->CreateDataChannel("data2", init); |
| 412 | 428 |
| 413 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1); | 429 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1); |
| 414 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]); | 430 TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]); |
| 415 | 431 |
| 416 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1); | 432 CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1); |
| 417 } | 433 } |
| 418 | 434 |
| 419 // This tests that if a data channel is closed remotely while not referenced | 435 // This tests that if a data channel is closed remotely while not referenced |
| 420 // by the application (meaning only the PeerConnection contributes to its | 436 // by the application (meaning only the PeerConnection contributes to its |
| 421 // reference count), no memory access violation will occur. | 437 // reference count), no memory access violation will occur. |
| 422 // See: https://code.google.com/p/chromium/issues/detail?id=565048 | 438 // See: https://code.google.com/p/chromium/issues/detail?id=565048 |
| 423 TEST_F(PeerConnectionEndToEndTest, CloseDataChannelRemotelyWhileNotReferenced) { | 439 TEST_F(PeerConnectionEndToEndTest, CloseDataChannelRemotelyWhileNotReferenced) { |
| 440 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 441 |
| 424 CreatePcs(); | 442 CreatePcs(); |
| 425 | 443 |
| 426 webrtc::DataChannelInit init; | 444 webrtc::DataChannelInit init; |
| 427 rtc::scoped_refptr<DataChannelInterface> caller_dc( | 445 rtc::scoped_refptr<DataChannelInterface> caller_dc( |
| 428 caller_->CreateDataChannel("data", init)); | 446 caller_->CreateDataChannel("data", init)); |
| 429 | 447 |
| 430 Negotiate(); | 448 Negotiate(); |
| 431 WaitForConnection(); | 449 WaitForConnection(); |
| 432 | 450 |
| 433 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); | 451 WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0); |
| 434 // This removes the reference to the remote data channel that we hold. | 452 // This removes the reference to the remote data channel that we hold. |
| 435 callee_signaled_data_channels_.clear(); | 453 callee_signaled_data_channels_.clear(); |
| 436 caller_dc->Close(); | 454 caller_dc->Close(); |
| 437 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, caller_dc->state(), kMaxWait); | 455 EXPECT_EQ_WAIT(DataChannelInterface::kClosed, caller_dc->state(), kMaxWait); |
| 438 | 456 |
| 439 // Wait for a bit longer so the remote data channel will receive the | 457 // Wait for a bit longer so the remote data channel will receive the |
| 440 // close message and be destroyed. | 458 // close message and be destroyed. |
| 441 rtc::Thread::Current()->ProcessMessages(100); | 459 rtc::Thread::Current()->ProcessMessages(100); |
| 442 } | 460 } |
| 443 #endif // HAVE_SCTP | 461 #endif // HAVE_SCTP |
| OLD | NEW |