13db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org/* 23db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * libjingle 33db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * Copyright 2013, Google Inc. 43db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 53db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * Redistribution and use in source and binary forms, with or without 63db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * modification, are permitted provided that the following conditions are met: 73db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 83db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 93db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * this list of conditions and the following disclaimer. 103db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * this list of conditions and the following disclaimer in the documentation 123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * and/or other materials provided with the distribution. 133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 3. The name of the author may not be used to endorse or promote products 143db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * derived from this software without specific prior written permission. 153db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * 163db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 213db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 223db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 233db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 243db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 253db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 263db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org */ 273db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/fakeportallocatorfactory.h" 29f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org#include "talk/app/webrtc/test/fakedtlsidentityservice.h" 303db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/test/fakeperiodicvideocapturer.h" 313db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h" 323db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/test/peerconnectiontestwrapper.h" 333db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/videosourceinterface.h" 342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 353db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kStreamLabelBase[] = "stream_label"; 373db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kVideoTrackLabelBase[] = "video_track"; 383db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kAudioTrackLabelBase[] = "audio_track"; 396019a0f470cf75a9a5787f7900162498609f509bbuildbot@webrtc.orgstatic const int kMaxWait = 10000; 403db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const int kTestAudioFrameCount = 3; 413db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const int kTestVideoFrameCount = 3; 423db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 433db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::FakeConstraints; 443db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::FakeVideoTrackRenderer; 453db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::IceCandidateInterface; 463db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::MediaConstraintsInterface; 473db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::MediaStreamInterface; 483db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::MockSetSessionDescriptionObserver; 493db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::PeerConnectionInterface; 503db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::SessionDescriptionInterface; 513db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::VideoTrackInterface; 523db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 533db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::Connect(PeerConnectionTestWrapper* caller, 543db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org PeerConnectionTestWrapper* callee) { 553db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org caller->SignalOnIceCandidateReady.connect( 563db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org callee, &PeerConnectionTestWrapper::AddIceCandidate); 573db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org callee->SignalOnIceCandidateReady.connect( 583db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org caller, &PeerConnectionTestWrapper::AddIceCandidate); 593db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 603db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org caller->SignalOnSdpReady.connect( 613db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org callee, &PeerConnectionTestWrapper::ReceiveOfferSdp); 623db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org callee->SignalOnSdpReady.connect( 633db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org caller, &PeerConnectionTestWrapper::ReceiveAnswerSdp); 643db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgPeerConnectionTestWrapper::PeerConnectionTestWrapper(const std::string& name) 673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org : name_(name) {} 683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgPeerConnectionTestWrapper::~PeerConnectionTestWrapper() {} 703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgbool PeerConnectionTestWrapper::CreatePc( 723db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const MediaConstraintsInterface* constraints) { 733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org allocator_factory_ = webrtc::FakePortAllocatorFactory::Create(); 743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (!allocator_factory_) { 753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return false; 763db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org fake_audio_capture_module_ = FakeAudioCaptureModule::Create( 7940539b82d5a2c9bcf23d078e997ce0368160f5a3jiayl@webrtc.org rtc::Thread::Current()); 803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (fake_audio_capture_module_ == NULL) { 813db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return false; 823db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( 852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current(), rtc::Thread::Current(), 863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org fake_audio_capture_module_, NULL, NULL); 873db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (!peer_connection_factory_) { 883db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return false; 893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // CreatePeerConnection with IceServers. 923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org webrtc::PeerConnectionInterface::IceServers ice_servers; 933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org webrtc::PeerConnectionInterface::IceServer ice_server; 943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org ice_server.uri = "stun:stun.l.google.com:19302"; 953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org ice_servers.push_back(ice_server); 96f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org FakeIdentityService* dtls_service = 972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLStreamAdapter::HaveDtlsSrtp() ? 98f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org new FakeIdentityService() : NULL; 993db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_ = peer_connection_factory_->CreatePeerConnection( 100f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org ice_servers, constraints, allocator_factory_.get(), dtls_service, this); 1013db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1023db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return peer_connection_.get() != NULL; 1033db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1043db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1052a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgrtc::scoped_refptr<webrtc::DataChannelInterface> 1062b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgPeerConnectionTestWrapper::CreateDataChannel( 1072b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org const std::string& label, 1082b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org const webrtc::DataChannelInit& init) { 1092b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org return peer_connection_->CreateDataChannel(label, &init); 1102b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org} 1112b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org 1123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::OnAddStream(MediaStreamInterface* stream) { 1133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1143db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": OnAddStream"; 1153db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // TODO(ronghuawu): support multiple streams. 1163db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (stream->GetVideoTracks().size() > 0) { 1173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org renderer_.reset(new FakeVideoTrackRenderer(stream->GetVideoTracks()[0])); 1183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 1193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1213db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::OnIceCandidate( 1223db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const IceCandidateInterface* candidate) { 1233db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org std::string sdp; 1243db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE(candidate->ToString(&sdp)); 1253db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Give the user a chance to modify sdp for testing. 1263db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SignalOnIceCandidateCreated(&sdp); 1273db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SignalOnIceCandidateReady(candidate->sdp_mid(), candidate->sdp_mline_index(), 1283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org sdp); 1293db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1303db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1312b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgvoid PeerConnectionTestWrapper::OnDataChannel( 1322b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org webrtc::DataChannelInterface* data_channel) { 1332b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org SignalOnDataChannel(data_channel); 1342b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org} 1352b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org 1363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::OnSuccess(SessionDescriptionInterface* desc) { 13797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org // This callback should take the ownership of |desc|. 1382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> owned_desc(desc); 1393db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org std::string sdp; 1403db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE(desc->ToString(&sdp)); 1413db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1423db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1433db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": " << desc->type() << " sdp created: " << sdp; 1443db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1453db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Give the user a chance to modify sdp for testing. 1463db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SignalOnSdpCreated(&sdp); 1473db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1483db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SetLocalDescription(desc->type(), sdp); 1493db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1503db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SignalOnSdpReady(sdp); 1513db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1523db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1533db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::CreateOffer( 1543db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const MediaConstraintsInterface* constraints) { 1553db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1563db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": CreateOffer."; 1573db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_->CreateOffer(this, constraints); 1583db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1593db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1603db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::CreateAnswer( 1613db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const MediaConstraintsInterface* constraints) { 1623db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1633db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": CreateAnswer."; 1643db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_->CreateAnswer(this, constraints); 1653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::ReceiveOfferSdp(const std::string& sdp) { 1683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SetRemoteDescription(SessionDescriptionInterface::kOffer, sdp); 1693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org CreateAnswer(NULL); 1703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1723db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::ReceiveAnswerSdp(const std::string& sdp) { 1733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org SetRemoteDescription(SessionDescriptionInterface::kAnswer, sdp); 1743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1763db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::SetLocalDescription(const std::string& type, 1773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const std::string& sdp) { 1783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1793db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": SetLocalDescription " << type << " " << sdp; 1803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MockSetSessionDescriptionObserver> 1822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org observer(new rtc::RefCountedObject< 1833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org MockSetSessionDescriptionObserver>()); 1843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_->SetLocalDescription( 1853db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org observer, webrtc::CreateSessionDescription(type, sdp, NULL)); 1863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1873db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1883db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::SetRemoteDescription(const std::string& type, 1893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const std::string& sdp) { 1903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 1913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": SetRemoteDescription " << type << " " << sdp; 1923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MockSetSessionDescriptionObserver> 1942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org observer(new rtc::RefCountedObject< 1953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org MockSetSessionDescriptionObserver>()); 1963db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_->SetRemoteDescription( 1973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org observer, webrtc::CreateSessionDescription(type, sdp, NULL)); 1983db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 1993db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2003db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::AddIceCandidate(const std::string& sdp_mid, 2013db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org int sdp_mline_index, 2023db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const std::string& candidate) { 2032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<webrtc::IceCandidateInterface> owned_candidate( 20497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, candidate, NULL)); 20597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_TRUE(peer_connection_->AddIceCandidate(owned_candidate.get())); 2063db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2073db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2083db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::WaitForCallEstablished() { 2093db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org WaitForConnection(); 2103db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org WaitForAudio(); 2113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org WaitForVideo(); 2123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2143db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::WaitForConnection() { 2153db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE_WAIT(CheckForConnection(), kMaxWait); 2163db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 2173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": Connected."; 2183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgbool PeerConnectionTestWrapper::CheckForConnection() { 2213db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return (peer_connection_->ice_connection_state() == 222f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org PeerConnectionInterface::kIceConnectionConnected) || 223f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org (peer_connection_->ice_connection_state() == 224f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org PeerConnectionInterface::kIceConnectionCompleted); 2253db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2263db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2273db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::WaitForAudio() { 2283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE_WAIT(CheckForAudio(), kMaxWait); 2293db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 2303db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": Got enough audio frames."; 2313db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2323db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2333db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgbool PeerConnectionTestWrapper::CheckForAudio() { 2343db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return (fake_audio_capture_module_->frames_received() >= 2353db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org kTestAudioFrameCount); 2363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2373db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2383db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::WaitForVideo() { 2393db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE_WAIT(CheckForVideo(), kMaxWait); 2403db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_ 2413db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org << ": Got enough video frames."; 2423db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2433db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2443db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgbool PeerConnectionTestWrapper::CheckForVideo() { 2453db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (!renderer_) { 2463db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return false; 2473db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 2483db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return (renderer_->num_rendered_frames() >= kTestVideoFrameCount); 2493db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2503db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2513db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid PeerConnectionTestWrapper::GetAndAddUserMedia( 2523db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org bool audio, const webrtc::FakeConstraints& audio_constraints, 2533db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org bool video, const webrtc::FakeConstraints& video_constraints) { 2542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStreamInterface> stream = 2553db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org GetUserMedia(audio, audio_constraints, video, video_constraints); 2563db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org EXPECT_TRUE(peer_connection_->AddStream(stream, NULL)); 2573db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 2583db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgrtc::scoped_refptr<webrtc::MediaStreamInterface> 2603db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org PeerConnectionTestWrapper::GetUserMedia( 2613db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org bool audio, const webrtc::FakeConstraints& audio_constraints, 2623db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org bool video, const webrtc::FakeConstraints& video_constraints) { 2633db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org std::string label = kStreamLabelBase + 2642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ToString<int>( 2653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org static_cast<int>(peer_connection_->local_streams()->count())); 2662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStreamInterface> stream = 2673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_->CreateLocalMediaStream(label); 2683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (audio) { 2703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org FakeConstraints constraints = audio_constraints; 2713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Disable highpass filter so that we can get all the test audio frames. 2723db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org constraints.AddMandatory( 2733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org MediaConstraintsInterface::kHighpassFilter, false); 2742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::AudioSourceInterface> source = 2753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_->CreateAudioSource(&constraints); 2762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 2773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_->CreateAudioTrack(kAudioTrackLabelBase, 2783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org source)); 2793db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org stream->AddTrack(audio_track); 2803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 2813db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2823db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org if (video) { 2833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. 2843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org FakeConstraints constraints = video_constraints; 2853db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org constraints.SetMandatoryMaxFrameRate(10); 2863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoSourceInterface> source = 2883db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_->CreateVideoSource( 2893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org new webrtc::FakePeriodicVideoCapturer(), &constraints); 2903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org std::string videotrack_label = label + kVideoTrackLabelBase; 2912a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track( 2923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org peer_connection_factory_->CreateVideoTrack(videotrack_label, source)); 2933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 2943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org stream->AddTrack(video_track); 2953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org } 2963db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org return stream; 2973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org} 298