1 /* 2 * libjingle 3 * Copyright 2012, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include <stdio.h> 29 30 #include <algorithm> 31 #include <list> 32 #include <map> 33 #include <vector> 34 35 #include "talk/app/webrtc/dtmfsender.h" 36 #include "talk/app/webrtc/fakeportallocatorfactory.h" 37 #include "talk/app/webrtc/localaudiosource.h" 38 #include "talk/app/webrtc/mediastreaminterface.h" 39 #include "talk/app/webrtc/peerconnectionfactory.h" 40 #include "talk/app/webrtc/peerconnectioninterface.h" 41 #include "talk/app/webrtc/test/fakeaudiocapturemodule.h" 42 #include "talk/app/webrtc/test/fakeconstraints.h" 43 #include "talk/app/webrtc/test/fakedtlsidentityservice.h" 44 #include "talk/app/webrtc/test/fakeperiodicvideocapturer.h" 45 #include "talk/app/webrtc/test/fakevideotrackrenderer.h" 46 #include "talk/app/webrtc/test/mockpeerconnectionobservers.h" 47 #include "talk/app/webrtc/videosourceinterface.h" 48 #include "talk/media/webrtc/fakewebrtcvideoengine.h" 49 #include "talk/p2p/base/constants.h" 50 #include "talk/p2p/base/sessiondescription.h" 51 #include "talk/session/media/mediasession.h" 52 #include "webrtc/base/gunit.h" 53 #include "webrtc/base/scoped_ptr.h" 54 #include "webrtc/base/ssladapter.h" 55 #include "webrtc/base/sslstreamadapter.h" 56 #include "webrtc/base/thread.h" 57 58 #define MAYBE_SKIP_TEST(feature) \ 59 if (!(feature())) { \ 60 LOG(LS_INFO) << "Feature disabled... skipping"; \ 61 return; \ 62 } 63 64 using cricket::ContentInfo; 65 using cricket::FakeWebRtcVideoDecoder; 66 using cricket::FakeWebRtcVideoDecoderFactory; 67 using cricket::FakeWebRtcVideoEncoder; 68 using cricket::FakeWebRtcVideoEncoderFactory; 69 using cricket::MediaContentDescription; 70 using webrtc::DataBuffer; 71 using webrtc::DataChannelInterface; 72 using webrtc::DtmfSender; 73 using webrtc::DtmfSenderInterface; 74 using webrtc::DtmfSenderObserverInterface; 75 using webrtc::FakeConstraints; 76 using webrtc::MediaConstraintsInterface; 77 using webrtc::MediaStreamTrackInterface; 78 using webrtc::MockCreateSessionDescriptionObserver; 79 using webrtc::MockDataChannelObserver; 80 using webrtc::MockSetSessionDescriptionObserver; 81 using webrtc::MockStatsObserver; 82 using webrtc::PeerConnectionInterface; 83 using webrtc::SessionDescriptionInterface; 84 using webrtc::StreamCollectionInterface; 85 86 static const int kMaxWaitMs = 2000; 87 // Disable for TSan v2, see 88 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. 89 // This declaration is also #ifdef'd as it causes uninitialized-variable 90 // warnings. 91 #if !defined(THREAD_SANITIZER) 92 static const int kMaxWaitForStatsMs = 3000; 93 static const int kMaxWaitForRembMs = 5000; 94 #endif 95 static const int kMaxWaitForFramesMs = 10000; 96 static const int kEndAudioFrameCount = 3; 97 static const int kEndVideoFrameCount = 3; 98 99 static const char kStreamLabelBase[] = "stream_label"; 100 static const char kVideoTrackLabelBase[] = "video_track"; 101 static const char kAudioTrackLabelBase[] = "audio_track"; 102 static const char kDataChannelLabel[] = "data_channel"; 103 104 static void RemoveLinesFromSdp(const std::string& line_start, 105 std::string* sdp) { 106 const char kSdpLineEnd[] = "\r\n"; 107 size_t ssrc_pos = 0; 108 while ((ssrc_pos = sdp->find(line_start, ssrc_pos)) != 109 std::string::npos) { 110 size_t end_ssrc = sdp->find(kSdpLineEnd, ssrc_pos); 111 sdp->erase(ssrc_pos, end_ssrc - ssrc_pos + strlen(kSdpLineEnd)); 112 } 113 } 114 115 class SignalingMessageReceiver { 116 public: 117 protected: 118 SignalingMessageReceiver() {} 119 virtual ~SignalingMessageReceiver() {} 120 }; 121 122 class JsepMessageReceiver : public SignalingMessageReceiver { 123 public: 124 virtual void ReceiveSdpMessage(const std::string& type, 125 std::string& msg) = 0; 126 virtual void ReceiveIceMessage(const std::string& sdp_mid, 127 int sdp_mline_index, 128 const std::string& msg) = 0; 129 130 protected: 131 JsepMessageReceiver() {} 132 virtual ~JsepMessageReceiver() {} 133 }; 134 135 template <typename MessageReceiver> 136 class PeerConnectionTestClientBase 137 : public webrtc::PeerConnectionObserver, 138 public MessageReceiver { 139 public: 140 ~PeerConnectionTestClientBase() { 141 while (!fake_video_renderers_.empty()) { 142 RenderMap::iterator it = fake_video_renderers_.begin(); 143 delete it->second; 144 fake_video_renderers_.erase(it); 145 } 146 } 147 148 virtual void Negotiate() = 0; 149 150 virtual void Negotiate(bool audio, bool video) = 0; 151 152 virtual void SetVideoConstraints( 153 const webrtc::FakeConstraints& video_constraint) { 154 video_constraints_ = video_constraint; 155 } 156 157 void AddMediaStream(bool audio, bool video) { 158 std::string stream_label = kStreamLabelBase + 159 rtc::ToString<int>( 160 static_cast<int>(peer_connection_->local_streams()->count())); 161 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream = 162 peer_connection_factory_->CreateLocalMediaStream(stream_label); 163 164 if (audio && can_receive_audio()) { 165 FakeConstraints constraints; 166 // Disable highpass filter so that we can get all the test audio frames. 167 constraints.AddMandatory( 168 MediaConstraintsInterface::kHighpassFilter, false); 169 rtc::scoped_refptr<webrtc::AudioSourceInterface> source = 170 peer_connection_factory_->CreateAudioSource(&constraints); 171 // TODO(perkj): Test audio source when it is implemented. Currently audio 172 // always use the default input. 173 std::string label = stream_label + kAudioTrackLabelBase; 174 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 175 peer_connection_factory_->CreateAudioTrack(label, source)); 176 stream->AddTrack(audio_track); 177 } 178 if (video && can_receive_video()) { 179 stream->AddTrack(CreateLocalVideoTrack(stream_label)); 180 } 181 182 EXPECT_TRUE(peer_connection_->AddStream(stream, NULL)); 183 } 184 185 size_t NumberOfLocalMediaStreams() { 186 return peer_connection_->local_streams()->count(); 187 } 188 189 bool SessionActive() { 190 return peer_connection_->signaling_state() == 191 webrtc::PeerConnectionInterface::kStable; 192 } 193 194 void set_signaling_message_receiver( 195 MessageReceiver* signaling_message_receiver) { 196 signaling_message_receiver_ = signaling_message_receiver; 197 } 198 199 void EnableVideoDecoderFactory() { 200 video_decoder_factory_enabled_ = true; 201 fake_video_decoder_factory_->AddSupportedVideoCodecType( 202 webrtc::kVideoCodecVP8); 203 } 204 205 bool AudioFramesReceivedCheck(int number_of_frames) const { 206 return number_of_frames <= fake_audio_capture_module_->frames_received(); 207 } 208 209 bool VideoFramesReceivedCheck(int number_of_frames) { 210 if (video_decoder_factory_enabled_) { 211 const std::vector<FakeWebRtcVideoDecoder*>& decoders 212 = fake_video_decoder_factory_->decoders(); 213 if (decoders.empty()) { 214 return number_of_frames <= 0; 215 } 216 217 for (std::vector<FakeWebRtcVideoDecoder*>::const_iterator 218 it = decoders.begin(); it != decoders.end(); ++it) { 219 if (number_of_frames > (*it)->GetNumFramesReceived()) { 220 return false; 221 } 222 } 223 return true; 224 } else { 225 if (fake_video_renderers_.empty()) { 226 return number_of_frames <= 0; 227 } 228 229 for (RenderMap::const_iterator it = fake_video_renderers_.begin(); 230 it != fake_video_renderers_.end(); ++it) { 231 if (number_of_frames > it->second->num_rendered_frames()) { 232 return false; 233 } 234 } 235 return true; 236 } 237 } 238 // Verify the CreateDtmfSender interface 239 void VerifyDtmf() { 240 rtc::scoped_ptr<DummyDtmfObserver> observer(new DummyDtmfObserver()); 241 rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender; 242 243 // We can't create a DTMF sender with an invalid audio track or a non local 244 // track. 245 EXPECT_TRUE(peer_connection_->CreateDtmfSender(NULL) == NULL); 246 rtc::scoped_refptr<webrtc::AudioTrackInterface> non_localtrack( 247 peer_connection_factory_->CreateAudioTrack("dummy_track", 248 NULL)); 249 EXPECT_TRUE(peer_connection_->CreateDtmfSender(non_localtrack) == NULL); 250 251 // We should be able to create a DTMF sender from a local track. 252 webrtc::AudioTrackInterface* localtrack = 253 peer_connection_->local_streams()->at(0)->GetAudioTracks()[0]; 254 dtmf_sender = peer_connection_->CreateDtmfSender(localtrack); 255 EXPECT_TRUE(dtmf_sender.get() != NULL); 256 dtmf_sender->RegisterObserver(observer.get()); 257 258 // Test the DtmfSender object just created. 259 EXPECT_TRUE(dtmf_sender->CanInsertDtmf()); 260 EXPECT_TRUE(dtmf_sender->InsertDtmf("1a", 100, 50)); 261 262 // We don't need to verify that the DTMF tones are actually sent out because 263 // that is already covered by the tests of the lower level components. 264 265 EXPECT_TRUE_WAIT(observer->completed(), kMaxWaitMs); 266 std::vector<std::string> tones; 267 tones.push_back("1"); 268 tones.push_back("a"); 269 tones.push_back(""); 270 observer->Verify(tones); 271 272 dtmf_sender->UnregisterObserver(); 273 } 274 275 // Verifies that the SessionDescription have rejected the appropriate media 276 // content. 277 void VerifyRejectedMediaInSessionDescription() { 278 ASSERT_TRUE(peer_connection_->remote_description() != NULL); 279 ASSERT_TRUE(peer_connection_->local_description() != NULL); 280 const cricket::SessionDescription* remote_desc = 281 peer_connection_->remote_description()->description(); 282 const cricket::SessionDescription* local_desc = 283 peer_connection_->local_description()->description(); 284 285 const ContentInfo* remote_audio_content = GetFirstAudioContent(remote_desc); 286 if (remote_audio_content) { 287 const ContentInfo* audio_content = 288 GetFirstAudioContent(local_desc); 289 EXPECT_EQ(can_receive_audio(), !audio_content->rejected); 290 } 291 292 const ContentInfo* remote_video_content = GetFirstVideoContent(remote_desc); 293 if (remote_video_content) { 294 const ContentInfo* video_content = 295 GetFirstVideoContent(local_desc); 296 EXPECT_EQ(can_receive_video(), !video_content->rejected); 297 } 298 } 299 300 void SetExpectIceRestart(bool expect_restart) { 301 expect_ice_restart_ = expect_restart; 302 } 303 304 bool ExpectIceRestart() const { return expect_ice_restart_; } 305 306 void VerifyLocalIceUfragAndPassword() { 307 ASSERT_TRUE(peer_connection_->local_description() != NULL); 308 const cricket::SessionDescription* desc = 309 peer_connection_->local_description()->description(); 310 const cricket::ContentInfos& contents = desc->contents(); 311 312 for (size_t index = 0; index < contents.size(); ++index) { 313 if (contents[index].rejected) 314 continue; 315 const cricket::TransportDescription* transport_desc = 316 desc->GetTransportDescriptionByName(contents[index].name); 317 318 std::map<int, IceUfragPwdPair>::const_iterator ufragpair_it = 319 ice_ufrag_pwd_.find(static_cast<int>(index)); 320 if (ufragpair_it == ice_ufrag_pwd_.end()) { 321 ASSERT_FALSE(ExpectIceRestart()); 322 ice_ufrag_pwd_[static_cast<int>(index)] = 323 IceUfragPwdPair(transport_desc->ice_ufrag, transport_desc->ice_pwd); 324 } else if (ExpectIceRestart()) { 325 const IceUfragPwdPair& ufrag_pwd = ufragpair_it->second; 326 EXPECT_NE(ufrag_pwd.first, transport_desc->ice_ufrag); 327 EXPECT_NE(ufrag_pwd.second, transport_desc->ice_pwd); 328 } else { 329 const IceUfragPwdPair& ufrag_pwd = ufragpair_it->second; 330 EXPECT_EQ(ufrag_pwd.first, transport_desc->ice_ufrag); 331 EXPECT_EQ(ufrag_pwd.second, transport_desc->ice_pwd); 332 } 333 } 334 } 335 336 int GetAudioOutputLevelStats(webrtc::MediaStreamTrackInterface* track) { 337 rtc::scoped_refptr<MockStatsObserver> 338 observer(new rtc::RefCountedObject<MockStatsObserver>()); 339 EXPECT_TRUE(peer_connection_->GetStats( 340 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)); 341 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 342 return observer->AudioOutputLevel(); 343 } 344 345 int GetAudioInputLevelStats() { 346 rtc::scoped_refptr<MockStatsObserver> 347 observer(new rtc::RefCountedObject<MockStatsObserver>()); 348 EXPECT_TRUE(peer_connection_->GetStats( 349 observer, NULL, PeerConnectionInterface::kStatsOutputLevelStandard)); 350 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 351 return observer->AudioInputLevel(); 352 } 353 354 int GetBytesReceivedStats(webrtc::MediaStreamTrackInterface* track) { 355 rtc::scoped_refptr<MockStatsObserver> 356 observer(new rtc::RefCountedObject<MockStatsObserver>()); 357 EXPECT_TRUE(peer_connection_->GetStats( 358 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)); 359 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 360 return observer->BytesReceived(); 361 } 362 363 int GetBytesSentStats(webrtc::MediaStreamTrackInterface* track) { 364 rtc::scoped_refptr<MockStatsObserver> 365 observer(new rtc::RefCountedObject<MockStatsObserver>()); 366 EXPECT_TRUE(peer_connection_->GetStats( 367 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)); 368 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 369 return observer->BytesSent(); 370 } 371 372 int GetAvailableReceivedBandwidthStats() { 373 rtc::scoped_refptr<MockStatsObserver> 374 observer(new rtc::RefCountedObject<MockStatsObserver>()); 375 EXPECT_TRUE(peer_connection_->GetStats( 376 observer, NULL, PeerConnectionInterface::kStatsOutputLevelStandard)); 377 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 378 int bw = observer->AvailableReceiveBandwidth(); 379 return bw; 380 } 381 382 int rendered_width() { 383 EXPECT_FALSE(fake_video_renderers_.empty()); 384 return fake_video_renderers_.empty() ? 1 : 385 fake_video_renderers_.begin()->second->width(); 386 } 387 388 int rendered_height() { 389 EXPECT_FALSE(fake_video_renderers_.empty()); 390 return fake_video_renderers_.empty() ? 1 : 391 fake_video_renderers_.begin()->second->height(); 392 } 393 394 size_t number_of_remote_streams() { 395 if (!pc()) 396 return 0; 397 return pc()->remote_streams()->count(); 398 } 399 400 StreamCollectionInterface* remote_streams() { 401 if (!pc()) { 402 ADD_FAILURE(); 403 return NULL; 404 } 405 return pc()->remote_streams(); 406 } 407 408 StreamCollectionInterface* local_streams() { 409 if (!pc()) { 410 ADD_FAILURE(); 411 return NULL; 412 } 413 return pc()->local_streams(); 414 } 415 416 webrtc::PeerConnectionInterface::SignalingState signaling_state() { 417 return pc()->signaling_state(); 418 } 419 420 webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state() { 421 return pc()->ice_connection_state(); 422 } 423 424 webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state() { 425 return pc()->ice_gathering_state(); 426 } 427 428 // PeerConnectionObserver callbacks. 429 virtual void OnError() {} 430 virtual void OnMessage(const std::string&) {} 431 virtual void OnSignalingMessage(const std::string& /*msg*/) {} 432 virtual void OnSignalingChange( 433 webrtc::PeerConnectionInterface::SignalingState new_state) { 434 EXPECT_EQ(peer_connection_->signaling_state(), new_state); 435 } 436 virtual void OnAddStream(webrtc::MediaStreamInterface* media_stream) { 437 for (size_t i = 0; i < media_stream->GetVideoTracks().size(); ++i) { 438 const std::string id = media_stream->GetVideoTracks()[i]->id(); 439 ASSERT_TRUE(fake_video_renderers_.find(id) == 440 fake_video_renderers_.end()); 441 fake_video_renderers_[id] = new webrtc::FakeVideoTrackRenderer( 442 media_stream->GetVideoTracks()[i]); 443 } 444 } 445 virtual void OnRemoveStream(webrtc::MediaStreamInterface* media_stream) {} 446 virtual void OnRenegotiationNeeded() {} 447 virtual void OnIceConnectionChange( 448 webrtc::PeerConnectionInterface::IceConnectionState new_state) { 449 EXPECT_EQ(peer_connection_->ice_connection_state(), new_state); 450 } 451 virtual void OnIceGatheringChange( 452 webrtc::PeerConnectionInterface::IceGatheringState new_state) { 453 EXPECT_EQ(peer_connection_->ice_gathering_state(), new_state); 454 } 455 virtual void OnIceCandidate( 456 const webrtc::IceCandidateInterface* /*candidate*/) {} 457 458 webrtc::PeerConnectionInterface* pc() { 459 return peer_connection_.get(); 460 } 461 void StopVideoCapturers() { 462 for (std::vector<cricket::VideoCapturer*>::iterator it = 463 video_capturers_.begin(); it != video_capturers_.end(); ++it) { 464 (*it)->Stop(); 465 } 466 } 467 468 protected: 469 explicit PeerConnectionTestClientBase(const std::string& id) 470 : id_(id), 471 expect_ice_restart_(false), 472 fake_video_decoder_factory_(NULL), 473 fake_video_encoder_factory_(NULL), 474 video_decoder_factory_enabled_(false), 475 signaling_message_receiver_(NULL) { 476 } 477 bool Init(const MediaConstraintsInterface* constraints) { 478 EXPECT_TRUE(!peer_connection_); 479 EXPECT_TRUE(!peer_connection_factory_); 480 allocator_factory_ = webrtc::FakePortAllocatorFactory::Create(); 481 if (!allocator_factory_) { 482 return false; 483 } 484 fake_audio_capture_module_ = FakeAudioCaptureModule::Create( 485 rtc::Thread::Current()); 486 487 if (fake_audio_capture_module_ == NULL) { 488 return false; 489 } 490 fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory(); 491 fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory(); 492 peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( 493 rtc::Thread::Current(), rtc::Thread::Current(), 494 fake_audio_capture_module_, fake_video_encoder_factory_, 495 fake_video_decoder_factory_); 496 if (!peer_connection_factory_) { 497 return false; 498 } 499 peer_connection_ = CreatePeerConnection(allocator_factory_.get(), 500 constraints); 501 return peer_connection_.get() != NULL; 502 } 503 virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> 504 CreatePeerConnection(webrtc::PortAllocatorFactoryInterface* factory, 505 const MediaConstraintsInterface* constraints) = 0; 506 MessageReceiver* signaling_message_receiver() { 507 return signaling_message_receiver_; 508 } 509 webrtc::PeerConnectionFactoryInterface* peer_connection_factory() { 510 return peer_connection_factory_.get(); 511 } 512 513 virtual bool can_receive_audio() = 0; 514 virtual bool can_receive_video() = 0; 515 const std::string& id() const { return id_; } 516 517 private: 518 class DummyDtmfObserver : public DtmfSenderObserverInterface { 519 public: 520 DummyDtmfObserver() : completed_(false) {} 521 522 // Implements DtmfSenderObserverInterface. 523 void OnToneChange(const std::string& tone) { 524 tones_.push_back(tone); 525 if (tone.empty()) { 526 completed_ = true; 527 } 528 } 529 530 void Verify(const std::vector<std::string>& tones) const { 531 ASSERT_TRUE(tones_.size() == tones.size()); 532 EXPECT_TRUE(std::equal(tones.begin(), tones.end(), tones_.begin())); 533 } 534 535 bool completed() const { return completed_; } 536 537 private: 538 bool completed_; 539 std::vector<std::string> tones_; 540 }; 541 542 rtc::scoped_refptr<webrtc::VideoTrackInterface> 543 CreateLocalVideoTrack(const std::string stream_label) { 544 // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. 545 FakeConstraints source_constraints = video_constraints_; 546 source_constraints.SetMandatoryMaxFrameRate(10); 547 548 cricket::FakeVideoCapturer* fake_capturer = 549 new webrtc::FakePeriodicVideoCapturer(); 550 video_capturers_.push_back(fake_capturer); 551 rtc::scoped_refptr<webrtc::VideoSourceInterface> source = 552 peer_connection_factory_->CreateVideoSource( 553 fake_capturer, &source_constraints); 554 std::string label = stream_label + kVideoTrackLabelBase; 555 return peer_connection_factory_->CreateVideoTrack(label, source); 556 } 557 558 std::string id_; 559 560 rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> 561 allocator_factory_; 562 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; 563 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> 564 peer_connection_factory_; 565 566 typedef std::pair<std::string, std::string> IceUfragPwdPair; 567 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_; 568 bool expect_ice_restart_; 569 570 // Needed to keep track of number of frames send. 571 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; 572 // Needed to keep track of number of frames received. 573 typedef std::map<std::string, webrtc::FakeVideoTrackRenderer*> RenderMap; 574 RenderMap fake_video_renderers_; 575 // Needed to keep track of number of frames received when external decoder 576 // used. 577 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_; 578 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_; 579 bool video_decoder_factory_enabled_; 580 webrtc::FakeConstraints video_constraints_; 581 582 // For remote peer communication. 583 MessageReceiver* signaling_message_receiver_; 584 585 // Store references to the video capturers we've created, so that we can stop 586 // them, if required. 587 std::vector<cricket::VideoCapturer*> video_capturers_; 588 }; 589 590 class JsepTestClient 591 : public PeerConnectionTestClientBase<JsepMessageReceiver> { 592 public: 593 static JsepTestClient* CreateClient( 594 const std::string& id, 595 const MediaConstraintsInterface* constraints) { 596 JsepTestClient* client(new JsepTestClient(id)); 597 if (!client->Init(constraints)) { 598 delete client; 599 return NULL; 600 } 601 return client; 602 } 603 ~JsepTestClient() {} 604 605 virtual void Negotiate() { 606 Negotiate(true, true); 607 } 608 virtual void Negotiate(bool audio, bool video) { 609 rtc::scoped_ptr<SessionDescriptionInterface> offer; 610 ASSERT_TRUE(DoCreateOffer(offer.use())); 611 612 if (offer->description()->GetContentByName("audio")) { 613 offer->description()->GetContentByName("audio")->rejected = !audio; 614 } 615 if (offer->description()->GetContentByName("video")) { 616 offer->description()->GetContentByName("video")->rejected = !video; 617 } 618 619 std::string sdp; 620 EXPECT_TRUE(offer->ToString(&sdp)); 621 EXPECT_TRUE(DoSetLocalDescription(offer.release())); 622 signaling_message_receiver()->ReceiveSdpMessage( 623 webrtc::SessionDescriptionInterface::kOffer, sdp); 624 } 625 // JsepMessageReceiver callback. 626 virtual void ReceiveSdpMessage(const std::string& type, 627 std::string& msg) { 628 FilterIncomingSdpMessage(&msg); 629 if (type == webrtc::SessionDescriptionInterface::kOffer) { 630 HandleIncomingOffer(msg); 631 } else { 632 HandleIncomingAnswer(msg); 633 } 634 } 635 // JsepMessageReceiver callback. 636 virtual void ReceiveIceMessage(const std::string& sdp_mid, 637 int sdp_mline_index, 638 const std::string& msg) { 639 LOG(INFO) << id() << "ReceiveIceMessage"; 640 rtc::scoped_ptr<webrtc::IceCandidateInterface> candidate( 641 webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, msg, NULL)); 642 EXPECT_TRUE(pc()->AddIceCandidate(candidate.get())); 643 } 644 // Implements PeerConnectionObserver functions needed by Jsep. 645 virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 646 LOG(INFO) << id() << "OnIceCandidate"; 647 648 std::string ice_sdp; 649 EXPECT_TRUE(candidate->ToString(&ice_sdp)); 650 if (signaling_message_receiver() == NULL) { 651 // Remote party may be deleted. 652 return; 653 } 654 signaling_message_receiver()->ReceiveIceMessage(candidate->sdp_mid(), 655 candidate->sdp_mline_index(), ice_sdp); 656 } 657 658 void IceRestart() { 659 session_description_constraints_.SetMandatoryIceRestart(true); 660 SetExpectIceRestart(true); 661 } 662 663 void SetReceiveAudioVideo(bool audio, bool video) { 664 SetReceiveAudio(audio); 665 SetReceiveVideo(video); 666 ASSERT_EQ(audio, can_receive_audio()); 667 ASSERT_EQ(video, can_receive_video()); 668 } 669 670 void SetReceiveAudio(bool audio) { 671 if (audio && can_receive_audio()) 672 return; 673 session_description_constraints_.SetMandatoryReceiveAudio(audio); 674 } 675 676 void SetReceiveVideo(bool video) { 677 if (video && can_receive_video()) 678 return; 679 session_description_constraints_.SetMandatoryReceiveVideo(video); 680 } 681 682 void RemoveMsidFromReceivedSdp(bool remove) { 683 remove_msid_ = remove; 684 } 685 686 void RemoveSdesCryptoFromReceivedSdp(bool remove) { 687 remove_sdes_ = remove; 688 } 689 690 void RemoveBundleFromReceivedSdp(bool remove) { 691 remove_bundle_ = remove; 692 } 693 694 virtual bool can_receive_audio() { 695 bool value; 696 if (webrtc::FindConstraint(&session_description_constraints_, 697 MediaConstraintsInterface::kOfferToReceiveAudio, &value, NULL)) { 698 return value; 699 } 700 return true; 701 } 702 703 virtual bool can_receive_video() { 704 bool value; 705 if (webrtc::FindConstraint(&session_description_constraints_, 706 MediaConstraintsInterface::kOfferToReceiveVideo, &value, NULL)) { 707 return value; 708 } 709 return true; 710 } 711 712 virtual void OnIceComplete() { 713 LOG(INFO) << id() << "OnIceComplete"; 714 } 715 716 virtual void OnDataChannel(DataChannelInterface* data_channel) { 717 LOG(INFO) << id() << "OnDataChannel"; 718 data_channel_ = data_channel; 719 data_observer_.reset(new MockDataChannelObserver(data_channel)); 720 } 721 722 void CreateDataChannel() { 723 data_channel_ = pc()->CreateDataChannel(kDataChannelLabel, 724 NULL); 725 ASSERT_TRUE(data_channel_.get() != NULL); 726 data_observer_.reset(new MockDataChannelObserver(data_channel_)); 727 } 728 729 DataChannelInterface* data_channel() { return data_channel_; } 730 const MockDataChannelObserver* data_observer() const { 731 return data_observer_.get(); 732 } 733 734 protected: 735 explicit JsepTestClient(const std::string& id) 736 : PeerConnectionTestClientBase<JsepMessageReceiver>(id), 737 remove_msid_(false), 738 remove_bundle_(false), 739 remove_sdes_(false) { 740 } 741 742 virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> 743 CreatePeerConnection(webrtc::PortAllocatorFactoryInterface* factory, 744 const MediaConstraintsInterface* constraints) { 745 // CreatePeerConnection with IceServers. 746 webrtc::PeerConnectionInterface::IceServers ice_servers; 747 webrtc::PeerConnectionInterface::IceServer ice_server; 748 ice_server.uri = "stun:stun.l.google.com:19302"; 749 ice_servers.push_back(ice_server); 750 751 FakeIdentityService* dtls_service = 752 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? 753 new FakeIdentityService() : NULL; 754 return peer_connection_factory()->CreatePeerConnection( 755 ice_servers, constraints, factory, dtls_service, this); 756 } 757 758 void HandleIncomingOffer(const std::string& msg) { 759 LOG(INFO) << id() << "HandleIncomingOffer "; 760 if (NumberOfLocalMediaStreams() == 0) { 761 // If we are not sending any streams ourselves it is time to add some. 762 AddMediaStream(true, true); 763 } 764 rtc::scoped_ptr<SessionDescriptionInterface> desc( 765 webrtc::CreateSessionDescription("offer", msg, NULL)); 766 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); 767 rtc::scoped_ptr<SessionDescriptionInterface> answer; 768 EXPECT_TRUE(DoCreateAnswer(answer.use())); 769 std::string sdp; 770 EXPECT_TRUE(answer->ToString(&sdp)); 771 EXPECT_TRUE(DoSetLocalDescription(answer.release())); 772 if (signaling_message_receiver()) { 773 signaling_message_receiver()->ReceiveSdpMessage( 774 webrtc::SessionDescriptionInterface::kAnswer, sdp); 775 } 776 } 777 778 void HandleIncomingAnswer(const std::string& msg) { 779 LOG(INFO) << id() << "HandleIncomingAnswer"; 780 rtc::scoped_ptr<SessionDescriptionInterface> desc( 781 webrtc::CreateSessionDescription("answer", msg, NULL)); 782 EXPECT_TRUE(DoSetRemoteDescription(desc.release())); 783 } 784 785 bool DoCreateOfferAnswer(SessionDescriptionInterface** desc, 786 bool offer) { 787 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> 788 observer(new rtc::RefCountedObject< 789 MockCreateSessionDescriptionObserver>()); 790 if (offer) { 791 pc()->CreateOffer(observer, &session_description_constraints_); 792 } else { 793 pc()->CreateAnswer(observer, &session_description_constraints_); 794 } 795 EXPECT_EQ_WAIT(true, observer->called(), kMaxWaitMs); 796 *desc = observer->release_desc(); 797 if (observer->result() && ExpectIceRestart()) { 798 EXPECT_EQ(0u, (*desc)->candidates(0)->count()); 799 } 800 return observer->result(); 801 } 802 803 bool DoCreateOffer(SessionDescriptionInterface** desc) { 804 return DoCreateOfferAnswer(desc, true); 805 } 806 807 bool DoCreateAnswer(SessionDescriptionInterface** desc) { 808 return DoCreateOfferAnswer(desc, false); 809 } 810 811 bool DoSetLocalDescription(SessionDescriptionInterface* desc) { 812 rtc::scoped_refptr<MockSetSessionDescriptionObserver> 813 observer(new rtc::RefCountedObject< 814 MockSetSessionDescriptionObserver>()); 815 LOG(INFO) << id() << "SetLocalDescription "; 816 pc()->SetLocalDescription(observer, desc); 817 // Ignore the observer result. If we wait for the result with 818 // EXPECT_TRUE_WAIT, local ice candidates might be sent to the remote peer 819 // before the offer which is an error. 820 // The reason is that EXPECT_TRUE_WAIT uses 821 // rtc::Thread::Current()->ProcessMessages(1); 822 // ProcessMessages waits at least 1ms but processes all messages before 823 // returning. Since this test is synchronous and send messages to the remote 824 // peer whenever a callback is invoked, this can lead to messages being 825 // sent to the remote peer in the wrong order. 826 // TODO(perkj): Find a way to check the result without risking that the 827 // order of sent messages are changed. Ex- by posting all messages that are 828 // sent to the remote peer. 829 return true; 830 } 831 832 bool DoSetRemoteDescription(SessionDescriptionInterface* desc) { 833 rtc::scoped_refptr<MockSetSessionDescriptionObserver> 834 observer(new rtc::RefCountedObject< 835 MockSetSessionDescriptionObserver>()); 836 LOG(INFO) << id() << "SetRemoteDescription "; 837 pc()->SetRemoteDescription(observer, desc); 838 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs); 839 return observer->result(); 840 } 841 842 // This modifies all received SDP messages before they are processed. 843 void FilterIncomingSdpMessage(std::string* sdp) { 844 if (remove_msid_) { 845 const char kSdpSsrcAttribute[] = "a=ssrc:"; 846 RemoveLinesFromSdp(kSdpSsrcAttribute, sdp); 847 const char kSdpMsidSupportedAttribute[] = "a=msid-semantic:"; 848 RemoveLinesFromSdp(kSdpMsidSupportedAttribute, sdp); 849 } 850 if (remove_bundle_) { 851 const char kSdpBundleAttribute[] = "a=group:BUNDLE"; 852 RemoveLinesFromSdp(kSdpBundleAttribute, sdp); 853 } 854 if (remove_sdes_) { 855 const char kSdpSdesCryptoAttribute[] = "a=crypto"; 856 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp); 857 } 858 } 859 860 private: 861 webrtc::FakeConstraints session_description_constraints_; 862 bool remove_msid_; // True if MSID should be removed in received SDP. 863 bool remove_bundle_; // True if bundle should be removed in received SDP. 864 bool remove_sdes_; // True if a=crypto should be removed in received SDP. 865 866 rtc::scoped_refptr<DataChannelInterface> data_channel_; 867 rtc::scoped_ptr<MockDataChannelObserver> data_observer_; 868 }; 869 870 template <typename SignalingClass> 871 class P2PTestConductor : public testing::Test { 872 public: 873 bool SessionActive() { 874 return initiating_client_->SessionActive() && 875 receiving_client_->SessionActive(); 876 } 877 // Return true if the number of frames provided have been received or it is 878 // known that that will never occur (e.g. no frames will be sent or 879 // captured). 880 bool FramesNotPending(int audio_frames_to_receive, 881 int video_frames_to_receive) { 882 return VideoFramesReceivedCheck(video_frames_to_receive) && 883 AudioFramesReceivedCheck(audio_frames_to_receive); 884 } 885 bool AudioFramesReceivedCheck(int frames_received) { 886 return initiating_client_->AudioFramesReceivedCheck(frames_received) && 887 receiving_client_->AudioFramesReceivedCheck(frames_received); 888 } 889 bool VideoFramesReceivedCheck(int frames_received) { 890 return initiating_client_->VideoFramesReceivedCheck(frames_received) && 891 receiving_client_->VideoFramesReceivedCheck(frames_received); 892 } 893 void VerifyDtmf() { 894 initiating_client_->VerifyDtmf(); 895 receiving_client_->VerifyDtmf(); 896 } 897 898 void TestUpdateOfferWithRejectedContent() { 899 initiating_client_->Negotiate(true, false); 900 EXPECT_TRUE_WAIT( 901 FramesNotPending(kEndAudioFrameCount * 2, kEndVideoFrameCount), 902 kMaxWaitForFramesMs); 903 // There shouldn't be any more video frame after the new offer is 904 // negotiated. 905 EXPECT_FALSE(VideoFramesReceivedCheck(kEndVideoFrameCount + 1)); 906 } 907 908 void VerifyRenderedSize(int width, int height) { 909 EXPECT_EQ(width, receiving_client()->rendered_width()); 910 EXPECT_EQ(height, receiving_client()->rendered_height()); 911 EXPECT_EQ(width, initializing_client()->rendered_width()); 912 EXPECT_EQ(height, initializing_client()->rendered_height()); 913 } 914 915 void VerifySessionDescriptions() { 916 initiating_client_->VerifyRejectedMediaInSessionDescription(); 917 receiving_client_->VerifyRejectedMediaInSessionDescription(); 918 initiating_client_->VerifyLocalIceUfragAndPassword(); 919 receiving_client_->VerifyLocalIceUfragAndPassword(); 920 } 921 922 P2PTestConductor() { 923 rtc::InitializeSSL(NULL); 924 } 925 ~P2PTestConductor() { 926 if (initiating_client_) { 927 initiating_client_->set_signaling_message_receiver(NULL); 928 } 929 if (receiving_client_) { 930 receiving_client_->set_signaling_message_receiver(NULL); 931 } 932 rtc::CleanupSSL(); 933 } 934 935 bool CreateTestClients() { 936 return CreateTestClients(NULL, NULL); 937 } 938 939 bool CreateTestClients(MediaConstraintsInterface* init_constraints, 940 MediaConstraintsInterface* recv_constraints) { 941 initiating_client_.reset(SignalingClass::CreateClient("Caller: ", 942 init_constraints)); 943 receiving_client_.reset(SignalingClass::CreateClient("Callee: ", 944 recv_constraints)); 945 if (!initiating_client_ || !receiving_client_) { 946 return false; 947 } 948 initiating_client_->set_signaling_message_receiver(receiving_client_.get()); 949 receiving_client_->set_signaling_message_receiver(initiating_client_.get()); 950 return true; 951 } 952 953 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints, 954 const webrtc::FakeConstraints& recv_constraints) { 955 initiating_client_->SetVideoConstraints(init_constraints); 956 receiving_client_->SetVideoConstraints(recv_constraints); 957 } 958 959 void EnableVideoDecoderFactory() { 960 initiating_client_->EnableVideoDecoderFactory(); 961 receiving_client_->EnableVideoDecoderFactory(); 962 } 963 964 // This test sets up a call between two parties. Both parties send static 965 // frames to each other. Once the test is finished the number of sent frames 966 // is compared to the number of received frames. 967 void LocalP2PTest() { 968 if (initiating_client_->NumberOfLocalMediaStreams() == 0) { 969 initiating_client_->AddMediaStream(true, true); 970 } 971 initiating_client_->Negotiate(); 972 const int kMaxWaitForActivationMs = 5000; 973 // Assert true is used here since next tests are guaranteed to fail and 974 // would eat up 5 seconds. 975 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs); 976 VerifySessionDescriptions(); 977 978 979 int audio_frame_count = kEndAudioFrameCount; 980 // TODO(ronghuawu): Add test to cover the case of sendonly and recvonly. 981 if (!initiating_client_->can_receive_audio() || 982 !receiving_client_->can_receive_audio()) { 983 audio_frame_count = -1; 984 } 985 int video_frame_count = kEndVideoFrameCount; 986 if (!initiating_client_->can_receive_video() || 987 !receiving_client_->can_receive_video()) { 988 video_frame_count = -1; 989 } 990 991 if (audio_frame_count != -1 || video_frame_count != -1) { 992 // Audio or video is expected to flow, so both clients should reach the 993 // Connected state, and the offerer (ICE controller) should proceed to 994 // Completed. 995 // Note: These tests have been observed to fail under heavy load at 996 // shorter timeouts, so they may be flaky. 997 EXPECT_EQ_WAIT( 998 webrtc::PeerConnectionInterface::kIceConnectionCompleted, 999 initiating_client_->ice_connection_state(), 1000 kMaxWaitForFramesMs); 1001 EXPECT_EQ_WAIT( 1002 webrtc::PeerConnectionInterface::kIceConnectionConnected, 1003 receiving_client_->ice_connection_state(), 1004 kMaxWaitForFramesMs); 1005 } 1006 1007 if (initiating_client_->can_receive_audio() || 1008 initiating_client_->can_receive_video()) { 1009 // The initiating client can receive media, so it must produce candidates 1010 // that will serve as destinations for that media. 1011 // TODO(bemasc): Understand why the state is not already Complete here, as 1012 // seems to be the case for the receiving client. This may indicate a bug 1013 // in the ICE gathering system. 1014 EXPECT_NE(webrtc::PeerConnectionInterface::kIceGatheringNew, 1015 initiating_client_->ice_gathering_state()); 1016 } 1017 if (receiving_client_->can_receive_audio() || 1018 receiving_client_->can_receive_video()) { 1019 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceGatheringComplete, 1020 receiving_client_->ice_gathering_state(), 1021 kMaxWaitForFramesMs); 1022 } 1023 1024 EXPECT_TRUE_WAIT(FramesNotPending(audio_frame_count, video_frame_count), 1025 kMaxWaitForFramesMs); 1026 } 1027 1028 void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) { 1029 // Messages may get lost on the unreliable DataChannel, so we send multiple 1030 // times to avoid test flakiness. 1031 static const size_t kSendAttempts = 5; 1032 1033 for (size_t i = 0; i < kSendAttempts; ++i) { 1034 dc->Send(DataBuffer(data)); 1035 } 1036 } 1037 1038 // Wait until 'size' bytes of audio has been seen by the receiver, on the 1039 // first audio stream. 1040 void WaitForAudioData(int size) { 1041 const int kMaxWaitForAudioDataMs = 10000; 1042 1043 StreamCollectionInterface* local_streams = 1044 initializing_client()->local_streams(); 1045 ASSERT_GT(local_streams->count(), 0u); 1046 ASSERT_GT(local_streams->at(0)->GetAudioTracks().size(), 0u); 1047 MediaStreamTrackInterface* local_audio_track = 1048 local_streams->at(0)->GetAudioTracks()[0]; 1049 1050 // Wait until *any* audio has been received. 1051 EXPECT_TRUE_WAIT( 1052 receiving_client()->GetBytesReceivedStats(local_audio_track) > 0, 1053 kMaxWaitForAudioDataMs); 1054 1055 // Wait until 'size' number of bytes have been received. 1056 size += receiving_client()->GetBytesReceivedStats(local_audio_track); 1057 EXPECT_TRUE_WAIT( 1058 receiving_client()->GetBytesReceivedStats(local_audio_track) > size, 1059 kMaxWaitForAudioDataMs); 1060 } 1061 1062 SignalingClass* initializing_client() { return initiating_client_.get(); } 1063 SignalingClass* receiving_client() { return receiving_client_.get(); } 1064 1065 private: 1066 rtc::scoped_ptr<SignalingClass> initiating_client_; 1067 rtc::scoped_ptr<SignalingClass> receiving_client_; 1068 }; 1069 typedef P2PTestConductor<JsepTestClient> JsepPeerConnectionP2PTestClient; 1070 1071 // Disable for TSan v2, see 1072 // https://code.google.com/p/webrtc/issues/detail?id=1205 for details. 1073 #if !defined(THREAD_SANITIZER) 1074 1075 // This test sets up a Jsep call between two parties and test Dtmf. 1076 // TODO(holmer): Disabled due to sometimes crashing on buildbots. 1077 // See issue webrtc/2378. 1078 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTestDtmf) { 1079 ASSERT_TRUE(CreateTestClients()); 1080 LocalP2PTest(); 1081 VerifyDtmf(); 1082 } 1083 1084 // This test sets up a Jsep call between two parties and test that we can get a 1085 // video aspect ratio of 16:9. 1086 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTest16To9) { 1087 ASSERT_TRUE(CreateTestClients()); 1088 FakeConstraints constraint; 1089 double requested_ratio = 640.0/360; 1090 constraint.SetMandatoryMinAspectRatio(requested_ratio); 1091 SetVideoConstraints(constraint, constraint); 1092 LocalP2PTest(); 1093 1094 ASSERT_LE(0, initializing_client()->rendered_height()); 1095 double initiating_video_ratio = 1096 static_cast<double>(initializing_client()->rendered_width()) / 1097 initializing_client()->rendered_height(); 1098 EXPECT_LE(requested_ratio, initiating_video_ratio); 1099 1100 ASSERT_LE(0, receiving_client()->rendered_height()); 1101 double receiving_video_ratio = 1102 static_cast<double>(receiving_client()->rendered_width()) / 1103 receiving_client()->rendered_height(); 1104 EXPECT_LE(requested_ratio, receiving_video_ratio); 1105 } 1106 1107 // This test sets up a Jsep call between two parties and test that the 1108 // received video has a resolution of 1280*720. 1109 // TODO(mallinath): Enable when 1110 // http://code.google.com/p/webrtc/issues/detail?id=981 is fixed. 1111 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTest1280By720) { 1112 ASSERT_TRUE(CreateTestClients()); 1113 FakeConstraints constraint; 1114 constraint.SetMandatoryMinWidth(1280); 1115 constraint.SetMandatoryMinHeight(720); 1116 SetVideoConstraints(constraint, constraint); 1117 LocalP2PTest(); 1118 VerifyRenderedSize(1280, 720); 1119 } 1120 1121 // This test sets up a call between two endpoints that are configured to use 1122 // DTLS key agreement. As a result, DTLS is negotiated and used for transport. 1123 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestDtls) { 1124 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1125 FakeConstraints setup_constraints; 1126 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, 1127 true); 1128 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1129 LocalP2PTest(); 1130 VerifyRenderedSize(640, 480); 1131 } 1132 1133 // This test sets up a audio call initially and then upgrades to audio/video, 1134 // using DTLS. 1135 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestDtlsRenegotiate) { 1136 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1137 FakeConstraints setup_constraints; 1138 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, 1139 true); 1140 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1141 receiving_client()->SetReceiveAudioVideo(true, false); 1142 LocalP2PTest(); 1143 receiving_client()->SetReceiveAudioVideo(true, true); 1144 receiving_client()->Negotiate(); 1145 } 1146 1147 // This test sets up a call between two endpoints that are configured to use 1148 // DTLS key agreement. The offerer don't support SDES. As a result, DTLS is 1149 // negotiated and used for transport. 1150 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestOfferDtlsButNotSdes) { 1151 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1152 FakeConstraints setup_constraints; 1153 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, 1154 true); 1155 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1156 receiving_client()->RemoveSdesCryptoFromReceivedSdp(true); 1157 LocalP2PTest(); 1158 VerifyRenderedSize(640, 480); 1159 } 1160 1161 // This test sets up a Jsep call between two parties, and the callee only 1162 // accept to receive video. 1163 // BUG=https://code.google.com/p/webrtc/issues/detail?id=2288 1164 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTestAnswerVideo) { 1165 ASSERT_TRUE(CreateTestClients()); 1166 receiving_client()->SetReceiveAudioVideo(false, true); 1167 LocalP2PTest(); 1168 } 1169 1170 // This test sets up a Jsep call between two parties, and the callee only 1171 // accept to receive audio. 1172 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTestAnswerAudio) { 1173 ASSERT_TRUE(CreateTestClients()); 1174 receiving_client()->SetReceiveAudioVideo(true, false); 1175 LocalP2PTest(); 1176 } 1177 1178 // This test sets up a Jsep call between two parties, and the callee reject both 1179 // audio and video. 1180 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestAnswerNone) { 1181 ASSERT_TRUE(CreateTestClients()); 1182 receiving_client()->SetReceiveAudioVideo(false, false); 1183 LocalP2PTest(); 1184 } 1185 1186 // This test sets up an audio and video call between two parties. After the call 1187 // runs for a while (10 frames), the caller sends an update offer with video 1188 // being rejected. Once the re-negotiation is done, the video flow should stop 1189 // and the audio flow should continue. 1190 // Disabled due to b/14955157. 1191 TEST_F(JsepPeerConnectionP2PTestClient, 1192 DISABLED_UpdateOfferWithRejectedContent) { 1193 ASSERT_TRUE(CreateTestClients()); 1194 LocalP2PTest(); 1195 TestUpdateOfferWithRejectedContent(); 1196 } 1197 1198 // This test sets up a Jsep call between two parties. The MSID is removed from 1199 // the SDP strings from the caller. 1200 // Disabled due to b/14955157. 1201 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTestWithoutMsid) { 1202 ASSERT_TRUE(CreateTestClients()); 1203 receiving_client()->RemoveMsidFromReceivedSdp(true); 1204 // TODO(perkj): Currently there is a bug that cause audio to stop playing if 1205 // audio and video is muxed when MSID is disabled. Remove 1206 // SetRemoveBundleFromSdp once 1207 // https://code.google.com/p/webrtc/issues/detail?id=1193 is fixed. 1208 receiving_client()->RemoveBundleFromReceivedSdp(true); 1209 LocalP2PTest(); 1210 } 1211 1212 // This test sets up a Jsep call between two parties and the initiating peer 1213 // sends two steams. 1214 // TODO(perkj): Disabled due to 1215 // https://code.google.com/p/webrtc/issues/detail?id=1454 1216 TEST_F(JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTestTwoStreams) { 1217 ASSERT_TRUE(CreateTestClients()); 1218 // Set optional video constraint to max 320pixels to decrease CPU usage. 1219 FakeConstraints constraint; 1220 constraint.SetOptionalMaxWidth(320); 1221 SetVideoConstraints(constraint, constraint); 1222 initializing_client()->AddMediaStream(true, true); 1223 initializing_client()->AddMediaStream(false, true); 1224 ASSERT_EQ(2u, initializing_client()->NumberOfLocalMediaStreams()); 1225 LocalP2PTest(); 1226 EXPECT_EQ(2u, receiving_client()->number_of_remote_streams()); 1227 } 1228 1229 // Test that we can receive the audio output level from a remote audio track. 1230 TEST_F(JsepPeerConnectionP2PTestClient, GetAudioOutputLevelStats) { 1231 ASSERT_TRUE(CreateTestClients()); 1232 LocalP2PTest(); 1233 1234 StreamCollectionInterface* remote_streams = 1235 initializing_client()->remote_streams(); 1236 ASSERT_GT(remote_streams->count(), 0u); 1237 ASSERT_GT(remote_streams->at(0)->GetAudioTracks().size(), 0u); 1238 MediaStreamTrackInterface* remote_audio_track = 1239 remote_streams->at(0)->GetAudioTracks()[0]; 1240 1241 // Get the audio output level stats. Note that the level is not available 1242 // until a RTCP packet has been received. 1243 EXPECT_TRUE_WAIT( 1244 initializing_client()->GetAudioOutputLevelStats(remote_audio_track) > 0, 1245 kMaxWaitForStatsMs); 1246 } 1247 1248 // Test that an audio input level is reported. 1249 TEST_F(JsepPeerConnectionP2PTestClient, GetAudioInputLevelStats) { 1250 ASSERT_TRUE(CreateTestClients()); 1251 LocalP2PTest(); 1252 1253 // Get the audio input level stats. The level should be available very 1254 // soon after the test starts. 1255 EXPECT_TRUE_WAIT(initializing_client()->GetAudioInputLevelStats() > 0, 1256 kMaxWaitForStatsMs); 1257 } 1258 1259 // Test that we can get incoming byte counts from both audio and video tracks. 1260 TEST_F(JsepPeerConnectionP2PTestClient, GetBytesReceivedStats) { 1261 ASSERT_TRUE(CreateTestClients()); 1262 LocalP2PTest(); 1263 1264 StreamCollectionInterface* remote_streams = 1265 initializing_client()->remote_streams(); 1266 ASSERT_GT(remote_streams->count(), 0u); 1267 ASSERT_GT(remote_streams->at(0)->GetAudioTracks().size(), 0u); 1268 MediaStreamTrackInterface* remote_audio_track = 1269 remote_streams->at(0)->GetAudioTracks()[0]; 1270 EXPECT_TRUE_WAIT( 1271 initializing_client()->GetBytesReceivedStats(remote_audio_track) > 0, 1272 kMaxWaitForStatsMs); 1273 1274 MediaStreamTrackInterface* remote_video_track = 1275 remote_streams->at(0)->GetVideoTracks()[0]; 1276 EXPECT_TRUE_WAIT( 1277 initializing_client()->GetBytesReceivedStats(remote_video_track) > 0, 1278 kMaxWaitForStatsMs); 1279 } 1280 1281 // Test that we can get outgoing byte counts from both audio and video tracks. 1282 TEST_F(JsepPeerConnectionP2PTestClient, GetBytesSentStats) { 1283 ASSERT_TRUE(CreateTestClients()); 1284 LocalP2PTest(); 1285 1286 StreamCollectionInterface* local_streams = 1287 initializing_client()->local_streams(); 1288 ASSERT_GT(local_streams->count(), 0u); 1289 ASSERT_GT(local_streams->at(0)->GetAudioTracks().size(), 0u); 1290 MediaStreamTrackInterface* local_audio_track = 1291 local_streams->at(0)->GetAudioTracks()[0]; 1292 EXPECT_TRUE_WAIT( 1293 initializing_client()->GetBytesSentStats(local_audio_track) > 0, 1294 kMaxWaitForStatsMs); 1295 1296 MediaStreamTrackInterface* local_video_track = 1297 local_streams->at(0)->GetVideoTracks()[0]; 1298 EXPECT_TRUE_WAIT( 1299 initializing_client()->GetBytesSentStats(local_video_track) > 0, 1300 kMaxWaitForStatsMs); 1301 } 1302 1303 // This test sets up a call between two parties with audio, video and data. 1304 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestDataChannel) { 1305 FakeConstraints setup_constraints; 1306 setup_constraints.SetAllowRtpDataChannels(); 1307 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1308 initializing_client()->CreateDataChannel(); 1309 LocalP2PTest(); 1310 ASSERT_TRUE(initializing_client()->data_channel() != NULL); 1311 ASSERT_TRUE(receiving_client()->data_channel() != NULL); 1312 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(), 1313 kMaxWaitMs); 1314 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), 1315 kMaxWaitMs); 1316 1317 std::string data = "hello world"; 1318 1319 SendRtpData(initializing_client()->data_channel(), data); 1320 EXPECT_EQ_WAIT(data, receiving_client()->data_observer()->last_message(), 1321 kMaxWaitMs); 1322 1323 SendRtpData(receiving_client()->data_channel(), data); 1324 EXPECT_EQ_WAIT(data, initializing_client()->data_observer()->last_message(), 1325 kMaxWaitMs); 1326 1327 receiving_client()->data_channel()->Close(); 1328 // Send new offer and answer. 1329 receiving_client()->Negotiate(); 1330 EXPECT_FALSE(initializing_client()->data_observer()->IsOpen()); 1331 EXPECT_FALSE(receiving_client()->data_observer()->IsOpen()); 1332 } 1333 1334 // This test sets up a call between two parties and creates a data channel. 1335 // The test tests that received data is buffered unless an observer has been 1336 // registered. 1337 // Rtp data channels can receive data before the underlying 1338 // transport has detected that a channel is writable and thus data can be 1339 // received before the data channel state changes to open. That is hard to test 1340 // but the same buffering is used in that case. 1341 TEST_F(JsepPeerConnectionP2PTestClient, RegisterDataChannelObserver) { 1342 FakeConstraints setup_constraints; 1343 setup_constraints.SetAllowRtpDataChannels(); 1344 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1345 initializing_client()->CreateDataChannel(); 1346 initializing_client()->Negotiate(); 1347 1348 ASSERT_TRUE(initializing_client()->data_channel() != NULL); 1349 ASSERT_TRUE(receiving_client()->data_channel() != NULL); 1350 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(), 1351 kMaxWaitMs); 1352 EXPECT_EQ_WAIT(DataChannelInterface::kOpen, 1353 receiving_client()->data_channel()->state(), kMaxWaitMs); 1354 1355 // Unregister the existing observer. 1356 receiving_client()->data_channel()->UnregisterObserver(); 1357 1358 std::string data = "hello world"; 1359 SendRtpData(initializing_client()->data_channel(), data); 1360 1361 // Wait a while to allow the sent data to arrive before an observer is 1362 // registered.. 1363 rtc::Thread::Current()->ProcessMessages(100); 1364 1365 MockDataChannelObserver new_observer(receiving_client()->data_channel()); 1366 EXPECT_EQ_WAIT(data, new_observer.last_message(), kMaxWaitMs); 1367 } 1368 1369 // This test sets up a call between two parties with audio, video and but only 1370 // the initiating client support data. 1371 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestReceiverDoesntSupportData) { 1372 FakeConstraints setup_constraints_1; 1373 setup_constraints_1.SetAllowRtpDataChannels(); 1374 // Must disable DTLS to make negotiation succeed. 1375 setup_constraints_1.SetMandatory( 1376 MediaConstraintsInterface::kEnableDtlsSrtp, false); 1377 FakeConstraints setup_constraints_2; 1378 setup_constraints_2.SetMandatory( 1379 MediaConstraintsInterface::kEnableDtlsSrtp, false); 1380 ASSERT_TRUE(CreateTestClients(&setup_constraints_1, &setup_constraints_2)); 1381 initializing_client()->CreateDataChannel(); 1382 LocalP2PTest(); 1383 EXPECT_TRUE(initializing_client()->data_channel() != NULL); 1384 EXPECT_FALSE(receiving_client()->data_channel()); 1385 EXPECT_FALSE(initializing_client()->data_observer()->IsOpen()); 1386 } 1387 1388 // This test sets up a call between two parties with audio, video. When audio 1389 // and video is setup and flowing and data channel is negotiated. 1390 TEST_F(JsepPeerConnectionP2PTestClient, AddDataChannelAfterRenegotiation) { 1391 FakeConstraints setup_constraints; 1392 setup_constraints.SetAllowRtpDataChannels(); 1393 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1394 LocalP2PTest(); 1395 initializing_client()->CreateDataChannel(); 1396 // Send new offer and answer. 1397 initializing_client()->Negotiate(); 1398 ASSERT_TRUE(initializing_client()->data_channel() != NULL); 1399 ASSERT_TRUE(receiving_client()->data_channel() != NULL); 1400 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(), 1401 kMaxWaitMs); 1402 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), 1403 kMaxWaitMs); 1404 } 1405 1406 // This test sets up a Jsep call with SCTP DataChannel and verifies the 1407 // negotiation is completed without error. 1408 #ifdef HAVE_SCTP 1409 TEST_F(JsepPeerConnectionP2PTestClient, CreateOfferWithSctpDataChannel) { 1410 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1411 FakeConstraints constraints; 1412 constraints.SetMandatory( 1413 MediaConstraintsInterface::kEnableDtlsSrtp, true); 1414 ASSERT_TRUE(CreateTestClients(&constraints, &constraints)); 1415 initializing_client()->CreateDataChannel(); 1416 initializing_client()->Negotiate(false, false); 1417 } 1418 #endif 1419 1420 // This test sets up a call between two parties with audio, and video. 1421 // During the call, the initializing side restart ice and the test verifies that 1422 // new ice candidates are generated and audio and video still can flow. 1423 TEST_F(JsepPeerConnectionP2PTestClient, IceRestart) { 1424 ASSERT_TRUE(CreateTestClients()); 1425 1426 // Negotiate and wait for ice completion and make sure audio and video plays. 1427 LocalP2PTest(); 1428 1429 // Create a SDP string of the first audio candidate for both clients. 1430 const webrtc::IceCandidateCollection* audio_candidates_initiator = 1431 initializing_client()->pc()->local_description()->candidates(0); 1432 const webrtc::IceCandidateCollection* audio_candidates_receiver = 1433 receiving_client()->pc()->local_description()->candidates(0); 1434 ASSERT_GT(audio_candidates_initiator->count(), 0u); 1435 ASSERT_GT(audio_candidates_receiver->count(), 0u); 1436 std::string initiator_candidate; 1437 EXPECT_TRUE( 1438 audio_candidates_initiator->at(0)->ToString(&initiator_candidate)); 1439 std::string receiver_candidate; 1440 EXPECT_TRUE(audio_candidates_receiver->at(0)->ToString(&receiver_candidate)); 1441 1442 // Restart ice on the initializing client. 1443 receiving_client()->SetExpectIceRestart(true); 1444 initializing_client()->IceRestart(); 1445 1446 // Negotiate and wait for ice completion again and make sure audio and video 1447 // plays. 1448 LocalP2PTest(); 1449 1450 // Create a SDP string of the first audio candidate for both clients again. 1451 const webrtc::IceCandidateCollection* audio_candidates_initiator_restart = 1452 initializing_client()->pc()->local_description()->candidates(0); 1453 const webrtc::IceCandidateCollection* audio_candidates_reciever_restart = 1454 receiving_client()->pc()->local_description()->candidates(0); 1455 ASSERT_GT(audio_candidates_initiator_restart->count(), 0u); 1456 ASSERT_GT(audio_candidates_reciever_restart->count(), 0u); 1457 std::string initiator_candidate_restart; 1458 EXPECT_TRUE(audio_candidates_initiator_restart->at(0)->ToString( 1459 &initiator_candidate_restart)); 1460 std::string receiver_candidate_restart; 1461 EXPECT_TRUE(audio_candidates_reciever_restart->at(0)->ToString( 1462 &receiver_candidate_restart)); 1463 1464 // Verify that the first candidates in the local session descriptions has 1465 // changed. 1466 EXPECT_NE(initiator_candidate, initiator_candidate_restart); 1467 EXPECT_NE(receiver_candidate, receiver_candidate_restart); 1468 } 1469 1470 1471 // This test sets up a Jsep call between two parties with external 1472 // VideoDecoderFactory. 1473 // TODO(holmer): Disabled due to sometimes crashing on buildbots. 1474 // See issue webrtc/2378. 1475 TEST_F(JsepPeerConnectionP2PTestClient, 1476 DISABLED_LocalP2PTestWithVideoDecoderFactory) { 1477 ASSERT_TRUE(CreateTestClients()); 1478 EnableVideoDecoderFactory(); 1479 LocalP2PTest(); 1480 } 1481 1482 // Test receive bandwidth stats with only audio enabled at receiver. 1483 TEST_F(JsepPeerConnectionP2PTestClient, ReceivedBweStatsAudio) { 1484 ASSERT_TRUE(CreateTestClients()); 1485 receiving_client()->SetReceiveAudioVideo(true, false); 1486 LocalP2PTest(); 1487 1488 // Wait until we have received some audio data. Following REMB shoud be zero. 1489 WaitForAudioData(10000); 1490 EXPECT_EQ_WAIT( 1491 receiving_client()->GetAvailableReceivedBandwidthStats(), 0, 1492 kMaxWaitForRembMs); 1493 } 1494 1495 // Test receive bandwidth stats with combined BWE. 1496 TEST_F(JsepPeerConnectionP2PTestClient, ReceivedBweStatsCombined) { 1497 FakeConstraints setup_constraints; 1498 setup_constraints.AddOptional( 1499 MediaConstraintsInterface::kCombinedAudioVideoBwe, true); 1500 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1501 initializing_client()->AddMediaStream(true, true); 1502 initializing_client()->AddMediaStream(false, true); 1503 initializing_client()->AddMediaStream(false, true); 1504 initializing_client()->AddMediaStream(false, true); 1505 LocalP2PTest(); 1506 1507 // Run until a non-zero bw is reported. 1508 EXPECT_TRUE_WAIT(receiving_client()->GetAvailableReceivedBandwidthStats() > 0, 1509 kMaxWaitForRembMs); 1510 1511 // Halt video capturers, then run until we have gotten some audio. Following 1512 // REMB should be non-zero. 1513 initializing_client()->StopVideoCapturers(); 1514 WaitForAudioData(10000); 1515 EXPECT_TRUE_WAIT( 1516 receiving_client()->GetAvailableReceivedBandwidthStats() > 0, 1517 kMaxWaitForRembMs); 1518 } 1519 1520 // Test receive bandwidth stats with 1 video, 3 audio streams but no combined 1521 // BWE. 1522 TEST_F(JsepPeerConnectionP2PTestClient, ReceivedBweStatsNotCombined) { 1523 FakeConstraints setup_constraints; 1524 setup_constraints.AddOptional( 1525 MediaConstraintsInterface::kCombinedAudioVideoBwe, false); 1526 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); 1527 initializing_client()->AddMediaStream(true, true); 1528 initializing_client()->AddMediaStream(false, true); 1529 initializing_client()->AddMediaStream(false, true); 1530 initializing_client()->AddMediaStream(false, true); 1531 LocalP2PTest(); 1532 1533 // Run until a non-zero bw is reported. 1534 EXPECT_TRUE_WAIT(receiving_client()->GetAvailableReceivedBandwidthStats() > 0, 1535 kMaxWaitForRembMs); 1536 1537 // Halt video capturers, then run until we have gotten some audio. Following 1538 // REMB should be zero. 1539 initializing_client()->StopVideoCapturers(); 1540 WaitForAudioData(10000); 1541 EXPECT_EQ_WAIT( 1542 receiving_client()->GetAvailableReceivedBandwidthStats(), 0, 1543 kMaxWaitForRembMs); 1544 } 1545 1546 #endif // if !defined(THREAD_SANITIZER) 1547