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