10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/fakeportallocatorfactory.h" 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/peerconnectioninterface.h" 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 3513a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org#include "talk/app/webrtc/test/fakedtlsidentityservice.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/testsdpstrings.h" 384ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/app/webrtc/videosource.h" 39cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/fakevideocapturer.h" 40cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/sctp/sctpdataengine.h" 41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/session/media/mediasession.h" 422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/ssladapter.h" 452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h" 462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringutils.h" 472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h" 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel1[] = "local_stream_1"; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel2[] = "local_stream_2"; 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel3[] = "local_stream_3"; 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kDefaultStunPort = 3478; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStunAddressOnly[] = "stun:address"; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStunInvalidPort[] = "stun:address:-1"; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStunAddressPortAndMore1[] = "stun:address:port:more"; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStunAddressPortAndMore2[] = "stun:address:port more"; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kTurnIceServerUri[] = "turn:user@turn.example.org"; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kTurnUsername[] = "user"; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kTurnPassword[] = "password"; 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kTurnHostname[] = "turn.example.org"; 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kTimeout = 5000U; 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!(feature())) { \ 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; \ 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_ptr; 702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_refptr; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::AudioSourceInterface; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::AudioTrackInterface; 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::DataBuffer; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::DataChannelInterface; 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::FakeConstraints; 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::FakePortAllocatorFactory; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::IceCandidateInterface; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MediaStreamInterface; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MediaStreamTrackInterface; 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MockCreateSessionDescriptionObserver; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MockDataChannelObserver; 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MockSetSessionDescriptionObserver; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MockStatsObserver; 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::PeerConnectionInterface; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::PeerConnectionObserver; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::PortAllocatorFactoryInterface; 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SdpParseError; 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::VideoSourceInterface; 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::VideoTrackInterface; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace { 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Gets the first ssrc of given content type from the ContentInfo. 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool GetFirstSsrc(const cricket::ContentInfo* content_info, int* ssrc) { 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!content_info || !ssrc) { 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::MediaContentDescription* media_desc = 1001a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org static_cast<const cricket::MediaContentDescription*>( 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_info->description); 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!media_desc || media_desc->streams().empty()) { 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *ssrc = media_desc->streams().begin()->first_ssrc(); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid SetSsrcToZero(std::string* sdp) { 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpSsrcAtribute[] = "a=ssrc:"; 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpSsrcAtributeZero[] = "a=ssrc:0"; 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t ssrc_pos = 0; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while ((ssrc_pos = sdp->find(kSdpSsrcAtribute, ssrc_pos)) != 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string::npos) { 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t end_ssrc = sdp->find(" ", ssrc_pos); 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp->replace(ssrc_pos, end_ssrc - ssrc_pos, kSdpSsrcAtributeZero); 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_pos = end_ssrc; 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MockPeerConnectionObserver : public PeerConnectionObserver { 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockPeerConnectionObserver() 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : renegotiation_needed_(false), 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_complete_(false) { 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~MockPeerConnectionObserver() { 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetPeerConnectionInterface(PeerConnectionInterface* pc) { 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_ = pc; 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (pc) { 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = pc_->signaling_state(); 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnError() {} 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnSignalingChange( 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::SignalingState new_state) { 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), new_state); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = new_state; 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnStateChange(StateType state_changed) { 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (pc_.get() == NULL) 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org switch (state_changed) { 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case kSignalingState: 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // OnSignalingChange and OnStateChange(kSignalingState) should always 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // be called approximately simultaneously. To ease testing, we require 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // that they always be called in that order. This check verifies 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // that OnSignalingChange has just been called. 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), state_); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case kIceState: 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default: 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddStream(MediaStreamInterface* stream) { 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_added_stream_ = stream; 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveStream(MediaStreamInterface* stream) { 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_removed_stream_ = stream; 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRenegotiationNeeded() { 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org renegotiation_needed_ = true; 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnDataChannel(DataChannelInterface* data_channel) { 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_datachannel_ = data_channel; 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceConnectionChange( 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceConnectionState new_state) { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(pc_->ice_connection_state(), new_state); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceGatheringChange( 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceGatheringState new_state) { 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(pc_->ice_gathering_state(), new_state); 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->ice_gathering_state()); 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(candidate->ToString(&sdp)); 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, sdp.size()); 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_candidate_.reset(webrtc::CreateIceCandidate(candidate->sdp_mid(), 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate->sdp_mline_index(), sdp, NULL)); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(last_candidate_.get() != NULL); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnSignalingChange. 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceComplete() { 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_complete_ = true; 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // OnIceGatheringChange(IceGatheringCompleted) and OnIceComplete() should 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // be called approximately simultaneously. For ease of testing, this 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // check additionally requires that they be called in the above order. 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->ice_gathering_state()); 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the label of the last added stream. 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Empty string if no stream have been added. 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string GetLastAddedStreamLabel() { 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_added_stream_.get()) 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return last_added_stream_->label(); 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ""; 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string GetLastRemovedStreamLabel() { 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_removed_stream_.get()) 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return last_removed_stream_->label(); 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ""; 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::SignalingState state_; 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<IceCandidateInterface> last_candidate_; 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> last_datachannel_; 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool renegotiation_needed_; 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ice_complete_; 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_added_stream_; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_removed_stream_; 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass PeerConnectionInterfaceTest : public testing::Test { 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 2322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::InitializeSSL(NULL); 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_ = webrtc::CreatePeerConnectionFactory( 2342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current(), rtc::Thread::Current(), NULL, NULL, 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL); 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_factory_.get() != NULL); 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org virtual void TearDown() { 2402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CleanupSSL(); 24119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 24219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePeerConnection() { 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection("", "", NULL); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePeerConnection(webrtc::MediaConstraintsInterface* constraints) { 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection("", "", constraints); 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePeerConnection(const std::string& uri, 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& password, 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaConstraintsInterface* constraints) { 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceServer server; 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceServers servers; 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org server.uri = uri; 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org server.password = password; 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org servers.push_back(server); 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_ = FakePortAllocatorFactory::Create(); 26113a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org 262f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org // DTLS does not work in a loopback call, so is disabled for most of the 263f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org // tests in this file. We only create a FakeIdentityService if the test 264f72f5a64fe04356b56ddfb84c6ed488d61ced7c4buildbot@webrtc.org // explicitly sets the constraint. 26513a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org FakeIdentityService* dtls_service = NULL; 26613a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org bool dtls; 26713a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org if (FindConstraint(constraints, 26813a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 26913a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org &dtls, 27013a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org NULL) && dtls) { 27113a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org dtls_service = new FakeIdentityService(); 27213a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org } 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_ = pc_factory_->CreatePeerConnection(servers, constraints, 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_.get(), 27513a42bcb8b909faef285ec36b59740e5696a2295jiayl@webrtc.org dtls_service, 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &observer_); 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_.get() != NULL); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.SetPeerConnectionInterface(pc_.get()); 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePeerConnectionWithDifferentConfigurations() { 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(kStunAddressOnly, "", NULL); 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, port_allocator_factory_->stun_configs().size()); 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("address", 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_->stun_configs()[0].server.hostname()); 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDefaultStunPort, 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_->stun_configs()[0].server.port()); 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(kStunInvalidPort, "", NULL); 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(kStunAddressPortAndMore1, "", NULL); 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(kStunAddressPortAndMore2, "", NULL); 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(kTurnIceServerUri, kTurnPassword, NULL); 304afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, port_allocator_factory_->turn_configs().size()); 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kTurnUsername, 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].username); 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kTurnPassword, 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].password); 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kTurnHostname, 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].server.hostname()); 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ReleasePeerConnection() { 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_ = NULL; 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.SetPeerConnectionInterface(NULL); 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddStream(const std::string& label) { 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream. 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<VideoSourceInterface> video_source( 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateVideoSource(new cricket::FakeVideoCapturer(), NULL)); 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateVideoTrack(label + "v0", video_source)); 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(video_track.get()); 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->AddStream(stream, NULL)); 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.renegotiation_needed_ = false; 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddVoiceStream(const std::string& label) { 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream. 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateAudioTrack(label + "a0", NULL)); 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(audio_track.get()); 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->AddStream(stream, NULL)); 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.renegotiation_needed_ = false; 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddAudioVideoStream(const std::string& stream_label, 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& audio_track_label, 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& video_track_label) { 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream. 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(stream_label)); 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateAudioTrack( 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track_label, static_cast<AudioSourceInterface*>(NULL))); 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(audio_track.get()); 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateVideoTrack(video_track_label, NULL)); 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(video_track.get()); 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->AddStream(stream, NULL)); 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.renegotiation_needed_ = false; 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoCreateOfferAnswer(SessionDescriptionInterface** desc, bool offer) { 3642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MockCreateSessionDescriptionObserver> 3652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org observer(new rtc::RefCountedObject< 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockCreateSessionDescriptionObserver>()); 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (offer) { 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateOffer(observer, NULL); 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateAnswer(observer, NULL); 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *desc = observer->release_desc(); 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return observer->result(); 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoCreateOffer(SessionDescriptionInterface** desc) { 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return DoCreateOfferAnswer(desc, true); 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoCreateAnswer(SessionDescriptionInterface** desc) { 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return DoCreateOfferAnswer(desc, false); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoSetSessionDescription(SessionDescriptionInterface* desc, bool local) { 3862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MockSetSessionDescriptionObserver> 3872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org observer(new rtc::RefCountedObject< 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockSetSessionDescriptionObserver>()); 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (local) { 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->SetLocalDescription(observer, desc); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->SetRemoteDescription(observer, desc); 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return observer->result(); 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoSetLocalDescription(SessionDescriptionInterface* desc) { 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return DoSetSessionDescription(desc, true); 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoSetRemoteDescription(SessionDescriptionInterface* desc) { 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return DoSetSessionDescription(desc, false); 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Calls PeerConnection::GetStats and check the return value. 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // It does not verify the values in the StatReports since a RTCP packet might 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // be required. 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool DoGetStats(MediaStreamTrackInterface* track) { 4102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MockStatsObserver> observer( 4112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org new rtc::RefCountedObject<MockStatsObserver>()); 412583bce7ac772cd80eeab0ca4bd011c70033338cajiayl@webrtc.org if (!pc_->GetStats( 413583bce7ac772cd80eeab0ca4bd011c70033338cajiayl@webrtc.org observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)) 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer->called(), kTimeout); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return observer->called(); 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void InitiateCall() { 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream with audio&video tracks. 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify that RTP Header extensions has been negotiated for audio and video. 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyRemoteRtpHeaderExtensions() { 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::MediaContentDescription* desc = 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContentDescription( 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->remote_description()->description()); 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc = cricket::GetFirstVideoContentDescription( 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->remote_description()->description()); 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateOfferAsRemoteDescription() { 4412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(offer.use())); 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(remote_offer)); 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_); 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateAnswerAsLocalDescription() { 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(answer.use())); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* new_answer = 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_answer)); 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePrAnswerAsLocalDescription() { 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(answer.use())); 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* pr_answer = 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer, 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(pr_answer)); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalPrAnswer, observer_.state_); 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateOfferReceiveAnswer() { 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateOfferAsLocalDescription() { 4932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(DoCreateOffer(offer.use())); 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* new_offer = 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription( 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kOffer, 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_offer)); 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalOffer, observer_.state_); 5117d00e6ad8f378e77e4e9439c818c70b3718c15a9mallinath@webrtc.org // Wait for the ice_complete message, so that SDP will have candidates. 5127d00e6ad8f378e77e4e9439c818c70b3718c15a9mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateAnswerAsRemoteDescription(const std::string& offer) { 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(offer, NULL)); 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreatePrAnswerAndAnswerAsRemoteDescription(const std::string& offer) { 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::JsepSessionDescription* pr_answer = 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new webrtc::JsepSessionDescription( 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kPrAnswer); 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pr_answer->Initialize(offer, NULL)); 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(pr_answer)); 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemotePrAnswer, observer_.state_); 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::JsepSessionDescription* answer = 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new webrtc::JsepSessionDescription( 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(offer, NULL)); 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Help function used for waiting until a the last signaled remote stream has 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the same label as |stream_label|. In a few of the tests in this file we 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // answer with the same session description as we offer and thus we can 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // check if OnAddStream have been called with the same stream as we offer to 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // send. 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void WaitAndVerifyOnAddStream(const std::string& stream_label) { 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(stream_label, observer_.GetLastAddedStreamLabel(), kTimeout); 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Creates an offer and applies it as a local session description. 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Creates an answer with the same SDP an the offer but removes all lines 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // that start with a:ssrc" 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateOfferReceiveAnswerWithoutSsrc() { 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetSsrcToZero(&sdp); 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<FakePortAllocatorFactory> port_allocator_factory_; 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_; 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockPeerConnectionObserver observer_; 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations) { 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations(); 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, AddStreams) { 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddVoiceStream(kStreamLabel2); 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, pc_->local_streams()->count()); 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 575f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Test we can add multiple local streams to one peerconnection. 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(kStreamLabel3)); 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateAudioTrack( 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kStreamLabel3, static_cast<AudioSourceInterface*>(NULL))); 5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(audio_track.get()); 582f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(pc_->AddStream(stream, NULL)); 583f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(3u, pc_->local_streams()->count()); 584f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 585f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Remove the third stream. 586f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(2)); 587f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(2u, pc_->local_streams()->count()); 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 589f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Remove the second stream. 5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(1)); 591f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 593f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Remove the first stream. 594f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 595f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RemoveStream) { 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) { 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyRemoteRtpHeaderExtensions(); 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) { 6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string offer; 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&offer)); 6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePrAnswerAndAnswerAsRemoteDescription(offer); 6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) { 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsRemoteDescription(); 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreatePrAnswerAndAnswer) { 6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsRemoteDescription(); 6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePrAnswerAsLocalDescription(); 6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, Renegotiate) { 6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that after negotiating an audio only call, the respondent can perform a 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// renegotiation that removes the audio stream. 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) { 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddVoiceStream(kStreamLabel1); 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsRemoteDescription(); 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that candidates are generated and that we can parse our own candidates. 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, IceCandidates) { 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription takes ownership of offer. 6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddStream(kStreamLabel1); 6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(&offer)); 6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer)); 6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription takes ownership of answer. 6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(&answer)); 6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(answer)); 6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.last_candidate_.get() != NULL, kTimeout); 6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the CreateOffer and CreatAnswer will fail if the track labels are 6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// not unique. 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) { 6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a regular offer for the CreateAnswer test later. 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(&offer)); 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer != NULL); 6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete offer; 6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer = NULL; 6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream with audio&video tracks having same label. 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "track_label", "track_label"); 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test CreateOffer 7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(DoCreateOffer(&offer)); 7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test CreateAnswer 7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(DoCreateAnswer(&answer)); 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we will get different SSRCs for each tracks in the offer and answer 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// we created. 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) { 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a local stream with audio&video tracks having different labels. 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test CreateOffer 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> offer; 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(offer.use())); 7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int audio_ssrc = 0; 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int video_ssrc = 0; 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(offer->description()), 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &audio_ssrc)); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(offer->description()), 7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &video_ssrc)); 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test CreateAnswer 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer.release())); 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(answer.use())); 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_ssrc = 0; 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_ssrc = 0; 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(answer->description()), 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &audio_ssrc)); 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(answer->description()), 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &video_ssrc)); 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can specify a certain track that we want statistics about. 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForSpecificTrack) { 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetAudioTracks().size()); 7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_audio = 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->remote_streams()->at(0)->GetAudioTracks()[0]; 7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Remove the stream. Since we are sending to our selves the local 7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and the remote stream is the same. 7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Do a re-negotiation. 7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(0u, pc_->remote_streams()->count()); 7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that we still can get statistics for the old track. Even if it is not 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // sent any longer. 7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can get stats on a video track. 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForVideoTrack) { 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetVideoTracks().size()); 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_video = 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->remote_streams()->at(0)->GetVideoTracks()[0]; 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_video)); 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we don't get statistics for an invalid track. 77593f95be0a2967403d4fd4fabded3c442942d5e0etommi@webrtc.org// TODO(tommi): Fix this test. DoGetStats will return true 77693f95be0a2967403d4fd4fabded3c442942d5e0etommi@webrtc.org// for the unknown track (since GetStats is async), but no 77793f95be0a2967403d4fd4fabded3c442942d5e0etommi@webrtc.org// data is returned for the track. 77893f95be0a2967403d4fd4fabded3c442942d5e0etommi@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DISABLED_GetStatsForInvalidTrack) { 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<AudioTrackInterface> unknown_audio_track( 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_factory_->CreateAudioTrack("unknown track", NULL)); 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(DoGetStats(unknown_audio_track)); 7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test setup two RTP data channels in loop back. 7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestDataChannel) { 7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 7952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data1)); 7972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data2)); 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string data_to_send1 = "testing testing"; 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string data_to_send2 = "testing something else"; 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(data_to_send1))); 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(data1->Send(DataBuffer(data_to_send1))); 8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send1, observer1->last_message(), kTimeout); 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data1->Close(); 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(observer2->IsOpen()); 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_to_send2 = "testing something else again"; 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that sendnig binary data over RTP data channels should 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// fail. 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendBinaryOnRtpDataChannel) { 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 8422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data1)); 8442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data2)); 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer buffer("test", 4); 8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(buffer, true))); 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test setup a RTP data channels in loop back and test that a channel is 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// opened even if the remote end answer with a zero SSRC. 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendOnlyDataChannel) { 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 8692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data1)); 8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data1->Close(); 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that if a data channel is added in an answer a receive only channel 8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channel is created. 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestReceiveOnlyDataChannel) { 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string offer_label = "offer_channel"; 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel = 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel(offer_label, NULL); 8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replace the data channel label in the offer and apply it as an answer. 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string receive_label = "answer_channel"; 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 9002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(offer_label.c_str(), offer_label.length(), 9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org receive_label.c_str(), receive_label.length(), 9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify that a new incoming data channel has been created and that 9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // it is open but can't we written to. 9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(observer_.last_datachannel_ != NULL); 9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataChannelInterface* received_channel = observer_.last_datachannel_; 9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, received_channel->state()); 9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(receive_label, received_channel->label()); 9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(received_channel->Send(DataBuffer("something"))); 9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify that the channel we initially offered has been rejected. 9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Do another offer / answer exchange and verify that the data channel is 9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // opened. 9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(DataChannelInterface::kOpen, received_channel->state(), 9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTimeout); 9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that no data channel is returned if a reliable channel is 9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requested. 9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(perkj): Remove this test once reliable channels are implemented. 9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateReliableRtpDataChannelShouldFail) { 9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string label = "test"; 9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::DataChannelInit config; 9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.reliable = true; 9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests that a SCTP data channel is returned using different 9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannelInit configurations. 9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateSctpDataChannel) { 9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::DataChannelInit config; 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("1", &config); 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 9529db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 9539db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org observer_.renegotiation_needed_ = false; 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.ordered = false; 9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("2", &config); 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 9599db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.ordered = true; 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.maxRetransmits = 0; 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("3", &config); 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 9669db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.maxRetransmits = -1; 9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.maxRetransmitTime = 0; 9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("4", &config); 9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 9739db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests that no data channel is returned if both maxRetransmits and 9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// maxRetransmitTime are set for SCTP data channels. 9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSctpDataChannelShouldFailForInvalidConfig) { 9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string label = "test"; 9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::DataChannelInit config; 9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.maxRetransmits = 0; 9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.maxRetransmitTime = 0; 9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The test verifies that creating a SCTP data channel with an id already in use 9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// or out of range should fail. 9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSctpDataChannelWithInvalidIdShouldFail) { 9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::DataChannelInit config; 1003d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org scoped_refptr<DataChannelInterface> channel; 10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1005d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org config.id = 1; 1006d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org channel = pc_->CreateDataChannel("1", &config); 10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, channel->id()); 10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.id = cricket::kMaxSctpSid; 10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("max", &config); 10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(config.id, channel->id()); 10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.id = cricket::kMaxSctpSid + 1; 10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10239db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org// This test verifies that OnRenegotiationNeeded is fired for every new RTP 10249db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org// DataChannel. 10259db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiationNeededForNewRtpDataChannel) { 10269db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org FakeConstraints constraints; 10279db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org constraints.SetAllowRtpDataChannels(); 10289db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org CreatePeerConnection(&constraints); 10299db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org 10309db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org scoped_refptr<DataChannelInterface> dc1 = 10319db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org pc_->CreateDataChannel("test1", NULL); 10329db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 10339db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org observer_.renegotiation_needed_ = false; 10349db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org 10359db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org scoped_refptr<DataChannelInterface> dc2 = 10369db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org pc_->CreateDataChannel("test2", NULL); 10379db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 10389db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org} 10399db4381de5aa951f4558e043a4e080effa8bd7bcjiayl@webrtc.org 10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that a data channel closes when a PeerConnection is deleted/closed. 10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DataChannelCloseWhenPeerConnectionClose) { 10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 10512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data1)); 10532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new MockDataChannelObserver(data2)); 10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferReceiveAnswer(); 10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ReleasePeerConnection(); 10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data2->state()); 10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that data channels can be rejected in an answer. 10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestRejectDataChannelInAnswer) { 10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel( 10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDataChannel("offer_channel", NULL)); 10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create an answer where the m-line for data channels are rejected. 10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(sdp, NULL)); 10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentInfo* data_info = 10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer->description()->GetContentByName("data"); 10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_info->rejected = true; 10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DoSetRemoteDescription(answer); 10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a session description from an SDP string from 10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// FireFox, use it as a remote session description, generate an answer and use 10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the answer as a local description. 109319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.orgTEST_F(PeerConnectionInterfaceTest, ReceiveFireFoxOffer) { 10942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints constraints; 10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org true); 10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(&constraints); 10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* desc = 11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::kFireFoxSdpOffer); 11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(desc, false)); 11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_->local_description() != NULL); 11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description() != NULL); 11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(pc_->local_description()->description()); 11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = 11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstVideoContent(pc_->local_description()->description()); 11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 111719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org#ifdef HAVE_SCTP 11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = 11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstDataContent(pc_->local_description()->description()); 11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content->rejected); 112219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org#endif 11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create an audio only offer and receive an answer with a 11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// limited set of audio codecs and receive an updated offer with more audio 11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// codecs, where the added codecs are not supported. 11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveUpdatedAudioOfferWithBadCodecs) { 11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddVoiceStream("audio_label"); 11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsLocalDescription(); 11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::kAudioSdp); 11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(answer, false)); 11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* updated_offer = 11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::kAudioSdpWithUnsupportedCodecs); 11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(updated_offer, false)); 11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that PeerConnection::Close changes the states to closed and all remote 11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// tracks change state to ended. 11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) { 11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Initialize a PeerConnection and negotiate local and remote session 11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description. 11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 11530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->Close(); 11550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kClosed, pc_->signaling_state()); 11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionClosed, 11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->ice_connection_state()); 11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->ice_gathering_state()); 11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 11630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, pc_->remote_streams()->count()); 11640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> remote_stream = 11660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->remote_streams()->at(0); 11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream->GetVideoTracks()[0]->state()); 11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream->GetAudioTracks()[0]->state()); 11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that PeerConnection methods fails gracefully after 11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// PeerConnection::Close has been called. 11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) { 11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreatePeerConnection(); 11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateOfferAsRemoteDescription(); 11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAnswerAsLocalDescription(); 11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 11820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> local_stream = 11830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->local_streams()->at(0); 11840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->Close(); 11860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->RemoveStream(local_stream); 11880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(pc_->AddStream(local_stream, NULL)); 11890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(local_stream->GetAudioTracks().empty()); 11912a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DtmfSenderInterface> dtmf_sender( 11920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->CreateDtmfSender(local_stream->GetAudioTracks()[0])); 1193ceed364e986a2332e2604ba040f2221602211f9cwu@webrtc.org EXPECT_TRUE(NULL == dtmf_sender); // local stream has been removed. 11940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->CreateDataChannel("test", NULL) == NULL); 11960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->local_description() != NULL); 11980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(pc_->remote_description() != NULL); 11990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 12010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(offer.use())); 12022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer; 12030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(answer.use())); 12040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 12060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description()->ToString(&sdp)); 12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 12080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 12090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 12100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(DoSetRemoteDescription(remote_offer)); 12110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(pc_->local_description()->ToString(&sdp)); 12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* local_offer = 12140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL); 12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(DoSetLocalDescription(local_offer)); 12170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 12180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that GetStats can still be called after PeerConnection::Close. 12200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndGetStats) { 12210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 12220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pc_->Close(); 12230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DoGetStats(NULL); 12240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1225