Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 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 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "webrtc/api/mediastreaminterface.h" | 23 #include "webrtc/api/mediastreaminterface.h" |
| 24 #include "webrtc/api/peerconnection.h" | 24 #include "webrtc/api/peerconnection.h" |
| 25 #include "webrtc/api/peerconnectionfactory.h" | 25 #include "webrtc/api/peerconnectionfactory.h" |
| 26 #include "webrtc/api/peerconnectioninterface.h" | 26 #include "webrtc/api/peerconnectioninterface.h" |
| 27 #include "webrtc/api/test/fakeaudiocapturemodule.h" | 27 #include "webrtc/api/test/fakeaudiocapturemodule.h" |
| 28 #include "webrtc/api/test/fakeconstraints.h" | 28 #include "webrtc/api/test/fakeconstraints.h" |
| 29 #include "webrtc/api/test/fakeperiodicvideocapturer.h" | 29 #include "webrtc/api/test/fakeperiodicvideocapturer.h" |
| 30 #include "webrtc/api/test/fakertccertificategenerator.h" | 30 #include "webrtc/api/test/fakertccertificategenerator.h" |
| 31 #include "webrtc/api/test/fakevideotrackrenderer.h" | 31 #include "webrtc/api/test/fakevideotrackrenderer.h" |
| 32 #include "webrtc/api/test/mockpeerconnectionobservers.h" | 32 #include "webrtc/api/test/mockpeerconnectionobservers.h" |
| 33 #include "webrtc/base/fakenetwork.h" | |
| 33 #include "webrtc/base/gunit.h" | 34 #include "webrtc/base/gunit.h" |
| 34 #include "webrtc/base/physicalsocketserver.h" | 35 #include "webrtc/base/physicalsocketserver.h" |
| 35 #include "webrtc/base/ssladapter.h" | 36 #include "webrtc/base/ssladapter.h" |
| 36 #include "webrtc/base/sslstreamadapter.h" | 37 #include "webrtc/base/sslstreamadapter.h" |
| 37 #include "webrtc/base/thread.h" | 38 #include "webrtc/base/thread.h" |
| 38 #include "webrtc/base/virtualsocketserver.h" | 39 #include "webrtc/base/virtualsocketserver.h" |
| 39 #include "webrtc/media/engine/fakewebrtcvideoengine.h" | 40 #include "webrtc/media/engine/fakewebrtcvideoengine.h" |
| 40 #include "webrtc/p2p/base/fakeportallocator.h" | |
| 41 #include "webrtc/p2p/base/p2pconstants.h" | 41 #include "webrtc/p2p/base/p2pconstants.h" |
| 42 #include "webrtc/p2p/base/sessiondescription.h" | 42 #include "webrtc/p2p/base/sessiondescription.h" |
| 43 #include "webrtc/p2p/base/testturnserver.h" | |
| 44 #include "webrtc/p2p/client/basicportallocator.h" | |
| 43 #include "webrtc/pc/mediasession.h" | 45 #include "webrtc/pc/mediasession.h" |
| 44 | 46 |
| 45 #define MAYBE_SKIP_TEST(feature) \ | 47 #define MAYBE_SKIP_TEST(feature) \ |
| 46 if (!(feature())) { \ | 48 if (!(feature())) { \ |
| 47 LOG(LS_INFO) << "Feature disabled... skipping"; \ | 49 LOG(LS_INFO) << "Feature disabled... skipping"; \ |
| 48 return; \ | 50 return; \ |
| 49 } | 51 } |
| 50 | 52 |
| 51 using cricket::ContentInfo; | 53 using cricket::ContentInfo; |
| 52 using cricket::FakeWebRtcVideoDecoder; | 54 using cricket::FakeWebRtcVideoDecoder; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 // Disable for TSan v2, see | 98 // Disable for TSan v2, see |
| 97 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. | 99 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. |
| 98 // This declaration is also #ifdef'd as it causes unused-variable errors. | 100 // This declaration is also #ifdef'd as it causes unused-variable errors. |
| 99 #if !defined(THREAD_SANITIZER) | 101 #if !defined(THREAD_SANITIZER) |
| 100 // SRTP cipher name negotiated by the tests. This must be updated if the | 102 // SRTP cipher name negotiated by the tests. This must be updated if the |
| 101 // default changes. | 103 // default changes. |
| 102 static const int kDefaultSrtpCryptoSuite = rtc::SRTP_AES128_CM_SHA1_32; | 104 static const int kDefaultSrtpCryptoSuite = rtc::SRTP_AES128_CM_SHA1_32; |
| 103 static const int kDefaultSrtpCryptoSuiteGcm = rtc::SRTP_AEAD_AES_256_GCM; | 105 static const int kDefaultSrtpCryptoSuiteGcm = rtc::SRTP_AEAD_AES_256_GCM; |
| 104 #endif | 106 #endif |
| 105 | 107 |
| 108 // Used to simulate signaling ICE/SDP between two PeerConnections. | |
| 109 enum Message { MSG_SDP_MESSAGE, MSG_ICE_MESSAGE }; | |
| 110 | |
| 111 struct SdpMessage { | |
| 112 std::string type; | |
| 113 std::string msg; | |
| 114 }; | |
| 115 | |
| 116 struct IceMessage { | |
| 117 std::string sdp_mid; | |
| 118 int sdp_mline_index; | |
| 119 std::string msg; | |
| 120 }; | |
| 121 | |
| 106 static void RemoveLinesFromSdp(const std::string& line_start, | 122 static void RemoveLinesFromSdp(const std::string& line_start, |
| 107 std::string* sdp) { | 123 std::string* sdp) { |
| 108 const char kSdpLineEnd[] = "\r\n"; | 124 const char kSdpLineEnd[] = "\r\n"; |
| 109 size_t ssrc_pos = 0; | 125 size_t ssrc_pos = 0; |
| 110 while ((ssrc_pos = sdp->find(line_start, ssrc_pos)) != | 126 while ((ssrc_pos = sdp->find(line_start, ssrc_pos)) != |
| 111 std::string::npos) { | 127 std::string::npos) { |
| 112 size_t end_ssrc = sdp->find(kSdpLineEnd, ssrc_pos); | 128 size_t end_ssrc = sdp->find(kSdpLineEnd, ssrc_pos); |
| 113 sdp->erase(ssrc_pos, end_ssrc - ssrc_pos + strlen(kSdpLineEnd)); | 129 sdp->erase(ssrc_pos, end_ssrc - ssrc_pos + strlen(kSdpLineEnd)); |
| 114 } | 130 } |
| 115 } | 131 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 | 177 |
| 162 virtual ~MockRtpReceiverObserver() {} | 178 virtual ~MockRtpReceiverObserver() {} |
| 163 | 179 |
| 164 private: | 180 private: |
| 165 bool first_packet_received_ = false; | 181 bool first_packet_received_ = false; |
| 166 cricket::MediaType expected_media_type_; | 182 cricket::MediaType expected_media_type_; |
| 167 }; | 183 }; |
| 168 | 184 |
| 169 class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, | 185 class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
| 170 public SignalingMessageReceiver, | 186 public SignalingMessageReceiver, |
| 171 public ObserverInterface { | 187 public ObserverInterface, |
| 188 public rtc::MessageHandler { | |
| 172 public: | 189 public: |
| 190 // If |config| is not provided, uses a default constructed RTCConfiguration. | |
| 173 static PeerConnectionTestClient* CreateClientWithDtlsIdentityStore( | 191 static PeerConnectionTestClient* CreateClientWithDtlsIdentityStore( |
| 174 const std::string& id, | 192 const std::string& id, |
| 175 const MediaConstraintsInterface* constraints, | 193 const MediaConstraintsInterface* constraints, |
| 176 const PeerConnectionFactory::Options* options, | 194 const PeerConnectionFactory::Options* options, |
| 177 const PeerConnectionInterface::RTCConfiguration& config, | 195 const PeerConnectionInterface::RTCConfiguration* config, |
| 178 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, | 196 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, |
| 179 bool prefer_constraint_apis, | 197 bool prefer_constraint_apis, |
| 180 rtc::Thread* network_thread, | 198 rtc::Thread* network_thread, |
| 181 rtc::Thread* worker_thread) { | 199 rtc::Thread* worker_thread) { |
| 182 PeerConnectionTestClient* client(new PeerConnectionTestClient(id)); | 200 PeerConnectionTestClient* client(new PeerConnectionTestClient(id)); |
| 183 if (!client->Init(constraints, options, config, std::move(cert_generator), | 201 if (!client->Init(constraints, options, config, std::move(cert_generator), |
| 184 prefer_constraint_apis, network_thread, worker_thread)) { | 202 prefer_constraint_apis, network_thread, worker_thread)) { |
| 185 delete client; | 203 delete client; |
| 186 return nullptr; | 204 return nullptr; |
| 187 } | 205 } |
| 188 return client; | 206 return client; |
| 189 } | 207 } |
| 190 | 208 |
| 191 static PeerConnectionTestClient* CreateClient( | 209 static PeerConnectionTestClient* CreateClient( |
| 192 const std::string& id, | 210 const std::string& id, |
| 193 const MediaConstraintsInterface* constraints, | 211 const MediaConstraintsInterface* constraints, |
| 194 const PeerConnectionFactory::Options* options, | 212 const PeerConnectionFactory::Options* options, |
| 195 const PeerConnectionInterface::RTCConfiguration& config, | 213 const PeerConnectionInterface::RTCConfiguration* config, |
| 196 rtc::Thread* network_thread, | 214 rtc::Thread* network_thread, |
| 197 rtc::Thread* worker_thread) { | 215 rtc::Thread* worker_thread) { |
| 198 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( | 216 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( |
| 199 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? | 217 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? |
| 200 new FakeRTCCertificateGenerator() : nullptr); | 218 new FakeRTCCertificateGenerator() : nullptr); |
| 201 | 219 |
| 202 return CreateClientWithDtlsIdentityStore(id, constraints, options, config, | 220 return CreateClientWithDtlsIdentityStore(id, constraints, options, config, |
| 203 std::move(cert_generator), true, | 221 std::move(cert_generator), true, |
| 204 network_thread, worker_thread); | 222 network_thread, worker_thread); |
| 205 } | 223 } |
| 206 | 224 |
| 207 static PeerConnectionTestClient* CreateClientPreferNoConstraints( | 225 static PeerConnectionTestClient* CreateClientPreferNoConstraints( |
| 208 const std::string& id, | 226 const std::string& id, |
| 209 const PeerConnectionFactory::Options* options, | 227 const PeerConnectionFactory::Options* options, |
| 210 const PeerConnectionInterface::RTCConfiguration& config, | |
| 211 rtc::Thread* network_thread, | 228 rtc::Thread* network_thread, |
| 212 rtc::Thread* worker_thread) { | 229 rtc::Thread* worker_thread) { |
| 213 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( | 230 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( |
| 214 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? | 231 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? |
| 215 new FakeRTCCertificateGenerator() : nullptr); | 232 new FakeRTCCertificateGenerator() : nullptr); |
| 216 | 233 |
| 217 return CreateClientWithDtlsIdentityStore(id, nullptr, options, config, | 234 return CreateClientWithDtlsIdentityStore(id, nullptr, options, nullptr, |
| 218 std::move(cert_generator), false, | 235 std::move(cert_generator), false, |
| 219 network_thread, worker_thread); | 236 network_thread, worker_thread); |
| 220 } | 237 } |
| 221 | 238 |
| 222 ~PeerConnectionTestClient() { | 239 ~PeerConnectionTestClient() { |
| 223 } | 240 } |
| 224 | 241 |
| 225 void Negotiate() { Negotiate(true, true); } | 242 void Negotiate() { Negotiate(true, true); } |
| 226 | 243 |
| 227 void Negotiate(bool audio, bool video) { | 244 void Negotiate(bool audio, bool video) { |
| 228 std::unique_ptr<SessionDescriptionInterface> offer; | 245 std::unique_ptr<SessionDescriptionInterface> offer; |
| 229 ASSERT_TRUE(DoCreateOffer(&offer)); | 246 ASSERT_TRUE(DoCreateOffer(&offer)); |
| 230 | 247 |
| 231 if (offer->description()->GetContentByName("audio")) { | 248 if (offer->description()->GetContentByName("audio")) { |
| 232 offer->description()->GetContentByName("audio")->rejected = !audio; | 249 offer->description()->GetContentByName("audio")->rejected = !audio; |
| 233 } | 250 } |
| 234 if (offer->description()->GetContentByName("video")) { | 251 if (offer->description()->GetContentByName("video")) { |
| 235 offer->description()->GetContentByName("video")->rejected = !video; | 252 offer->description()->GetContentByName("video")->rejected = !video; |
| 236 } | 253 } |
| 237 | 254 |
| 238 std::string sdp; | 255 std::string sdp; |
| 239 EXPECT_TRUE(offer->ToString(&sdp)); | 256 EXPECT_TRUE(offer->ToString(&sdp)); |
| 240 EXPECT_TRUE(DoSetLocalDescription(offer.release())); | 257 EXPECT_TRUE(DoSetLocalDescription(offer.release())); |
| 241 signaling_message_receiver_->ReceiveSdpMessage( | 258 SendSdpMessage(webrtc::SessionDescriptionInterface::kOffer, sdp); |
| 242 webrtc::SessionDescriptionInterface::kOffer, sdp); | 259 } |
| 260 | |
| 261 void SendSdpMessage(const std::string& type, std::string& msg) { | |
| 262 if (signaling_delay_ms_ == 0) { | |
| 263 if (signaling_message_receiver_) { | |
| 264 signaling_message_receiver_->ReceiveSdpMessage(type, msg); | |
|
skvlad
2016/09/06 18:02:09
Is it important to send the message synchronously
Taylor Brandstetter
2016/09/07 00:15:40
Some tests want to ensure that some state changes
| |
| 265 } | |
| 266 } else { | |
| 267 rtc::Thread::Current()->PostDelayed( | |
| 268 RTC_FROM_HERE, signaling_delay_ms_, this, MSG_SDP_MESSAGE, | |
| 269 new rtc::TypedMessageData<SdpMessage>({type, msg})); | |
| 270 } | |
| 271 } | |
| 272 | |
| 273 void SendIceMessage(const std::string& sdp_mid, | |
| 274 int sdp_mline_index, | |
| 275 const std::string& msg) { | |
| 276 if (signaling_delay_ms_ == 0) { | |
| 277 if (signaling_message_receiver_) { | |
| 278 signaling_message_receiver_->ReceiveIceMessage(sdp_mid, sdp_mline_index, | |
| 279 msg); | |
| 280 } | |
| 281 } else { | |
| 282 rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, signaling_delay_ms_, | |
| 283 this, MSG_ICE_MESSAGE, | |
| 284 new rtc::TypedMessageData<IceMessage>( | |
| 285 {sdp_mid, sdp_mline_index, msg})); | |
| 286 } | |
| 287 } | |
| 288 | |
| 289 // MessageHandler callback. | |
| 290 void OnMessage(rtc::Message* msg) override { | |
| 291 switch (msg->message_id) { | |
| 292 case MSG_SDP_MESSAGE: { | |
| 293 auto sdp_message = | |
| 294 static_cast<rtc::TypedMessageData<SdpMessage>*>(msg->pdata); | |
| 295 if (signaling_message_receiver_) { | |
| 296 signaling_message_receiver_->ReceiveSdpMessage( | |
| 297 sdp_message->data().type, sdp_message->data().msg); | |
| 298 } | |
| 299 delete sdp_message; | |
| 300 break; | |
| 301 } | |
| 302 case MSG_ICE_MESSAGE: { | |
| 303 auto ice_message = | |
| 304 static_cast<rtc::TypedMessageData<IceMessage>*>(msg->pdata); | |
| 305 if (signaling_message_receiver_) { | |
| 306 signaling_message_receiver_->ReceiveIceMessage( | |
| 307 ice_message->data().sdp_mid, ice_message->data().sdp_mline_index, | |
| 308 ice_message->data().msg); | |
| 309 } | |
| 310 delete ice_message; | |
| 311 break; | |
| 312 } | |
| 313 default: | |
| 314 RTC_CHECK(false); | |
| 315 } | |
| 243 } | 316 } |
| 244 | 317 |
| 245 // SignalingMessageReceiver callback. | 318 // SignalingMessageReceiver callback. |
| 246 void ReceiveSdpMessage(const std::string& type, std::string& msg) override { | 319 void ReceiveSdpMessage(const std::string& type, std::string& msg) override { |
| 247 FilterIncomingSdpMessage(&msg); | 320 FilterIncomingSdpMessage(&msg); |
| 248 if (type == webrtc::SessionDescriptionInterface::kOffer) { | 321 if (type == webrtc::SessionDescriptionInterface::kOffer) { |
| 249 HandleIncomingOffer(msg); | 322 HandleIncomingOffer(msg); |
| 250 } else { | 323 } else { |
| 251 HandleIncomingAnswer(msg); | 324 HandleIncomingAnswer(msg); |
| 252 } | 325 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 291 } | 364 } |
| 292 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override { | 365 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override { |
| 293 LOG(INFO) << id_ << "OnIceCandidate"; | 366 LOG(INFO) << id_ << "OnIceCandidate"; |
| 294 | 367 |
| 295 std::string ice_sdp; | 368 std::string ice_sdp; |
| 296 EXPECT_TRUE(candidate->ToString(&ice_sdp)); | 369 EXPECT_TRUE(candidate->ToString(&ice_sdp)); |
| 297 if (signaling_message_receiver_ == nullptr) { | 370 if (signaling_message_receiver_ == nullptr) { |
| 298 // Remote party may be deleted. | 371 // Remote party may be deleted. |
| 299 return; | 372 return; |
| 300 } | 373 } |
| 301 signaling_message_receiver_->ReceiveIceMessage( | 374 SendIceMessage(candidate->sdp_mid(), candidate->sdp_mline_index(), ice_sdp); |
| 302 candidate->sdp_mid(), candidate->sdp_mline_index(), ice_sdp); | |
| 303 } | 375 } |
| 304 | 376 |
| 305 // MediaStreamInterface callback | 377 // MediaStreamInterface callback |
| 306 void OnChanged() override { | 378 void OnChanged() override { |
| 307 // Track added or removed from MediaStream, so update our renderers. | 379 // Track added or removed from MediaStream, so update our renderers. |
| 308 rtc::scoped_refptr<StreamCollectionInterface> remote_streams = | 380 rtc::scoped_refptr<StreamCollectionInterface> remote_streams = |
| 309 pc()->remote_streams(); | 381 pc()->remote_streams(); |
| 310 // Remove renderers for tracks that were removed. | 382 // Remove renderers for tracks that were removed. |
| 311 for (auto it = fake_video_renderers_.begin(); | 383 for (auto it = fake_video_renderers_.begin(); |
| 312 it != fake_video_renderers_.end();) { | 384 it != fake_video_renderers_.end();) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 // Defaults to true. | 439 // Defaults to true. |
| 368 void set_auto_add_stream(bool auto_add_stream) { | 440 void set_auto_add_stream(bool auto_add_stream) { |
| 369 auto_add_stream_ = auto_add_stream; | 441 auto_add_stream_ = auto_add_stream; |
| 370 } | 442 } |
| 371 | 443 |
| 372 void set_signaling_message_receiver( | 444 void set_signaling_message_receiver( |
| 373 SignalingMessageReceiver* signaling_message_receiver) { | 445 SignalingMessageReceiver* signaling_message_receiver) { |
| 374 signaling_message_receiver_ = signaling_message_receiver; | 446 signaling_message_receiver_ = signaling_message_receiver; |
| 375 } | 447 } |
| 376 | 448 |
| 449 void set_signaling_delay_ms(int delay_ms) { signaling_delay_ms_ = delay_ms; } | |
| 450 | |
| 377 void EnableVideoDecoderFactory() { | 451 void EnableVideoDecoderFactory() { |
| 378 video_decoder_factory_enabled_ = true; | 452 video_decoder_factory_enabled_ = true; |
| 379 fake_video_decoder_factory_->AddSupportedVideoCodecType( | 453 fake_video_decoder_factory_->AddSupportedVideoCodecType( |
| 380 webrtc::kVideoCodecVP8); | 454 webrtc::kVideoCodecVP8); |
| 381 } | 455 } |
| 382 | 456 |
| 383 void IceRestart() { | 457 void IceRestart() { |
| 384 offer_answer_constraints_.SetMandatoryIceRestart(true); | 458 offer_answer_constraints_.SetMandatoryIceRestart(true); |
| 385 offer_answer_options_.ice_restart = true; | 459 offer_answer_options_.ice_restart = true; |
| 386 SetExpectIceRestart(true); | 460 SetExpectIceRestart(true); |
| 387 } | 461 } |
| 388 | 462 |
| 389 void SetExpectIceRestart(bool expect_restart) { | 463 void SetExpectIceRestart(bool expect_restart) { |
| 390 expect_ice_restart_ = expect_restart; | 464 expect_ice_restart_ = expect_restart; |
| 391 } | 465 } |
| 392 | 466 |
| 393 bool ExpectIceRestart() const { return expect_ice_restart_; } | 467 bool ExpectIceRestart() const { return expect_ice_restart_; } |
| 394 | 468 |
| 469 // Below 3 methods assume streams will be offered. | |
| 470 // Thus they'll only set the "offer to receive" flag to true if it's | |
| 471 // currently false, not if it's just unset. | |
| 395 void SetReceiveAudioVideo(bool audio, bool video) { | 472 void SetReceiveAudioVideo(bool audio, bool video) { |
| 396 SetReceiveAudio(audio); | 473 SetReceiveAudio(audio); |
| 397 SetReceiveVideo(video); | 474 SetReceiveVideo(video); |
| 398 ASSERT_EQ(audio, can_receive_audio()); | 475 ASSERT_EQ(audio, can_receive_audio()); |
| 399 ASSERT_EQ(video, can_receive_video()); | 476 ASSERT_EQ(video, can_receive_video()); |
| 400 } | 477 } |
| 401 | 478 |
| 402 void SetReceiveAudio(bool audio) { | 479 void SetReceiveAudio(bool audio) { |
| 403 if (audio && can_receive_audio()) | 480 if (audio && can_receive_audio()) { |
| 404 return; | 481 return; |
| 482 } | |
| 405 offer_answer_constraints_.SetMandatoryReceiveAudio(audio); | 483 offer_answer_constraints_.SetMandatoryReceiveAudio(audio); |
| 406 offer_answer_options_.offer_to_receive_audio = audio ? 1 : 0; | 484 offer_answer_options_.offer_to_receive_audio = audio ? 1 : 0; |
| 407 } | 485 } |
| 408 | 486 |
| 409 void SetReceiveVideo(bool video) { | 487 void SetReceiveVideo(bool video) { |
| 410 if (video && can_receive_video()) | 488 if (video && can_receive_video()) { |
| 411 return; | 489 return; |
| 490 } | |
| 412 offer_answer_constraints_.SetMandatoryReceiveVideo(video); | 491 offer_answer_constraints_.SetMandatoryReceiveVideo(video); |
| 413 offer_answer_options_.offer_to_receive_video = video ? 1 : 0; | 492 offer_answer_options_.offer_to_receive_video = video ? 1 : 0; |
| 414 } | 493 } |
| 494 | |
| 495 void SetOfferToReceiveAudioVideo(bool audio, bool video) { | |
| 496 offer_answer_constraints_.SetMandatoryReceiveAudio(audio); | |
| 497 offer_answer_options_.offer_to_receive_audio = audio ? 1 : 0; | |
| 498 offer_answer_constraints_.SetMandatoryReceiveVideo(video); | |
| 499 offer_answer_options_.offer_to_receive_video = video ? 1 : 0; | |
| 500 } | |
| 415 | 501 |
| 416 void RemoveMsidFromReceivedSdp(bool remove) { remove_msid_ = remove; } | 502 void RemoveMsidFromReceivedSdp(bool remove) { remove_msid_ = remove; } |
| 417 | 503 |
| 418 void RemoveSdesCryptoFromReceivedSdp(bool remove) { remove_sdes_ = remove; } | 504 void RemoveSdesCryptoFromReceivedSdp(bool remove) { remove_sdes_ = remove; } |
| 419 | 505 |
| 420 void RemoveBundleFromReceivedSdp(bool remove) { remove_bundle_ = remove; } | 506 void RemoveBundleFromReceivedSdp(bool remove) { remove_bundle_ = remove; } |
| 421 | 507 |
| 422 void RemoveCvoFromReceivedSdp(bool remove) { remove_cvo_ = remove; } | 508 void RemoveCvoFromReceivedSdp(bool remove) { remove_cvo_ = remove; } |
| 423 | 509 |
| 424 bool can_receive_audio() { | 510 bool can_receive_audio() { |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 843 private: | 929 private: |
| 844 bool completed_; | 930 bool completed_; |
| 845 std::vector<std::string> tones_; | 931 std::vector<std::string> tones_; |
| 846 }; | 932 }; |
| 847 | 933 |
| 848 explicit PeerConnectionTestClient(const std::string& id) : id_(id) {} | 934 explicit PeerConnectionTestClient(const std::string& id) : id_(id) {} |
| 849 | 935 |
| 850 bool Init( | 936 bool Init( |
| 851 const MediaConstraintsInterface* constraints, | 937 const MediaConstraintsInterface* constraints, |
| 852 const PeerConnectionFactory::Options* options, | 938 const PeerConnectionFactory::Options* options, |
| 853 const PeerConnectionInterface::RTCConfiguration& config, | 939 const PeerConnectionInterface::RTCConfiguration* config, |
| 854 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, | 940 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, |
| 855 bool prefer_constraint_apis, | 941 bool prefer_constraint_apis, |
| 856 rtc::Thread* network_thread, | 942 rtc::Thread* network_thread, |
| 857 rtc::Thread* worker_thread) { | 943 rtc::Thread* worker_thread) { |
| 858 EXPECT_TRUE(!peer_connection_); | 944 EXPECT_TRUE(!peer_connection_); |
| 859 EXPECT_TRUE(!peer_connection_factory_); | 945 EXPECT_TRUE(!peer_connection_factory_); |
| 860 if (!prefer_constraint_apis) { | 946 if (!prefer_constraint_apis) { |
| 861 EXPECT_TRUE(!constraints); | 947 EXPECT_TRUE(!constraints); |
| 862 } | 948 } |
| 863 prefer_constraint_apis_ = prefer_constraint_apis; | 949 prefer_constraint_apis_ = prefer_constraint_apis; |
| 864 | 950 |
| 951 fake_network_manager_.reset(new rtc::FakeNetworkManager()); | |
| 952 fake_network_manager_->AddInterface(rtc::SocketAddress("192.168.1.1", 0)); | |
| 953 | |
| 865 std::unique_ptr<cricket::PortAllocator> port_allocator( | 954 std::unique_ptr<cricket::PortAllocator> port_allocator( |
| 866 new cricket::FakePortAllocator(network_thread, nullptr)); | 955 new cricket::BasicPortAllocator(fake_network_manager_.get())); |
| 867 fake_audio_capture_module_ = FakeAudioCaptureModule::Create(); | 956 fake_audio_capture_module_ = FakeAudioCaptureModule::Create(); |
| 868 | 957 |
| 869 if (fake_audio_capture_module_ == nullptr) { | 958 if (fake_audio_capture_module_ == nullptr) { |
| 870 return false; | 959 return false; |
| 871 } | 960 } |
| 872 fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory(); | 961 fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory(); |
| 873 fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory(); | 962 fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory(); |
| 874 rtc::Thread* const signaling_thread = rtc::Thread::Current(); | 963 rtc::Thread* const signaling_thread = rtc::Thread::Current(); |
| 875 peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( | 964 peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( |
| 876 network_thread, worker_thread, signaling_thread, | 965 network_thread, worker_thread, signaling_thread, |
| 877 fake_audio_capture_module_, fake_video_encoder_factory_, | 966 fake_audio_capture_module_, fake_video_encoder_factory_, |
| 878 fake_video_decoder_factory_); | 967 fake_video_decoder_factory_); |
| 879 if (!peer_connection_factory_) { | 968 if (!peer_connection_factory_) { |
| 880 return false; | 969 return false; |
| 881 } | 970 } |
| 882 if (options) { | 971 if (options) { |
| 883 peer_connection_factory_->SetOptions(*options); | 972 peer_connection_factory_->SetOptions(*options); |
| 884 } | 973 } |
| 885 peer_connection_ = | 974 peer_connection_ = |
| 886 CreatePeerConnection(std::move(port_allocator), constraints, config, | 975 CreatePeerConnection(std::move(port_allocator), constraints, config, |
| 887 std::move(cert_generator)); | 976 std::move(cert_generator)); |
| 888 | |
| 889 return peer_connection_.get() != nullptr; | 977 return peer_connection_.get() != nullptr; |
| 890 } | 978 } |
| 891 | 979 |
| 892 rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection( | 980 rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection( |
| 893 std::unique_ptr<cricket::PortAllocator> port_allocator, | 981 std::unique_ptr<cricket::PortAllocator> port_allocator, |
| 894 const MediaConstraintsInterface* constraints, | 982 const MediaConstraintsInterface* constraints, |
| 895 const PeerConnectionInterface::RTCConfiguration& config, | 983 const PeerConnectionInterface::RTCConfiguration* config, |
| 896 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator) { | 984 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator) { |
| 985 // CreatePeerConnection with RTCConfiguration. | |
| 986 PeerConnectionInterface::RTCConfiguration default_config; | |
| 987 | |
| 988 if (!config) { | |
| 989 config = &default_config; | |
| 990 } | |
| 991 | |
| 897 return peer_connection_factory_->CreatePeerConnection( | 992 return peer_connection_factory_->CreatePeerConnection( |
| 898 config, constraints, std::move(port_allocator), | 993 *config, constraints, std::move(port_allocator), |
| 899 std::move(cert_generator), this); | 994 std::move(cert_generator), this); |
| 900 } | 995 } |
| 901 | 996 |
| 902 void HandleIncomingOffer(const std::string& msg) { | 997 void HandleIncomingOffer(const std::string& msg) { |
| 903 LOG(INFO) << id_ << "HandleIncomingOffer "; | 998 LOG(INFO) << id_ << "HandleIncomingOffer "; |
| 904 if (NumberOfLocalMediaStreams() == 0 && auto_add_stream_) { | 999 if (NumberOfLocalMediaStreams() == 0 && auto_add_stream_) { |
| 905 // If we are not sending any streams ourselves it is time to add some. | 1000 // If we are not sending any streams ourselves it is time to add some. |
| 906 AddMediaStream(true, true); | 1001 AddMediaStream(true, true); |
| 907 } | 1002 } |
| 908 std::unique_ptr<SessionDescriptionInterface> desc( | 1003 std::unique_ptr<SessionDescriptionInterface> desc( |
| 909 webrtc::CreateSessionDescription("offer", msg, nullptr)); | 1004 webrtc::CreateSessionDescription("offer", msg, nullptr)); |
| 910 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); | 1005 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); |
| 911 // Set the RtpReceiverObserver after receivers are created. | 1006 // Set the RtpReceiverObserver after receivers are created. |
| 912 SetRtpReceiverObservers(); | 1007 SetRtpReceiverObservers(); |
| 913 std::unique_ptr<SessionDescriptionInterface> answer; | 1008 std::unique_ptr<SessionDescriptionInterface> answer; |
| 914 EXPECT_TRUE(DoCreateAnswer(&answer)); | 1009 EXPECT_TRUE(DoCreateAnswer(&answer)); |
| 915 std::string sdp; | 1010 std::string sdp; |
| 916 EXPECT_TRUE(answer->ToString(&sdp)); | 1011 EXPECT_TRUE(answer->ToString(&sdp)); |
| 917 EXPECT_TRUE(DoSetLocalDescription(answer.release())); | 1012 EXPECT_TRUE(DoSetLocalDescription(answer.release())); |
| 918 if (signaling_message_receiver_) { | 1013 SendSdpMessage(webrtc::SessionDescriptionInterface::kAnswer, sdp); |
| 919 signaling_message_receiver_->ReceiveSdpMessage( | |
| 920 webrtc::SessionDescriptionInterface::kAnswer, sdp); | |
| 921 } | |
| 922 } | 1014 } |
| 923 | 1015 |
| 924 void HandleIncomingAnswer(const std::string& msg) { | 1016 void HandleIncomingAnswer(const std::string& msg) { |
| 925 LOG(INFO) << id_ << "HandleIncomingAnswer"; | 1017 LOG(INFO) << id_ << "HandleIncomingAnswer"; |
| 926 std::unique_ptr<SessionDescriptionInterface> desc( | 1018 std::unique_ptr<SessionDescriptionInterface> desc( |
| 927 webrtc::CreateSessionDescription("answer", msg, nullptr)); | 1019 webrtc::CreateSessionDescription("answer", msg, nullptr)); |
| 928 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); | 1020 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); |
| 929 // Set the RtpReceiverObserver after receivers are created. | 1021 // Set the RtpReceiverObserver after receivers are created. |
| 930 SetRtpReceiverObservers(); | 1022 SetRtpReceiverObservers(); |
| 931 } | 1023 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1012 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp); | 1104 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp); |
| 1013 } | 1105 } |
| 1014 if (remove_cvo_) { | 1106 if (remove_cvo_) { |
| 1015 const char kSdpCvoExtenstion[] = "urn:3gpp:video-orientation"; | 1107 const char kSdpCvoExtenstion[] = "urn:3gpp:video-orientation"; |
| 1016 RemoveLinesFromSdp(kSdpCvoExtenstion, sdp); | 1108 RemoveLinesFromSdp(kSdpCvoExtenstion, sdp); |
| 1017 } | 1109 } |
| 1018 } | 1110 } |
| 1019 | 1111 |
| 1020 std::string id_; | 1112 std::string id_; |
| 1021 | 1113 |
| 1114 std::unique_ptr<rtc::FakeNetworkManager> fake_network_manager_; | |
| 1115 | |
| 1022 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; | 1116 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; |
| 1023 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> | 1117 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> |
| 1024 peer_connection_factory_; | 1118 peer_connection_factory_; |
| 1025 | 1119 |
| 1026 bool prefer_constraint_apis_ = true; | 1120 bool prefer_constraint_apis_ = true; |
| 1027 bool auto_add_stream_ = true; | 1121 bool auto_add_stream_ = true; |
| 1028 | 1122 |
| 1029 typedef std::pair<std::string, std::string> IceUfragPwdPair; | 1123 typedef std::pair<std::string, std::string> IceUfragPwdPair; |
| 1030 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_; | 1124 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_; |
| 1031 bool expect_ice_restart_ = false; | 1125 bool expect_ice_restart_ = false; |
| 1032 | 1126 |
| 1033 // Needed to keep track of number of frames sent. | 1127 // Needed to keep track of number of frames sent. |
| 1034 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; | 1128 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; |
| 1035 // Needed to keep track of number of frames received. | 1129 // Needed to keep track of number of frames received. |
| 1036 std::map<std::string, std::unique_ptr<webrtc::FakeVideoTrackRenderer>> | 1130 std::map<std::string, std::unique_ptr<webrtc::FakeVideoTrackRenderer>> |
| 1037 fake_video_renderers_; | 1131 fake_video_renderers_; |
| 1038 // Needed to ensure frames aren't received for removed tracks. | 1132 // Needed to ensure frames aren't received for removed tracks. |
| 1039 std::vector<std::unique_ptr<webrtc::FakeVideoTrackRenderer>> | 1133 std::vector<std::unique_ptr<webrtc::FakeVideoTrackRenderer>> |
| 1040 removed_fake_video_renderers_; | 1134 removed_fake_video_renderers_; |
| 1041 // Needed to keep track of number of frames received when external decoder | 1135 // Needed to keep track of number of frames received when external decoder |
| 1042 // used. | 1136 // used. |
| 1043 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; | 1137 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; |
| 1044 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; | 1138 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; |
| 1045 bool video_decoder_factory_enabled_ = false; | 1139 bool video_decoder_factory_enabled_ = false; |
| 1046 webrtc::FakeConstraints video_constraints_; | 1140 webrtc::FakeConstraints video_constraints_; |
| 1047 | 1141 |
| 1048 // For remote peer communication. | 1142 // For remote peer communication. |
| 1049 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; | 1143 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; |
| 1144 int signaling_delay_ms_ = 0; | |
| 1050 | 1145 |
| 1051 // Store references to the video capturers we've created, so that we can stop | 1146 // Store references to the video capturers we've created, so that we can stop |
| 1052 // them, if required. | 1147 // them, if required. |
| 1053 std::vector<cricket::FakeVideoCapturer*> video_capturers_; | 1148 std::vector<cricket::FakeVideoCapturer*> video_capturers_; |
| 1054 webrtc::VideoRotation capture_rotation_ = webrtc::kVideoRotation_0; | 1149 webrtc::VideoRotation capture_rotation_ = webrtc::kVideoRotation_0; |
| 1055 // |local_video_renderer_| attached to the first created local video track. | 1150 // |local_video_renderer_| attached to the first created local video track. |
| 1056 std::unique_ptr<webrtc::FakeVideoTrackRenderer> local_video_renderer_; | 1151 std::unique_ptr<webrtc::FakeVideoTrackRenderer> local_video_renderer_; |
| 1057 | 1152 |
| 1058 webrtc::FakeConstraints offer_answer_constraints_; | 1153 webrtc::FakeConstraints offer_answer_constraints_; |
| 1059 PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_; | 1154 PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1074 | 1169 |
| 1075 class P2PTestConductor : public testing::Test { | 1170 class P2PTestConductor : public testing::Test { |
| 1076 public: | 1171 public: |
| 1077 P2PTestConductor() | 1172 P2PTestConductor() |
| 1078 : pss_(new rtc::PhysicalSocketServer), | 1173 : pss_(new rtc::PhysicalSocketServer), |
| 1079 ss_(new rtc::VirtualSocketServer(pss_.get())), | 1174 ss_(new rtc::VirtualSocketServer(pss_.get())), |
| 1080 network_thread_(new rtc::Thread(ss_.get())), | 1175 network_thread_(new rtc::Thread(ss_.get())), |
| 1081 worker_thread_(rtc::Thread::Create()) { | 1176 worker_thread_(rtc::Thread::Create()) { |
| 1082 RTC_CHECK(network_thread_->Start()); | 1177 RTC_CHECK(network_thread_->Start()); |
| 1083 RTC_CHECK(worker_thread_->Start()); | 1178 RTC_CHECK(worker_thread_->Start()); |
| 1084 webrtc::PeerConnectionInterface::IceServer ice_server; | |
| 1085 ice_server.uri = "stun:stun.l.google.com:19302"; | |
| 1086 config_.servers.push_back(ice_server); | |
| 1087 } | 1179 } |
| 1088 | 1180 |
| 1089 bool SessionActive() { | 1181 bool SessionActive() { |
| 1090 return initiating_client_->SessionActive() && | 1182 return initiating_client_->SessionActive() && |
| 1091 receiving_client_->SessionActive(); | 1183 receiving_client_->SessionActive(); |
| 1092 } | 1184 } |
| 1093 | 1185 |
| 1094 // Return true if the number of frames provided have been received | 1186 // Return true if the number of frames provided have been received |
| 1095 // on the video and audio tracks provided. | 1187 // on the video and audio tracks provided. |
| 1096 bool FramesHaveArrived(int audio_frames_to_receive, | 1188 bool FramesHaveArrived(int audio_frames_to_receive, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1179 } | 1271 } |
| 1180 if (receiving_client_) { | 1272 if (receiving_client_) { |
| 1181 receiving_client_->set_signaling_message_receiver(nullptr); | 1273 receiving_client_->set_signaling_message_receiver(nullptr); |
| 1182 } | 1274 } |
| 1183 } | 1275 } |
| 1184 | 1276 |
| 1185 bool CreateTestClients() { return CreateTestClients(nullptr, nullptr); } | 1277 bool CreateTestClients() { return CreateTestClients(nullptr, nullptr); } |
| 1186 | 1278 |
| 1187 bool CreateTestClients(MediaConstraintsInterface* init_constraints, | 1279 bool CreateTestClients(MediaConstraintsInterface* init_constraints, |
| 1188 MediaConstraintsInterface* recv_constraints) { | 1280 MediaConstraintsInterface* recv_constraints) { |
| 1189 return CreateTestClients(init_constraints, nullptr, recv_constraints, | 1281 return CreateTestClients(init_constraints, nullptr, nullptr, |
| 1190 nullptr); | 1282 recv_constraints, nullptr, nullptr); |
| 1191 } | 1283 } |
| 1192 | 1284 |
| 1193 bool CreateTestClientsThatPreferNoConstraints() { | 1285 bool CreateTestClientsThatPreferNoConstraints() { |
| 1194 initiating_client_.reset( | 1286 initiating_client_.reset( |
| 1195 PeerConnectionTestClient::CreateClientPreferNoConstraints( | 1287 PeerConnectionTestClient::CreateClientPreferNoConstraints( |
| 1196 "Caller: ", nullptr, config_, network_thread_.get(), | 1288 "Caller: ", nullptr, network_thread_.get(), worker_thread_.get())); |
| 1197 worker_thread_.get())); | |
| 1198 receiving_client_.reset( | 1289 receiving_client_.reset( |
| 1199 PeerConnectionTestClient::CreateClientPreferNoConstraints( | 1290 PeerConnectionTestClient::CreateClientPreferNoConstraints( |
| 1200 "Callee: ", nullptr, config_, network_thread_.get(), | 1291 "Callee: ", nullptr, network_thread_.get(), worker_thread_.get())); |
| 1201 worker_thread_.get())); | |
| 1202 if (!initiating_client_ || !receiving_client_) { | 1292 if (!initiating_client_ || !receiving_client_) { |
| 1203 return false; | 1293 return false; |
| 1204 } | 1294 } |
| 1205 // Remember the choice for possible later resets of the clients. | 1295 // Remember the choice for possible later resets of the clients. |
| 1206 prefer_constraint_apis_ = false; | 1296 prefer_constraint_apis_ = false; |
| 1207 SetSignalingReceivers(); | 1297 SetSignalingReceivers(); |
| 1208 return true; | 1298 return true; |
| 1209 } | 1299 } |
| 1210 | 1300 |
| 1211 void SetSignalingReceivers() { | 1301 void SetSignalingReceivers() { |
| 1212 initiating_client_->set_signaling_message_receiver(receiving_client_.get()); | 1302 initiating_client_->set_signaling_message_receiver(receiving_client_.get()); |
| 1213 receiving_client_->set_signaling_message_receiver(initiating_client_.get()); | 1303 receiving_client_->set_signaling_message_receiver(initiating_client_.get()); |
| 1214 } | 1304 } |
| 1215 | 1305 |
| 1216 bool CreateTestClients(MediaConstraintsInterface* init_constraints, | 1306 void SetSignalingDelayMs(int delay_ms) { |
| 1217 PeerConnectionFactory::Options* init_options, | 1307 initiating_client_->set_signaling_delay_ms(delay_ms); |
| 1218 MediaConstraintsInterface* recv_constraints, | 1308 receiving_client_->set_signaling_delay_ms(delay_ms); |
| 1219 PeerConnectionFactory::Options* recv_options) { | 1309 } |
| 1310 | |
| 1311 bool CreateTestClients( | |
| 1312 MediaConstraintsInterface* init_constraints, | |
| 1313 PeerConnectionFactory::Options* init_options, | |
| 1314 const PeerConnectionInterface::RTCConfiguration* init_config, | |
| 1315 MediaConstraintsInterface* recv_constraints, | |
| 1316 PeerConnectionFactory::Options* recv_options, | |
| 1317 const PeerConnectionInterface::RTCConfiguration* recv_config) { | |
| 1220 initiating_client_.reset(PeerConnectionTestClient::CreateClient( | 1318 initiating_client_.reset(PeerConnectionTestClient::CreateClient( |
| 1221 "Caller: ", init_constraints, init_options, config_, | 1319 "Caller: ", init_constraints, init_options, init_config, |
| 1222 network_thread_.get(), worker_thread_.get())); | 1320 network_thread_.get(), worker_thread_.get())); |
| 1223 receiving_client_.reset(PeerConnectionTestClient::CreateClient( | 1321 receiving_client_.reset(PeerConnectionTestClient::CreateClient( |
| 1224 "Callee: ", recv_constraints, recv_options, config_, | 1322 "Callee: ", recv_constraints, recv_options, recv_config, |
| 1225 network_thread_.get(), worker_thread_.get())); | 1323 network_thread_.get(), worker_thread_.get())); |
| 1226 if (!initiating_client_ || !receiving_client_) { | 1324 if (!initiating_client_ || !receiving_client_) { |
| 1227 return false; | 1325 return false; |
| 1228 } | 1326 } |
| 1229 SetSignalingReceivers(); | 1327 SetSignalingReceivers(); |
| 1230 return true; | 1328 return true; |
| 1231 } | 1329 } |
| 1232 | 1330 |
| 1233 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints, | 1331 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints, |
| 1234 const webrtc::FakeConstraints& recv_constraints) { | 1332 const webrtc::FakeConstraints& recv_constraints) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1315 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, | 1413 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, |
| 1316 true); | 1414 true); |
| 1317 | 1415 |
| 1318 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( | 1416 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator( |
| 1319 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? | 1417 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? |
| 1320 new FakeRTCCertificateGenerator() : nullptr); | 1418 new FakeRTCCertificateGenerator() : nullptr); |
| 1321 cert_generator->use_alternate_key(); | 1419 cert_generator->use_alternate_key(); |
| 1322 | 1420 |
| 1323 // Make sure the new client is using a different certificate. | 1421 // Make sure the new client is using a different certificate. |
| 1324 return PeerConnectionTestClient::CreateClientWithDtlsIdentityStore( | 1422 return PeerConnectionTestClient::CreateClientWithDtlsIdentityStore( |
| 1325 "New Peer: ", &setup_constraints, nullptr, config_, | 1423 "New Peer: ", &setup_constraints, nullptr, nullptr, |
| 1326 std::move(cert_generator), prefer_constraint_apis_, | 1424 std::move(cert_generator), prefer_constraint_apis_, |
| 1327 network_thread_.get(), worker_thread_.get()); | 1425 network_thread_.get(), worker_thread_.get()); |
| 1328 } | 1426 } |
| 1329 | 1427 |
| 1330 void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) { | 1428 void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) { |
| 1331 // Messages may get lost on the unreliable DataChannel, so we send multiple | 1429 // Messages may get lost on the unreliable DataChannel, so we send multiple |
| 1332 // times to avoid test flakiness. | 1430 // times to avoid test flakiness. |
| 1333 static const size_t kSendAttempts = 5; | 1431 static const size_t kSendAttempts = 5; |
| 1334 | 1432 |
| 1335 for (size_t i = 0; i < kSendAttempts; ++i) { | 1433 for (size_t i = 0; i < kSendAttempts; ++i) { |
| 1336 dc->Send(DataBuffer(data)); | 1434 dc->Send(DataBuffer(data)); |
| 1337 } | 1435 } |
| 1338 } | 1436 } |
| 1339 | 1437 |
| 1438 rtc::Thread* network_thread() { return network_thread_.get(); } | |
| 1439 | |
| 1440 rtc::VirtualSocketServer* virtual_socket_server() { return ss_.get(); } | |
| 1441 | |
| 1340 PeerConnectionTestClient* initializing_client() { | 1442 PeerConnectionTestClient* initializing_client() { |
| 1341 return initiating_client_.get(); | 1443 return initiating_client_.get(); |
| 1342 } | 1444 } |
| 1343 | 1445 |
| 1344 // Set the |initiating_client_| to the |client| passed in and return the | 1446 // Set the |initiating_client_| to the |client| passed in and return the |
| 1345 // original |initiating_client_|. | 1447 // original |initiating_client_|. |
| 1346 PeerConnectionTestClient* set_initializing_client( | 1448 PeerConnectionTestClient* set_initializing_client( |
| 1347 PeerConnectionTestClient* client) { | 1449 PeerConnectionTestClient* client) { |
| 1348 PeerConnectionTestClient* old = initiating_client_.release(); | 1450 PeerConnectionTestClient* old = initiating_client_.release(); |
| 1349 initiating_client_.reset(client); | 1451 initiating_client_.reset(client); |
| 1350 return old; | 1452 return old; |
| 1351 } | 1453 } |
| 1352 | 1454 |
| 1353 PeerConnectionTestClient* receiving_client() { | 1455 PeerConnectionTestClient* receiving_client() { |
| 1354 return receiving_client_.get(); | 1456 return receiving_client_.get(); |
| 1355 } | 1457 } |
| 1356 | 1458 |
| 1357 // Set the |receiving_client_| to the |client| passed in and return the | 1459 // Set the |receiving_client_| to the |client| passed in and return the |
| 1358 // original |receiving_client_|. | 1460 // original |receiving_client_|. |
| 1359 PeerConnectionTestClient* set_receiving_client( | 1461 PeerConnectionTestClient* set_receiving_client( |
| 1360 PeerConnectionTestClient* client) { | 1462 PeerConnectionTestClient* client) { |
| 1361 PeerConnectionTestClient* old = receiving_client_.release(); | 1463 PeerConnectionTestClient* old = receiving_client_.release(); |
| 1362 receiving_client_.reset(client); | 1464 receiving_client_.reset(client); |
| 1363 return old; | 1465 return old; |
| 1364 } | 1466 } |
| 1365 webrtc::PeerConnectionInterface::RTCConfiguration* config() { | |
| 1366 return &config_; | |
| 1367 } | |
| 1368 | 1467 |
| 1369 bool AllObserversReceived( | 1468 bool AllObserversReceived( |
| 1370 const std::vector<std::unique_ptr<MockRtpReceiverObserver>>& observers) { | 1469 const std::vector<std::unique_ptr<MockRtpReceiverObserver>>& observers) { |
| 1371 for (auto& observer : observers) { | 1470 for (auto& observer : observers) { |
| 1372 if (!observer->first_packet_received()) { | 1471 if (!observer->first_packet_received()) { |
| 1373 return false; | 1472 return false; |
| 1374 } | 1473 } |
| 1375 } | 1474 } |
| 1376 return true; | 1475 return true; |
| 1377 } | 1476 } |
| 1378 | 1477 |
| 1379 void TestGcmNegotiation(bool local_gcm_enabled, bool remote_gcm_enabled, | 1478 void TestGcmNegotiation(bool local_gcm_enabled, bool remote_gcm_enabled, |
| 1380 int expected_cipher_suite) { | 1479 int expected_cipher_suite) { |
| 1381 PeerConnectionFactory::Options init_options; | 1480 PeerConnectionFactory::Options init_options; |
| 1382 init_options.crypto_options.enable_gcm_crypto_suites = local_gcm_enabled; | 1481 init_options.crypto_options.enable_gcm_crypto_suites = local_gcm_enabled; |
| 1383 PeerConnectionFactory::Options recv_options; | 1482 PeerConnectionFactory::Options recv_options; |
| 1384 recv_options.crypto_options.enable_gcm_crypto_suites = remote_gcm_enabled; | 1483 recv_options.crypto_options.enable_gcm_crypto_suites = remote_gcm_enabled; |
| 1385 ASSERT_TRUE( | 1484 ASSERT_TRUE(CreateTestClients(nullptr, &init_options, nullptr, nullptr, |
| 1386 CreateTestClients(nullptr, &init_options, nullptr, &recv_options)); | 1485 &recv_options, nullptr)); |
| 1387 rtc::scoped_refptr<webrtc::FakeMetricsObserver> | 1486 rtc::scoped_refptr<webrtc::FakeMetricsObserver> |
| 1388 init_observer = | 1487 init_observer = |
| 1389 new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); | 1488 new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
| 1390 initializing_client()->pc()->RegisterUMAObserver(init_observer); | 1489 initializing_client()->pc()->RegisterUMAObserver(init_observer); |
| 1391 LocalP2PTest(); | 1490 LocalP2PTest(); |
| 1392 | 1491 |
| 1393 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(expected_cipher_suite), | 1492 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(expected_cipher_suite), |
| 1394 initializing_client()->GetSrtpCipherStats(), | 1493 initializing_client()->GetSrtpCipherStats(), |
| 1395 kMaxWaitMs); | 1494 kMaxWaitMs); |
| 1396 EXPECT_EQ(1, | 1495 EXPECT_EQ(1, |
| 1397 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, | 1496 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, |
| 1398 expected_cipher_suite)); | 1497 expected_cipher_suite)); |
| 1399 } | 1498 } |
| 1400 | 1499 |
| 1401 private: | 1500 private: |
| 1402 // |ss_| is used by |network_thread_| so it must be destroyed later. | 1501 // |ss_| is used by |network_thread_| so it must be destroyed later. |
| 1403 std::unique_ptr<rtc::PhysicalSocketServer> pss_; | 1502 std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
| 1404 std::unique_ptr<rtc::VirtualSocketServer> ss_; | 1503 std::unique_ptr<rtc::VirtualSocketServer> ss_; |
| 1405 // |network_thread_| and |worker_thread_| are used by both | 1504 // |network_thread_| and |worker_thread_| are used by both |
| 1406 // |initiating_client_| and |receiving_client_| so they must be destroyed | 1505 // |initiating_client_| and |receiving_client_| so they must be destroyed |
| 1407 // later. | 1506 // later. |
| 1408 std::unique_ptr<rtc::Thread> network_thread_; | 1507 std::unique_ptr<rtc::Thread> network_thread_; |
| 1409 std::unique_ptr<rtc::Thread> worker_thread_; | 1508 std::unique_ptr<rtc::Thread> worker_thread_; |
| 1410 std::unique_ptr<PeerConnectionTestClient> initiating_client_; | 1509 std::unique_ptr<PeerConnectionTestClient> initiating_client_; |
| 1411 std::unique_ptr<PeerConnectionTestClient> receiving_client_; | 1510 std::unique_ptr<PeerConnectionTestClient> receiving_client_; |
| 1412 bool prefer_constraint_apis_ = true; | 1511 bool prefer_constraint_apis_ = true; |
| 1413 webrtc::PeerConnectionInterface::RTCConfiguration config_; | |
| 1414 }; | 1512 }; |
| 1415 | 1513 |
| 1416 // Disable for TSan v2, see | 1514 // Disable for TSan v2, see |
| 1417 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. | 1515 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. |
| 1418 #if !defined(THREAD_SANITIZER) | 1516 #if !defined(THREAD_SANITIZER) |
| 1419 | 1517 |
| 1420 TEST_F(P2PTestConductor, TestRtpReceiverObserverCallbackFunction) { | 1518 TEST_F(P2PTestConductor, TestRtpReceiverObserverCallbackFunction) { |
| 1421 ASSERT_TRUE(CreateTestClients()); | 1519 ASSERT_TRUE(CreateTestClients()); |
| 1422 LocalP2PTest(); | 1520 LocalP2PTest(); |
| 1423 EXPECT_TRUE_WAIT( | 1521 EXPECT_TRUE_WAIT( |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1746 initializing_client()->GetBytesSentStats(local_video_track) > 0, | 1844 initializing_client()->GetBytesSentStats(local_video_track) > 0, |
| 1747 kMaxWaitForStatsMs); | 1845 kMaxWaitForStatsMs); |
| 1748 } | 1846 } |
| 1749 | 1847 |
| 1750 // Test that DTLS 1.0 is used if both sides only support DTLS 1.0. | 1848 // Test that DTLS 1.0 is used if both sides only support DTLS 1.0. |
| 1751 TEST_F(P2PTestConductor, GetDtls12None) { | 1849 TEST_F(P2PTestConductor, GetDtls12None) { |
| 1752 PeerConnectionFactory::Options init_options; | 1850 PeerConnectionFactory::Options init_options; |
| 1753 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; | 1851 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; |
| 1754 PeerConnectionFactory::Options recv_options; | 1852 PeerConnectionFactory::Options recv_options; |
| 1755 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; | 1853 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; |
| 1756 ASSERT_TRUE( | 1854 ASSERT_TRUE(CreateTestClients(nullptr, &init_options, nullptr, nullptr, |
| 1757 CreateTestClients(nullptr, &init_options, nullptr, &recv_options)); | 1855 &recv_options, nullptr)); |
| 1758 rtc::scoped_refptr<webrtc::FakeMetricsObserver> | 1856 rtc::scoped_refptr<webrtc::FakeMetricsObserver> |
| 1759 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); | 1857 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
| 1760 initializing_client()->pc()->RegisterUMAObserver(init_observer); | 1858 initializing_client()->pc()->RegisterUMAObserver(init_observer); |
| 1761 LocalP2PTest(); | 1859 LocalP2PTest(); |
| 1762 | 1860 |
| 1763 EXPECT_TRUE_WAIT( | 1861 EXPECT_TRUE_WAIT( |
| 1764 rtc::SSLStreamAdapter::IsAcceptableCipher( | 1862 rtc::SSLStreamAdapter::IsAcceptableCipher( |
| 1765 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), | 1863 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), |
| 1766 kMaxWaitForStatsMs); | 1864 kMaxWaitForStatsMs); |
| 1767 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), | 1865 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), |
| 1768 initializing_client()->GetSrtpCipherStats(), | 1866 initializing_client()->GetSrtpCipherStats(), |
| 1769 kMaxWaitForStatsMs); | 1867 kMaxWaitForStatsMs); |
| 1770 EXPECT_EQ(1, | 1868 EXPECT_EQ(1, |
| 1771 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, | 1869 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, |
| 1772 kDefaultSrtpCryptoSuite)); | 1870 kDefaultSrtpCryptoSuite)); |
| 1773 } | 1871 } |
| 1774 | 1872 |
| 1775 // Test that DTLS 1.2 is used if both ends support it. | 1873 // Test that DTLS 1.2 is used if both ends support it. |
| 1776 TEST_F(P2PTestConductor, GetDtls12Both) { | 1874 TEST_F(P2PTestConductor, GetDtls12Both) { |
| 1777 PeerConnectionFactory::Options init_options; | 1875 PeerConnectionFactory::Options init_options; |
| 1778 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; | 1876 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; |
| 1779 PeerConnectionFactory::Options recv_options; | 1877 PeerConnectionFactory::Options recv_options; |
| 1780 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; | 1878 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; |
| 1781 ASSERT_TRUE( | 1879 ASSERT_TRUE(CreateTestClients(nullptr, &init_options, nullptr, nullptr, |
| 1782 CreateTestClients(nullptr, &init_options, nullptr, &recv_options)); | 1880 &recv_options, nullptr)); |
| 1783 rtc::scoped_refptr<webrtc::FakeMetricsObserver> | 1881 rtc::scoped_refptr<webrtc::FakeMetricsObserver> |
| 1784 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); | 1882 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
| 1785 initializing_client()->pc()->RegisterUMAObserver(init_observer); | 1883 initializing_client()->pc()->RegisterUMAObserver(init_observer); |
| 1786 LocalP2PTest(); | 1884 LocalP2PTest(); |
| 1787 | 1885 |
| 1788 EXPECT_TRUE_WAIT( | 1886 EXPECT_TRUE_WAIT( |
| 1789 rtc::SSLStreamAdapter::IsAcceptableCipher( | 1887 rtc::SSLStreamAdapter::IsAcceptableCipher( |
| 1790 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), | 1888 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), |
| 1791 kMaxWaitForStatsMs); | 1889 kMaxWaitForStatsMs); |
| 1792 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), | 1890 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), |
| 1793 initializing_client()->GetSrtpCipherStats(), | 1891 initializing_client()->GetSrtpCipherStats(), |
| 1794 kMaxWaitForStatsMs); | 1892 kMaxWaitForStatsMs); |
| 1795 EXPECT_EQ(1, | 1893 EXPECT_EQ(1, |
| 1796 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, | 1894 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, |
| 1797 kDefaultSrtpCryptoSuite)); | 1895 kDefaultSrtpCryptoSuite)); |
| 1798 } | 1896 } |
| 1799 | 1897 |
| 1800 // Test that DTLS 1.0 is used if the initator supports DTLS 1.2 and the | 1898 // Test that DTLS 1.0 is used if the initator supports DTLS 1.2 and the |
| 1801 // received supports 1.0. | 1899 // received supports 1.0. |
| 1802 TEST_F(P2PTestConductor, GetDtls12Init) { | 1900 TEST_F(P2PTestConductor, GetDtls12Init) { |
| 1803 PeerConnectionFactory::Options init_options; | 1901 PeerConnectionFactory::Options init_options; |
| 1804 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; | 1902 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; |
| 1805 PeerConnectionFactory::Options recv_options; | 1903 PeerConnectionFactory::Options recv_options; |
| 1806 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; | 1904 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; |
| 1807 ASSERT_TRUE( | 1905 ASSERT_TRUE(CreateTestClients(nullptr, &init_options, nullptr, nullptr, |
| 1808 CreateTestClients(nullptr, &init_options, nullptr, &recv_options)); | 1906 &recv_options, nullptr)); |
| 1809 rtc::scoped_refptr<webrtc::FakeMetricsObserver> | 1907 rtc::scoped_refptr<webrtc::FakeMetricsObserver> |
| 1810 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); | 1908 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
| 1811 initializing_client()->pc()->RegisterUMAObserver(init_observer); | 1909 initializing_client()->pc()->RegisterUMAObserver(init_observer); |
| 1812 LocalP2PTest(); | 1910 LocalP2PTest(); |
| 1813 | 1911 |
| 1814 EXPECT_TRUE_WAIT( | 1912 EXPECT_TRUE_WAIT( |
| 1815 rtc::SSLStreamAdapter::IsAcceptableCipher( | 1913 rtc::SSLStreamAdapter::IsAcceptableCipher( |
| 1816 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), | 1914 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), |
| 1817 kMaxWaitForStatsMs); | 1915 kMaxWaitForStatsMs); |
| 1818 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), | 1916 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), |
| 1819 initializing_client()->GetSrtpCipherStats(), | 1917 initializing_client()->GetSrtpCipherStats(), |
| 1820 kMaxWaitForStatsMs); | 1918 kMaxWaitForStatsMs); |
| 1821 EXPECT_EQ(1, | 1919 EXPECT_EQ(1, |
| 1822 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, | 1920 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher, |
| 1823 kDefaultSrtpCryptoSuite)); | 1921 kDefaultSrtpCryptoSuite)); |
| 1824 } | 1922 } |
| 1825 | 1923 |
| 1826 // Test that DTLS 1.0 is used if the initator supports DTLS 1.0 and the | 1924 // Test that DTLS 1.0 is used if the initator supports DTLS 1.0 and the |
| 1827 // received supports 1.2. | 1925 // received supports 1.2. |
| 1828 TEST_F(P2PTestConductor, GetDtls12Recv) { | 1926 TEST_F(P2PTestConductor, GetDtls12Recv) { |
| 1829 PeerConnectionFactory::Options init_options; | 1927 PeerConnectionFactory::Options init_options; |
| 1830 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; | 1928 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10; |
| 1831 PeerConnectionFactory::Options recv_options; | 1929 PeerConnectionFactory::Options recv_options; |
| 1832 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; | 1930 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12; |
| 1833 ASSERT_TRUE( | 1931 ASSERT_TRUE(CreateTestClients(nullptr, &init_options, nullptr, nullptr, |
| 1834 CreateTestClients(nullptr, &init_options, nullptr, &recv_options)); | 1932 &recv_options, nullptr)); |
| 1835 rtc::scoped_refptr<webrtc::FakeMetricsObserver> | 1933 rtc::scoped_refptr<webrtc::FakeMetricsObserver> |
| 1836 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); | 1934 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
| 1837 initializing_client()->pc()->RegisterUMAObserver(init_observer); | 1935 initializing_client()->pc()->RegisterUMAObserver(init_observer); |
| 1838 LocalP2PTest(); | 1936 LocalP2PTest(); |
| 1839 | 1937 |
| 1840 EXPECT_TRUE_WAIT( | 1938 EXPECT_TRUE_WAIT( |
| 1841 rtc::SSLStreamAdapter::IsAcceptableCipher( | 1939 rtc::SSLStreamAdapter::IsAcceptableCipher( |
| 1842 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), | 1940 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT), |
| 1843 kMaxWaitForStatsMs); | 1941 kMaxWaitForStatsMs); |
| 1844 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), | 1942 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite), |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2125 EXPECT_TRUE( | 2223 EXPECT_TRUE( |
| 2126 video_sender->SetTrack(initializing_client()->CreateLocalVideoTrack(""))); | 2224 video_sender->SetTrack(initializing_client()->CreateLocalVideoTrack(""))); |
| 2127 EXPECT_TRUE_WAIT(FramesHaveArrived(kEndAudioFrameCount, kEndVideoFrameCount), | 2225 EXPECT_TRUE_WAIT(FramesHaveArrived(kEndAudioFrameCount, kEndVideoFrameCount), |
| 2128 kMaxWaitForFramesMs); | 2226 kMaxWaitForFramesMs); |
| 2129 } | 2227 } |
| 2130 | 2228 |
| 2131 #ifdef HAVE_QUIC | 2229 #ifdef HAVE_QUIC |
| 2132 // This test sets up a call between two parties using QUIC instead of DTLS for | 2230 // This test sets up a call between two parties using QUIC instead of DTLS for |
| 2133 // audio and video, and a QUIC data channel. | 2231 // audio and video, and a QUIC data channel. |
| 2134 TEST_F(P2PTestConductor, LocalP2PTestQuicDataChannel) { | 2232 TEST_F(P2PTestConductor, LocalP2PTestQuicDataChannel) { |
| 2135 config()->enable_quic = true; | 2233 PeerConnectionInterface::RTCConfiguration quic_config; |
| 2234 quic_config.enable_quic = true; | |
| 2235 ASSERT_TRUE(CreateTestClients(nullptr, nullptr, &quic_config, nullptr, | |
| 2236 nullptr, &quic_config)); | |
| 2136 ASSERT_TRUE(CreateTestClients()); | 2237 ASSERT_TRUE(CreateTestClients()); |
| 2137 webrtc::DataChannelInit init; | 2238 webrtc::DataChannelInit init; |
| 2138 init.ordered = false; | 2239 init.ordered = false; |
| 2139 init.reliable = true; | 2240 init.reliable = true; |
| 2140 init.id = 1; | 2241 init.id = 1; |
| 2141 initializing_client()->CreateDataChannel(&init); | 2242 initializing_client()->CreateDataChannel(&init); |
| 2142 receiving_client()->CreateDataChannel(&init); | 2243 receiving_client()->CreateDataChannel(&init); |
| 2143 LocalP2PTest(); | 2244 LocalP2PTest(); |
| 2144 ASSERT_NE(nullptr, initializing_client()->data_channel()); | 2245 ASSERT_NE(nullptr, initializing_client()->data_channel()); |
| 2145 ASSERT_NE(nullptr, receiving_client()->data_channel()); | 2246 ASSERT_NE(nullptr, receiving_client()->data_channel()); |
| 2146 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(), | 2247 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(), |
| 2147 kMaxWaitMs); | 2248 kMaxWaitMs); |
| 2148 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), kMaxWaitMs); | 2249 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), kMaxWaitMs); |
| 2149 | 2250 |
| 2150 std::string data = "hello world"; | 2251 std::string data = "hello world"; |
| 2151 | 2252 |
| 2152 initializing_client()->data_channel()->Send(DataBuffer(data)); | 2253 initializing_client()->data_channel()->Send(DataBuffer(data)); |
| 2153 EXPECT_EQ_WAIT(data, receiving_client()->data_observer()->last_message(), | 2254 EXPECT_EQ_WAIT(data, receiving_client()->data_observer()->last_message(), |
| 2154 kMaxWaitMs); | 2255 kMaxWaitMs); |
| 2155 | 2256 |
| 2156 receiving_client()->data_channel()->Send(DataBuffer(data)); | 2257 receiving_client()->data_channel()->Send(DataBuffer(data)); |
| 2157 EXPECT_EQ_WAIT(data, initializing_client()->data_observer()->last_message(), | 2258 EXPECT_EQ_WAIT(data, initializing_client()->data_observer()->last_message(), |
| 2158 kMaxWaitMs); | 2259 kMaxWaitMs); |
| 2159 } | 2260 } |
| 2160 | 2261 |
| 2161 // Tests that negotiation of QUIC data channels is completed without error. | 2262 // Tests that negotiation of QUIC data channels is completed without error. |
| 2162 TEST_F(P2PTestConductor, NegotiateQuicDataChannel) { | 2263 TEST_F(P2PTestConductor, NegotiateQuicDataChannel) { |
| 2163 config()->enable_quic = true; | 2264 PeerConnectionInterface::RTCConfiguration quic_config; |
| 2265 quic_config.enable_quic = true; | |
| 2266 ASSERT_TRUE(CreateTestClients(nullptr, &quic_config, nullptr, nullptr, | |
| 2267 &quic_config, nullptr)); | |
| 2164 FakeConstraints constraints; | 2268 FakeConstraints constraints; |
| 2165 constraints.SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, true); | 2269 constraints.SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, true); |
| 2166 ASSERT_TRUE(CreateTestClients(&constraints, &constraints)); | 2270 ASSERT_TRUE(CreateTestClients(&constraints, &constraints)); |
| 2167 webrtc::DataChannelInit init; | 2271 webrtc::DataChannelInit init; |
| 2168 init.ordered = false; | 2272 init.ordered = false; |
| 2169 init.reliable = true; | 2273 init.reliable = true; |
| 2170 init.id = 1; | 2274 init.id = 1; |
| 2171 initializing_client()->CreateDataChannel(&init); | 2275 initializing_client()->CreateDataChannel(&init); |
| 2172 initializing_client()->Negotiate(false, false); | 2276 initializing_client()->Negotiate(false, false); |
| 2173 } | 2277 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2225 // Echo the stream back. | 2329 // Echo the stream back. |
| 2226 receiving_client()->pc()->AddStream( | 2330 receiving_client()->pc()->AddStream( |
| 2227 receiving_client()->remote_streams()->at(0)); | 2331 receiving_client()->remote_streams()->at(0)); |
| 2228 receiving_client()->Negotiate(); | 2332 receiving_client()->Negotiate(); |
| 2229 | 2333 |
| 2230 EXPECT_TRUE_WAIT( | 2334 EXPECT_TRUE_WAIT( |
| 2231 initializing_client()->VideoFramesReceivedCheck(kEndVideoFrameCount), | 2335 initializing_client()->VideoFramesReceivedCheck(kEndVideoFrameCount), |
| 2232 kMaxWaitForFramesMs); | 2336 kMaxWaitForFramesMs); |
| 2233 } | 2337 } |
| 2234 | 2338 |
| 2339 // Test that we achieve the expected end-to-end connection time, using a | |
| 2340 // fake clock and simulated latency on the media and signaling paths. | |
| 2341 // We use a TURN<->TURN connection because this is usually the quickest to | |
| 2342 // set up initially, especially when we're confident the connection will work | |
| 2343 // and can start sending media before we get a STUN response. | |
| 2344 // | |
| 2345 // With various optimizations enabled, here are the network delays we expect to | |
| 2346 // be on the critical path: | |
| 2347 // 1. 2 signaling trips: Signaling offer and offerer's TURN candidate, then | |
| 2348 // signaling answer (with DTLS fingerprint). | |
| 2349 // 2. 9 media hops: Rest of the DTLS handshake. 3 hops in each direction when | |
| 2350 // using TURN<->TURN pair, and DTLS exchange is 4 packets, | |
| 2351 // the first of which should have arrived before the answer. | |
| 2352 TEST_F(P2PTestConductor, EndToEndConnectionTimeWithTurnTurnPair) { | |
| 2353 rtc::ScopedFakeClock fake_clock; | |
| 2354 // Some things use a time of "0" as a special value, so we need to start out | |
| 2355 // the fake clock at a nonzero time. | |
| 2356 // TODO(deadbeef): Fix this. | |
| 2357 fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); | |
| 2358 | |
| 2359 static constexpr int media_hop_delay_ms = 50; | |
| 2360 static constexpr int signaling_trip_delay_ms = 500; | |
| 2361 // For explanation of these values, see comment above. | |
| 2362 static constexpr int required_media_hops = 9; | |
| 2363 static constexpr int required_signaling_trips = 2; | |
| 2364 // For internal delays (such as posting an event asychronously). | |
| 2365 static constexpr int allowed_internal_delay_ms = 20; | |
|
skvlad
2016/09/06 18:02:09
Is this actually needed with a fake clock? Looks l
Taylor Brandstetter
2016/09/07 00:15:40
The thing is, handling a message can post another
| |
| 2366 static constexpr int total_connection_time_ms = | |
| 2367 media_hop_delay_ms * required_media_hops + | |
| 2368 signaling_trip_delay_ms * required_signaling_trips + | |
| 2369 allowed_internal_delay_ms; | |
| 2370 | |
| 2371 static const rtc::SocketAddress turn_server_1_internal_address{"88.88.88.0", | |
| 2372 3478}; | |
| 2373 static const rtc::SocketAddress turn_server_1_external_address{"88.88.88.1", | |
| 2374 0}; | |
| 2375 static const rtc::SocketAddress turn_server_2_internal_address{"99.99.99.0", | |
| 2376 3478}; | |
| 2377 static const rtc::SocketAddress turn_server_2_external_address{"99.99.99.1", | |
| 2378 0}; | |
| 2379 cricket::TestTurnServer turn_server_1(network_thread(), | |
| 2380 turn_server_1_internal_address, | |
| 2381 turn_server_1_external_address); | |
| 2382 cricket::TestTurnServer turn_server_2(network_thread(), | |
| 2383 turn_server_2_internal_address, | |
| 2384 turn_server_2_external_address); | |
| 2385 // Bypass permission check on received packets so media can be sent before | |
| 2386 // the candidate is signaled. | |
| 2387 turn_server_1.set_enable_permission_checks(false); | |
| 2388 turn_server_2.set_enable_permission_checks(false); | |
| 2389 | |
| 2390 PeerConnectionInterface::RTCConfiguration client_1_config; | |
| 2391 webrtc::PeerConnectionInterface::IceServer ice_server_1; | |
| 2392 ice_server_1.urls.push_back("turn:88.88.88.0:3478"); | |
| 2393 ice_server_1.username = "test"; | |
| 2394 ice_server_1.password = "test"; | |
| 2395 client_1_config.servers.push_back(ice_server_1); | |
| 2396 client_1_config.type = webrtc::PeerConnectionInterface::kRelay; | |
| 2397 client_1_config.presume_writable_when_fully_relayed = true; | |
| 2398 | |
| 2399 PeerConnectionInterface::RTCConfiguration client_2_config; | |
| 2400 webrtc::PeerConnectionInterface::IceServer ice_server_2; | |
| 2401 ice_server_2.urls.push_back("turn:99.99.99.0:3478"); | |
| 2402 ice_server_2.username = "test"; | |
| 2403 ice_server_2.password = "test"; | |
| 2404 client_2_config.servers.push_back(ice_server_2); | |
| 2405 client_2_config.type = webrtc::PeerConnectionInterface::kRelay; | |
| 2406 client_2_config.presume_writable_when_fully_relayed = true; | |
| 2407 | |
| 2408 ASSERT_TRUE(CreateTestClients(nullptr, nullptr, &client_1_config, nullptr, | |
| 2409 nullptr, &client_2_config)); | |
| 2410 // Set up the simulated delays. | |
| 2411 SetSignalingDelayMs(signaling_trip_delay_ms); | |
| 2412 virtual_socket_server()->set_delay_mean(media_hop_delay_ms); | |
| 2413 virtual_socket_server()->UpdateDelayDistribution(); | |
| 2414 | |
| 2415 initializing_client()->SetOfferToReceiveAudioVideo(true, true); | |
| 2416 initializing_client()->Negotiate(); | |
| 2417 // TODO(deadbeef): kIceConnectionConnected currently means both ICE and DTLS | |
| 2418 // are connected. This is an important distinction. Once we have separate ICE | |
| 2419 // and DTLS state, this check needs to use the DTLS state. | |
| 2420 EXPECT_TRUE_SIMULATED_WAIT( | |
| 2421 (receiving_client()->ice_connection_state() == | |
| 2422 webrtc::PeerConnectionInterface::kIceConnectionConnected || | |
| 2423 receiving_client()->ice_connection_state() == | |
| 2424 webrtc::PeerConnectionInterface::kIceConnectionCompleted) && | |
| 2425 (initializing_client()->ice_connection_state() == | |
| 2426 webrtc::PeerConnectionInterface::kIceConnectionConnected || | |
| 2427 initializing_client()->ice_connection_state() == | |
| 2428 webrtc::PeerConnectionInterface::kIceConnectionCompleted), | |
| 2429 total_connection_time_ms, fake_clock); | |
| 2430 // Need to free the clients here since they're using things we created on | |
| 2431 // the stack. | |
| 2432 delete set_initializing_client(nullptr); | |
| 2433 delete set_receiving_client(nullptr); | |
| 2434 } | |
| 2435 | |
| 2235 class IceServerParsingTest : public testing::Test { | 2436 class IceServerParsingTest : public testing::Test { |
| 2236 public: | 2437 public: |
| 2237 // Convenience for parsing a single URL. | 2438 // Convenience for parsing a single URL. |
| 2238 bool ParseUrl(const std::string& url) { | 2439 bool ParseUrl(const std::string& url) { |
| 2239 return ParseUrl(url, std::string(), std::string()); | 2440 return ParseUrl(url, std::string(), std::string()); |
| 2240 } | 2441 } |
| 2241 | 2442 |
| 2242 bool ParseUrl(const std::string& url, | 2443 bool ParseUrl(const std::string& url, |
| 2243 const std::string& username, | 2444 const std::string& username, |
| 2244 const std::string& password) { | 2445 const std::string& password) { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2417 server.urls.push_back("turn:hostname2"); | 2618 server.urls.push_back("turn:hostname2"); |
| 2418 servers.push_back(server); | 2619 servers.push_back(server); |
| 2419 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_)); | 2620 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_)); |
| 2420 EXPECT_EQ(2U, turn_servers_.size()); | 2621 EXPECT_EQ(2U, turn_servers_.size()); |
| 2421 EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority); | 2622 EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority); |
| 2422 } | 2623 } |
| 2423 | 2624 |
| 2424 #endif // if !defined(THREAD_SANITIZER) | 2625 #endif // if !defined(THREAD_SANITIZER) |
| 2425 | 2626 |
| 2426 } // namespace | 2627 } // namespace |
| OLD | NEW |