peerconnectioninterface_unittest.cc revision 61e00b0bcab899a32f14c1e2e0f4b7f316cc1f03
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2012 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string> 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/fakeportallocatorfactory.h" 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnectioninterface.h" 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 35a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org#include "talk/app/webrtc/test/fakedtlsidentityservice.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/testsdpstrings.h" 38967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include "talk/app/webrtc/videosource.h" 39a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/base/fakevideocapturer.h" 40a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/sctp/sctpdataengine.h" 41a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/session/media/mediasession.h" 42d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/gunit.h" 43d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 44d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/ssladapter.h" 45d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h" 46d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/stringutils.h" 47d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/thread.h" 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel1[] = "local_stream_1"; 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel2[] = "local_stream_2"; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel3[] = "local_stream_3"; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kDefaultStunPort = 3478; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressOnly[] = "stun:address"; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunInvalidPort[] = "stun:address:-1"; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressPortAndMore1[] = "stun:address:port:more"; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressPortAndMore2[] = "stun:address:port more"; 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnIceServerUri[] = "turn:user@turn.example.org"; 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnUsername[] = "user"; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnPassword[] = "password"; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnHostname[] = "turn.example.org"; 6161e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.orgstatic const uint32 kTimeout = 10000U; 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!(feature())) { \ 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return; \ 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 69d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgusing rtc::scoped_ptr; 70d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgusing rtc::scoped_refptr; 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::AudioSourceInterface; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::AudioTrackInterface; 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::DataBuffer; 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::DataChannelInterface; 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::FakeConstraints; 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::FakePortAllocatorFactory; 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::IceCandidateInterface; 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaStreamInterface; 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaStreamTrackInterface; 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockCreateSessionDescriptionObserver; 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockDataChannelObserver; 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockSetSessionDescriptionObserver; 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockStatsObserver; 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionInterface; 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionObserver; 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PortAllocatorFactoryInterface; 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::SdpParseError; 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoSourceInterface; 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoTrackInterface; 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Gets the first ssrc of given content type from the ContentInfo. 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgbool GetFirstSsrc(const cricket::ContentInfo* content_info, int* ssrc) { 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!content_info || !ssrc) { 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::MediaContentDescription* media_desc = 10028654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org static_cast<const cricket::MediaContentDescription*>( 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content_info->description); 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!media_desc || media_desc->streams().empty()) { 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *ssrc = media_desc->streams().begin()->first_ssrc(); 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return true; 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgvoid SetSsrcToZero(std::string* sdp) { 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const char kSdpSsrcAtribute[] = "a=ssrc:"; 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const char kSdpSsrcAtributeZero[] = "a=ssrc:0"; 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org size_t ssrc_pos = 0; 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org while ((ssrc_pos = sdp->find(kSdpSsrcAtribute, ssrc_pos)) != 11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string::npos) { 11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org size_t end_ssrc = sdp->find(" ", ssrc_pos); 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp->replace(ssrc_pos, end_ssrc - ssrc_pos, kSdpSsrcAtributeZero); 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ssrc_pos = end_ssrc; 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockPeerConnectionObserver : public PeerConnectionObserver { 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockPeerConnectionObserver() 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : renegotiation_needed_(false), 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_complete_(false) { 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ~MockPeerConnectionObserver() { 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetPeerConnectionInterface(PeerConnectionInterface* pc) { 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_ = pc; 13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (pc) { 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org state_ = pc_->signaling_state(); 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnSignalingChange( 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::SignalingState new_state) { 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), new_state); 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org state_ = new_state; 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnStateChange(StateType state_changed) { 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (pc_.get() == NULL) 14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return; 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org switch (state_changed) { 14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org case kSignalingState: 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // OnSignalingChange and OnStateChange(kSignalingState) should always 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be called approximately simultaneously. To ease testing, we require 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that they always be called in that order. This check verifies 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that OnSignalingChange has just been called. 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), state_); 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org case kIceState: 15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ADD_FAILURE(); 15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 15528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org default: 15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ADD_FAILURE(); 15728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 15828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnAddStream(MediaStreamInterface* stream) { 16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_added_stream_ = stream; 16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRemoveStream(MediaStreamInterface* stream) { 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_removed_stream_ = stream; 16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRenegotiationNeeded() { 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org renegotiation_needed_ = true; 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnDataChannel(DataChannelInterface* data_channel) { 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_datachannel_ = data_channel; 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceConnectionChange( 17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceConnectionState new_state) { 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->ice_connection_state(), new_state); 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceGatheringChange( 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceGatheringState new_state) { 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->ice_gathering_state(), new_state); 18028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 18428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(candidate->ToString(&sdp)); 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_LT(0u, sdp.size()); 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_candidate_.reset(webrtc::CreateIceCandidate(candidate->sdp_mid(), 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org candidate->sdp_mline_index(), sdp, NULL)); 19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(last_candidate_.get() != NULL); 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnSignalingChange. 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceComplete() { 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_complete_ = true; 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // OnIceGatheringChange(IceGatheringCompleted) and OnIceComplete() should 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be called approximately simultaneously. For ease of testing, this 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // check additionally requires that they be called in the above order. 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Returns the label of the last added stream. 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Empty string if no stream have been added. 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string GetLastAddedStreamLabel() { 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (last_added_stream_.get()) 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return last_added_stream_->label(); 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ""; 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string GetLastRemovedStreamLabel() { 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (last_removed_stream_.get()) 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return last_removed_stream_->label(); 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ""; 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::SignalingState state_; 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<IceCandidateInterface> last_candidate_; 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> last_datachannel_; 21928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool renegotiation_needed_; 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool ice_complete_; 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 22328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_added_stream_; 22428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_removed_stream_; 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 22828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass PeerConnectionInterfaceTest : public testing::Test { 22928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void SetUp() { 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_ = webrtc::CreatePeerConnectionFactory( 232d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), rtc::Thread::Current(), NULL, NULL, 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NULL); 23428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_factory_.get() != NULL); 23528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 23628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection() { 23828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection("", "", NULL); 23928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 24028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection(webrtc::MediaConstraintsInterface* constraints) { 24228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection("", "", constraints); 24328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 24428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection(const std::string& uri, 24628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& password, 24728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaConstraintsInterface* constraints) { 24828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceServer server; 24928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceServers servers; 25028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org server.uri = uri; 25128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org server.password = password; 25228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org servers.push_back(server); 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_ = FakePortAllocatorFactory::Create(); 255a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org 25661c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // DTLS does not work in a loopback call, so is disabled for most of the 25761c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // tests in this file. We only create a FakeIdentityService if the test 25861c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // explicitly sets the constraint. 25961e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org FakeConstraints default_constraints; 26061e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org if (!constraints) { 26161e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org constraints = &default_constraints; 26261e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org 26361e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org default_constraints.AddMandatory( 26461e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false); 26561e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org } 26661e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org 267a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org FakeIdentityService* dtls_service = NULL; 268a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org bool dtls; 269a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org if (FindConstraint(constraints, 270a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 271a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org &dtls, 272a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org NULL) && dtls) { 273a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org dtls_service = new FakeIdentityService(); 274a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org } 27528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_ = pc_factory_->CreatePeerConnection(servers, constraints, 27628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_.get(), 277a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org dtls_service, 27828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &observer_); 27928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_.get() != NULL); 28028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.SetPeerConnectionInterface(pc_.get()); 28128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 28228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 28328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 28428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnectionWithDifferentConfigurations() { 28528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kStunAddressOnly, "", NULL); 28628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, port_allocator_factory_->stun_configs().size()); 28728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 28828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ("address", 28928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_->stun_configs()[0].server.hostname()); 29028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kDefaultStunPort, 29128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_->stun_configs()[0].server.port()); 29228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 29328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kStunInvalidPort, "", NULL); 29428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 29528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 29628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 29728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kStunAddressPortAndMore1, "", NULL); 29828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 29928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 30028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 30128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kStunAddressPortAndMore2, "", NULL); 30228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 30328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->turn_configs().size()); 30428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 30528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kTurnIceServerUri, kTurnPassword, NULL); 306f875f15afb5013e45b1af295b15ef4853c46a53bbuildbot@webrtc.org EXPECT_EQ(0u, port_allocator_factory_->stun_configs().size()); 30728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, port_allocator_factory_->turn_configs().size()); 30828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnUsername, 30928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].username); 31028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnPassword, 31128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].password); 31228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnHostname, 31328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org port_allocator_factory_->turn_configs()[0].server.hostname()); 31428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 31528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 31628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void ReleasePeerConnection() { 31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_ = NULL; 31828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.SetPeerConnectionInterface(NULL); 31928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 32028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddStream(const std::string& label) { 32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 32328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 32528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoSourceInterface> video_source( 32628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoSource(new cricket::FakeVideoCapturer(), NULL)); 32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 32828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoTrack(label + "v0", video_source)); 32928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(video_track.get()); 330c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 33128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 33228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 33328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 33428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 33528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddVoiceStream(const std::string& label) { 33628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 33728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 33828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 33928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 34028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack(label + "a0", NULL)); 34128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 342c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 34328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 34428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddAudioVideoStream(const std::string& stream_label, 34828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& audio_track_label, 34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& video_track_label) { 35028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 35228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(stream_label)); 35328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 35428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack( 35528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_track_label, static_cast<AudioSourceInterface*>(NULL))); 35628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoTrack(video_track_label, NULL)); 35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(video_track.get()); 360c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 36328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 36428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 36528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoCreateOfferAnswer(SessionDescriptionInterface** desc, bool offer) { 366d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockCreateSessionDescriptionObserver> 367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org observer(new rtc::RefCountedObject< 36828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockCreateSessionDescriptionObserver>()); 36928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (offer) { 37028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateOffer(observer, NULL); 37128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 37228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateAnswer(observer, NULL); 37328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 37428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 37528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *desc = observer->release_desc(); 37628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->result(); 37728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 37828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 37928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoCreateOffer(SessionDescriptionInterface** desc) { 38028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoCreateOfferAnswer(desc, true); 38128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 38228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 38328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoCreateAnswer(SessionDescriptionInterface** desc) { 38428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoCreateOfferAnswer(desc, false); 38528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 38628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 38728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetSessionDescription(SessionDescriptionInterface* desc, bool local) { 388d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockSetSessionDescriptionObserver> 389d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org observer(new rtc::RefCountedObject< 39028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockSetSessionDescriptionObserver>()); 39128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (local) { 39228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->SetLocalDescription(observer, desc); 39328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 39428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->SetRemoteDescription(observer, desc); 39528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 39628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 39728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->result(); 39828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 39928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 40028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetLocalDescription(SessionDescriptionInterface* desc) { 40128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoSetSessionDescription(desc, true); 40228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 40328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 40428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetRemoteDescription(SessionDescriptionInterface* desc) { 40528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoSetSessionDescription(desc, false); 40628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 40728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 40828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Calls PeerConnection::GetStats and check the return value. 40928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // It does not verify the values in the StatReports since a RTCP packet might 41028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be required. 41128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoGetStats(MediaStreamTrackInterface* track) { 412d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockStatsObserver> observer( 413d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<MockStatsObserver>()); 414db41b4dbcdeb9a3b71b8de274db8654f3e51c99cjiayl@webrtc.org if (!pc_->GetStats( 415db41b4dbcdeb9a3b71b8de274db8654f3e51c99cjiayl@webrtc.org observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)) 41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer->called(), kTimeout); 41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->called(); 41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void InitiateCall() { 42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 42328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks. 42428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 42728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 42828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that RTP Header extensions has been negotiated for audio and video. 42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void VerifyRemoteRtpHeaderExtensions() { 43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::MediaContentDescription* desc = 43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstAudioContentDescription( 43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_description()->description()); 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org desc = cricket::GetFirstVideoContentDescription( 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_description()->description()); 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferAsRemoteDescription() { 443d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 444005b6fffe639b50ba2deebe32424e109fd40f2b1pkasting@chromium.org ASSERT_TRUE(DoCreateOffer(offer.use())); 44528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 44828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(remote_offer)); 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_); 45228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 45328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 45428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateAnswerAsLocalDescription() { 45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 456005b6fffe639b50ba2deebe32424e109fd40f2b1pkasting@chromium.org ASSERT_TRUE(DoCreateAnswer(answer.use())); 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 46528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* new_answer = 46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_answer)); 47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 47328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePrAnswerAsLocalDescription() { 47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 476005b6fffe639b50ba2deebe32424e109fd40f2b1pkasting@chromium.org ASSERT_TRUE(DoCreateAnswer(answer.use())); 47728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* pr_answer = 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer, 48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(pr_answer)); 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalPrAnswer, observer_.state_); 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferReceiveAnswer() { 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferAsLocalDescription() { 495d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(DoCreateOffer(offer.use())); 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* new_offer = 50728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription( 50828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kOffer, 50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_offer)); 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalOffer, observer_.state_); 51368cbd012160535d2a8bb6453961b7eb066902b76mallinath@webrtc.org // Wait for the ice_complete message, so that SDP will have candidates. 51468cbd012160535d2a8bb6453961b7eb066902b76mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateAnswerAsRemoteDescription(const std::string& offer) { 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(offer, NULL)); 52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 52228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 52328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 52528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePrAnswerAndAnswerAsRemoteDescription(const std::string& offer) { 52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* pr_answer = 52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new webrtc::JsepSessionDescription( 52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kPrAnswer); 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pr_answer->Initialize(offer, NULL)); 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(pr_answer)); 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemotePrAnswer, observer_.state_); 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new webrtc::JsepSessionDescription( 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(offer, NULL)); 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Help function used for waiting until a the last signaled remote stream has 54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the same label as |stream_label|. In a few of the tests in this file we 54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // answer with the same session description as we offer and thus we can 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // check if OnAddStream have been called with the same stream as we offer to 54428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // send. 54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void WaitAndVerifyOnAddStream(const std::string& stream_label) { 54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(stream_label, observer_.GetLastAddedStreamLabel(), kTimeout); 54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates an offer and applies it as a local session description. 55028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates an answer with the same SDP an the offer but removes all lines 55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that start with a:ssrc" 55228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferReceiveAnswerWithoutSsrc() { 55328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 55528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 55628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SetSsrcToZero(&sdp); 55728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 55828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<FakePortAllocatorFactory> port_allocator_factory_; 56128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_; 56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockPeerConnectionObserver observer_; 56428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations) { 56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations(); 56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 57128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, AddStreams) { 57228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 57428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream(kStreamLabel2); 57528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(2u, pc_->local_streams()->count()); 57628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5779dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Test we can add multiple local streams to one peerconnection. 57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(kStreamLabel3)); 58028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack( 58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org kStreamLabel3, static_cast<AudioSourceInterface*>(NULL))); 58328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 584c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 5859dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(3u, pc_->local_streams()->count()); 5869dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org 5879dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the third stream. 5889dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(2)); 5899dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(2u, pc_->local_streams()->count()); 59028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5919dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the second stream. 59228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(1)); 5939dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5959dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the first stream. 5969dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 5979dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 59828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 59928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RemoveStream) { 60128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 60228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 60328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 60428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 60528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 60728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) { 60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 61128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VerifyRemoteRtpHeaderExtensions(); 61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 61328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) { 61528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 61628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 61728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 61828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string offer; 61928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&offer)); 62028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePrAnswerAndAnswerAsRemoteDescription(offer); 62128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 62228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 62328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 62428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) { 62528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 62628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 62728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 62828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 62928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 63028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 63228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreatePrAnswerAndAnswer) { 63528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 63628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 63728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 63928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePrAnswerAsLocalDescription(); 64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 64128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 64328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 64428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, Renegotiate) { 64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 64728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 65028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 65128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 65428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Tests that after negotiating an audio only call, the respondent can perform a 65628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// renegotiation that removes the audio stream. 65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) { 65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream(kStreamLabel1); 66028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 66228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 66528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 66828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that candidates are generated and that we can parse our own candidates. 67028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, IceCandidates) { 67128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 67328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // SetRemoteDescription takes ownership of offer. 67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddStream(kStreamLabel1); 67728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(&offer)); 67828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer)); 67928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // SetLocalDescription takes ownership of answer. 68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(&answer)); 68328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(answer)); 68428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.last_candidate_.get() != NULL, kTimeout); 68628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 68928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 69028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 69128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that the CreateOffer and CreatAnswer will fail if the track labels are 69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// not unique. 69328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) { 69428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 69528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a regular offer for the CreateAnswer test later. 69628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(&offer)); 69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer != NULL); 69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete offer; 70028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org offer = NULL; 70128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks having same label. 70328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "track_label", "track_label"); 70428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateOffer 70628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoCreateOffer(&offer)); 70728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateAnswer 70928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 71028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoCreateAnswer(&answer)); 71128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 71228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 71328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we will get different SSRCs for each tracks in the offer and answer 71428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// we created. 71528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) { 71628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 71728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks having different labels. 71828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 71928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateOffer 72128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> offer; 722005b6fffe639b50ba2deebe32424e109fd40f2b1pkasting@chromium.org ASSERT_TRUE(DoCreateOffer(offer.use())); 72328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int audio_ssrc = 0; 72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int video_ssrc = 0; 72528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(offer->description()), 72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &audio_ssrc)); 72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(offer->description()), 72828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &video_ssrc)); 72928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateAnswer 73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer.release())); 73328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 734005b6fffe639b50ba2deebe32424e109fd40f2b1pkasting@chromium.org ASSERT_TRUE(DoCreateAnswer(answer.use())); 73528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_ssrc = 0; 73628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_ssrc = 0; 73728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(answer->description()), 73828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &audio_ssrc)); 73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(answer->description()), 74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &video_ssrc)); 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 74228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 74328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can specify a certain track that we want statistics about. 74528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForSpecificTrack) { 74628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 74728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 74828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetAudioTracks().size()); 74928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_audio = 75028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0)->GetAudioTracks()[0]; 75128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Remove the stream. Since we are sending to our selves the local 75428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // and the remote stream is the same. 75528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 75628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Do a re-negotiation. 75728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 75828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(0u, pc_->remote_streams()->count()); 76028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test that we still can get statistics for the old track. Even if it is not 76228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // sent any longer. 76328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 76428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 76528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 76628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can get stats on a video track. 76728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForVideoTrack) { 76828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 76928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 77028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetVideoTracks().size()); 77128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_video = 77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0)->GetVideoTracks()[0]; 77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_video)); 77428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 77528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we don't get statistics for an invalid track. 777908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// TODO(tommi): Fix this test. DoGetStats will return true 778908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// for the unknown track (since GetStats is async), but no 779908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// data is returned for the track. 780908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DISABLED_GetStatsForInvalidTrack) { 78128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 78228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> unknown_audio_track( 78328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack("unknown track", NULL)); 78428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoGetStats(unknown_audio_track)); 78528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test setup two RTP data channels in loop back. 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestDataChannel) { 78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 79028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 79128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 79228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 79428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 797d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 799d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string data_to_send1 = "testing testing"; 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string data_to_send2 = "testing something else"; 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(data_to_send1))); 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 80928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 81028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data1->Send(DataBuffer(data_to_send1))); 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send1, observer1->last_message(), kTimeout); 81828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data1->Close(); 82128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 82228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 82328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 82428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(observer2->IsOpen()); 82628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data_to_send2 = "testing something else again"; 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 82928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that sendnig binary data over RTP data channels should 83428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// fail. 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendBinaryOnRtpDataChannel) { 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 83728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 83828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 83928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 844d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 846d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 85028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 85128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 85828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 859d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Buffer buffer("test", 4); 86028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(buffer, true))); 86128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 86228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test setup a RTP data channels in loop back and test that a channel is 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// opened even if the remote end answer with a zero SSRC. 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendOnlyDataChannel) { 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 86728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 86828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 86928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 87028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 871d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 87228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 87528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 87728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data1->Close(); 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 88228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 88328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that if a data channel is added in an answer a receive only channel 88628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// channel is created. 88728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestReceiveOnlyDataChannel) { 88828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 88928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 89028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string offer_label = "offer_channel"; 89328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel = 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(offer_label, NULL); 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Replace the data channel label in the offer and apply it as an answer. 89928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string receive_label = "answer_channel"; 90028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 90128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 902d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::replace_substrs(offer_label.c_str(), offer_label.length(), 90328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org receive_label.c_str(), receive_label.length(), 90428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &sdp); 90528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 90628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that a new incoming data channel has been created and that 90828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // it is open but can't we written to. 90928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(observer_.last_datachannel_ != NULL); 91028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataChannelInterface* received_channel = observer_.last_datachannel_; 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, received_channel->state()); 91228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(receive_label, received_channel->label()); 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(received_channel->Send(DataBuffer("something"))); 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that the channel we initially offered has been rejected. 91628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 91728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Do another offer / answer exchange and verify that the data channel is 91928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // opened. 92028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 92128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(DataChannelInterface::kOpen, received_channel->state(), 92228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org kTimeout); 92328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that no data channel is returned if a reliable channel is 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// requested. 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// TODO(perkj): Remove this test once reliable channels are implemented. 92828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateReliableRtpDataChannelShouldFail) { 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 93028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 93128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 93228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string label = "test"; 93428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.reliable = true; 93628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 93728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 93928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This tests that a SCTP data channel is returned using different 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// DataChannelInit configurations. 94328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateSctpDataChannel) { 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 94528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 94628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 94728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 94928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 95128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("1", &config); 95228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 95328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 954001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 955001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org observer_.renegotiation_needed_ = false; 95628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.ordered = false; 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("2", &config); 95928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 961001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 96228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.ordered = true; 96428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = 0; 96528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("3", &config); 96628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 968001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = -1; 97128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmitTime = 0; 97228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("4", &config); 97328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 97428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 975001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 97628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 97728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This tests that no data channel is returned if both maxRetransmits and 97928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// maxRetransmitTime are set for SCTP data channels. 98028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 98128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateSctpDataChannelShouldFailForInvalidConfig) { 98228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 98328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 98428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 98528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 98628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string label = "test"; 98728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 98828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = 0; 98928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmitTime = 0; 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 99228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 99328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 99428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// The test verifies that creating a SCTP data channel with an id already in use 99728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// or out of range should fail. 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateSctpDataChannelWithInvalidIdShouldFail) { 100028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 100128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 100228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 100328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 1005cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org scoped_refptr<DataChannelInterface> channel; 100628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1007cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org config.id = 1; 1008cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org channel = pc_->CreateDataChannel("1", &config); 100928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 101028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1, channel->id()); 101128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 101228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 101328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 101428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 101528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.id = cricket::kMaxSctpSid; 101628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("max", &config); 101728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 101828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(config.id, channel->id()); 101928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.id = cricket::kMaxSctpSid + 1; 102128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 102328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 102428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1025001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org// This test verifies that OnRenegotiationNeeded is fired for every new RTP 1026001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org// DataChannel. 1027001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiationNeededForNewRtpDataChannel) { 1028001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org FakeConstraints constraints; 1029001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org constraints.SetAllowRtpDataChannels(); 1030001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org CreatePeerConnection(&constraints); 1031001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 1032001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org scoped_refptr<DataChannelInterface> dc1 = 1033001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org pc_->CreateDataChannel("test1", NULL); 1034001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 1035001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org observer_.renegotiation_needed_ = false; 1036001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 1037001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org scoped_refptr<DataChannelInterface> dc2 = 1038001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org pc_->CreateDataChannel("test2", NULL); 1039001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 1040001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org} 1041001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 104228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that a data channel closes when a PeerConnection is deleted/closed. 104328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DataChannelCloseWhenPeerConnectionClose) { 104428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 104528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 104628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 104728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 104828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 104928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 105028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 105128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 105228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 1053d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 105428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 1055d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 105628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 105728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 105928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 106028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 106128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ReleasePeerConnection(); 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 106428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data2->state()); 106528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 106628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that data channels can be rejected in an answer. 106828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestRejectDataChannelInAnswer) { 106928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 107028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 107128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 107228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel( 107428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("offer_channel", NULL)); 107528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 107728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create an answer where the m-line for data channels are rejected. 107928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 108028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 108128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 108228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 108328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(sdp, NULL)); 108428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::ContentInfo* data_info = 108528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org answer->description()->GetContentByName("data"); 108628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data_info->rejected = true; 108728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 108828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DoSetRemoteDescription(answer); 108928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 109028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 109128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 109228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can create a session description from an SDP string from 109328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// FireFox, use it as a remote session description, generate an answer and use 109428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// the answer as a local description. 1095a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgTEST_F(PeerConnectionInterfaceTest, ReceiveFireFoxOffer) { 1096d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 109728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 109828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 109928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org true); 110028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 110128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 110228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* desc = 110328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 110428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::kFireFoxSdpOffer); 110528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(desc, false)); 110628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 110728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->local_description() != NULL); 110828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description() != NULL); 110928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 111028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::ContentInfo* content = 111128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstAudioContent(pc_->local_description()->description()); 111228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 111328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(content->rejected); 111428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 111528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content = 111628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstVideoContent(pc_->local_description()->description()); 111728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 111828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(content->rejected); 1119a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org#ifdef HAVE_SCTP 112028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content = 112128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstDataContent(pc_->local_description()->description()); 112228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 112328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(content->rejected); 1124a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org#endif 112528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 112628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 112728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can create an audio only offer and receive an answer with a 112828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// limited set of audio codecs and receive an updated offer with more audio 112928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// codecs, where the added codecs are not supported. 113028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveUpdatedAudioOfferWithBadCodecs) { 113128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 113228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream("audio_label"); 113328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 113428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 113528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = 113628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 113728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::kAudioSdp); 113828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(answer, false)); 113928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 114028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* updated_offer = 114128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 114228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::kAudioSdpWithUnsupportedCodecs); 114328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(updated_offer, false)); 114428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 114528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 114628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 114728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that PeerConnection::Close changes the states to closed and all remote 114828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// tracks change state to ended. 114928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) { 115028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Initialize a PeerConnection and negotiate local and remote session 115128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // description. 115228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 115328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 115428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 115528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 115628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 115728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 115828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kClosed, pc_->signaling_state()); 115928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionClosed, 116028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_connection_state()); 116128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 116228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 116328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 116428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 116528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, pc_->remote_streams()->count()); 116628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 116728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> remote_stream = 116828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0); 116928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 117028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org remote_stream->GetVideoTracks()[0]->state()); 117128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 117228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org remote_stream->GetAudioTracks()[0]->state()); 117328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 117428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 117528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that PeerConnection methods fails gracefully after 117628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// PeerConnection::Close has been called. 117728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) { 117828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 117928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 118028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 118128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 118228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 118328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 118428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> local_stream = 118528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->local_streams()->at(0); 118628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 118728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 118828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 118928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(local_stream); 1190c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_FALSE(pc_->AddStream(local_stream)); 119128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 119228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(local_stream->GetAudioTracks().empty()); 1193d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::DtmfSenderInterface> dtmf_sender( 119428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDtmfSender(local_stream->GetAudioTracks()[0])); 11956603736038d8555078ebbaff951cc35b80a2d491wu@webrtc.org EXPECT_TRUE(NULL == dtmf_sender); // local stream has been removed. 119628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 119728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->CreateDataChannel("test", NULL) == NULL); 119828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 119928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description() != NULL); 120028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->remote_description() != NULL); 120128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1202d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 120328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoCreateOffer(offer.use())); 1204d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer; 120528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoCreateAnswer(answer.use())); 120628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 120728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 120828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description()->ToString(&sdp)); 120928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 121028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 121128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 121228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoSetRemoteDescription(remote_offer)); 121328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 121428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->local_description()->ToString(&sdp)); 121528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* local_offer = 121628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 121728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 121828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoSetLocalDescription(local_offer)); 121928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 122028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 122128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that GetStats can still be called after PeerConnection::Close. 122228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndGetStats) { 122328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 122428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 122528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DoGetStats(NULL); 122628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 1227