15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2012, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/audiotrack.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/jsepicecandidate.h" 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/streamcollection.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/videotrack.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org#include "talk/app/webrtc/test/fakedtlsidentityservice.h" 367bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org#include "talk/app/webrtc/test/fakemediastreamsignaling.h" 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/webrtcsession.h" 387bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org#include "talk/app/webrtc/webrtcsessiondescriptionfactory.h" 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/fakenetwork.h" 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/firewallsocketserver.h" 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h" 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/network.h" 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/physicalsocketserver.h" 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sslstreamadapter.h" 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stringutils.h" 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h" 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/virtualsocketserver.h" 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakemediaengine.h" 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakevideorenderer.h" 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/mediachannel.h" 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/stunserver.h" 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/teststunserver.h" 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/basicportallocator.h" 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/channelmanager.h" 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/mediasession.h" 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!(feature())) { \ 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; \ 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::BaseSession; 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::DF_PLAY; 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::DF_SEND; 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::FakeVoiceMediaChannel; 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::NS_GINGLE_P2P; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::NS_JINGLE_ICE_UDP; 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing cricket::TransportInfo; 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing talk_base::SocketAddress; 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing talk_base::scoped_ptr; 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::CreateSessionDescription; 757bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgusing webrtc::CreateSessionDescriptionObserver; 767bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgusing webrtc::CreateSessionDescriptionRequest; 777bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgusing webrtc::DTLSIdentityRequestObserver; 787bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgusing webrtc::DTLSIdentityServiceInterface; 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::FakeConstraints; 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::IceCandidateCollection; 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::JsepIceCandidate; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::JsepSessionDescription; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::PeerConnectionInterface; 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::SessionDescriptionInterface; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::StreamCollection; 867bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgusing webrtc::WebRtcSession; 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kMlineMismatch; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kSdpWithoutCrypto; 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kSessionError; 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kSetLocalSdpFailed; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kSetRemoteSdpFailed; 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kPushDownAnswerTDFailed; 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing webrtc::kPushDownPranswerTDFailed; 94c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.orgusing webrtc::kBundleWithoutRtcpMux; 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kClientAddr1("11.11.11.11", 0); 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kClientAddr2("22.22.22.22", 0); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT); 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kSessionVersion[] = "1"; 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Media index of candidates belonging to the first media content. 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kMediaContentIndex0 = 0; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kMediaContentName0[] = "audio"; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Media index of candidates belonging to the second media content. 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kMediaContentIndex1 = 1; 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kMediaContentName1[] = "video"; 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kIceCandidatesTimeout = 10000; 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const cricket::AudioCodec 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const cricket::AudioCodec kCNCodec1(102, "CN", 8000, 0, 1, 0); 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const cricket::AudioCodec kCNCodec2(103, "CN", 16000, 0, 1, 0); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Add some extra |newlines| to the |message| after |line|. 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic void InjectAfter(const std::string& line, 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& newlines, 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string* message) { 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string tmp = line + newlines; 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(line.c_str(), line.length(), 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tmp.c_str(), tmp.length(), message); 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MockIceObserver : public webrtc::IceObserver { 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MockIceObserver() 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : oncandidatesready_(false), 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ice_gathering_state_(PeerConnectionInterface::kIceGatheringNew) { 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void OnIceConnectionChange( 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PeerConnectionInterface::IceConnectionState new_state) { 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ice_connection_state_ = new_state; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void OnIceGatheringChange( 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PeerConnectionInterface::IceGatheringState new_state) { 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // We can never transition back to "new". 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, new_state); 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ice_gathering_state_ = new_state; 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // oncandidatesready_ really means "ICE gathering is complete". 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This if statement ensures that this value remains correct when we 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // transition from kIceGatheringComplete to kIceGatheringGathering. 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (new_state == PeerConnectionInterface::kIceGatheringGathering) { 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org oncandidatesready_ = false; 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Found a new candidate. 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (candidate->sdp_mline_index() == kMediaContentIndex0) { 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mline_0_candidates_.push_back(candidate->candidate()); 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (candidate->sdp_mline_index() == kMediaContentIndex1) { 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mline_1_candidates_.push_back(candidate->candidate()); 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The ICE gathering state should always be Gathering when a candidate is 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // received (or possibly Completed in the case of the final candidate). 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_); 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void OnIceComplete() { 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(oncandidatesready_); 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org oncandidatesready_ = true; 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // OnIceGatheringChange(IceGatheringCompleted) and OnIceComplete() should 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // be called approximately simultaneously. For ease of testing, this 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // check additionally requires that they be called in the above order. 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ice_gathering_state_); 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool oncandidatesready_; 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::Candidate> mline_0_candidates_; 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::Candidate> mline_1_candidates_; 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PeerConnectionInterface::IceConnectionState ice_connection_state_; 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PeerConnectionInterface::IceGatheringState ice_gathering_state_; 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass WebRtcSessionForTest : public webrtc::WebRtcSession { 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WebRtcSessionForTest(cricket::ChannelManager* cmgr, 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* signaling_thread, 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* worker_thread, 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortAllocator* port_allocator, 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::IceObserver* ice_observer, 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaStreamSignaling* mediastream_signaling) 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : WebRtcSession(cmgr, signaling_thread, worker_thread, port_allocator, 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling) { 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RegisterIceObserver(ice_observer); 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~WebRtcSessionForTest() {} 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using cricket::BaseSession::GetTransportProxy; 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using webrtc::WebRtcSession::SetAudioPlayout; 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using webrtc::WebRtcSession::SetAudioSend; 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using webrtc::WebRtcSession::SetCaptureDevice; 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using webrtc::WebRtcSession::SetVideoPlayout; 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org using webrtc::WebRtcSession::SetVideoSend; 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2057bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgclass WebRtcSessionCreateSDPObserverForTest 2067bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org : public talk_base::RefCountedObject<CreateSessionDescriptionObserver> { 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 2087bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org enum State { 2097bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org kInit, 2107bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org kFailed, 2117bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org kSucceeded, 2127bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org }; 2133ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org WebRtcSessionCreateSDPObserverForTest() : state_(kInit) {} 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2157bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org // CreateSessionDescriptionObserver implementation. 2167bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org virtual void OnSuccess(SessionDescriptionInterface* desc) { 2173ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org description_.reset(desc); 2187bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org state_ = kSucceeded; 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2207bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org virtual void OnFailure(const std::string& error) { 2217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org state_ = kFailed; 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2243ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org SessionDescriptionInterface* description() { return description_.get(); } 2253ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org 2263ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org SessionDescriptionInterface* ReleaseDescription() { 2273ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org return description_.release(); 2283ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org } 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org State state() const { return state_; } 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2327bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org protected: 2337bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org ~WebRtcSessionCreateSDPObserverForTest() {} 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 2363ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> description_; 2377bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org State state_; 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 240c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.orgclass FakeAudioRenderer : public cricket::AudioRenderer { 241c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org public: 242c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org FakeAudioRenderer() : channel_id_(-1) {} 243c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org 244c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org virtual void AddChannel(int channel_id) OVERRIDE { 245c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org ASSERT(channel_id_ == -1); 246c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org channel_id_ = channel_id; 247c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org } 248c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org virtual void RemoveChannel(int channel_id) OVERRIDE { 249c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org ASSERT(channel_id == channel_id_); 250c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org channel_id_ = -1; 251c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org } 252c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org 253c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org int channel_id() const { return channel_id_; } 254c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org private: 255c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org int channel_id_; 256c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org}; 257c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass WebRtcSessionTest : public testing::Test { 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO Investigate why ChannelManager crashes, if it's created 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // after stun_server. 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WebRtcSessionTest() 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org data_engine_(new cricket::FakeDataEngine()), 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org device_manager_(new cricket::FakeDeviceManager()), 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org channel_manager_(new cricket::ChannelManager( 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org media_engine_, data_engine_, device_manager_, 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new cricket::CaptureManager(), talk_base::Thread::Current())), 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tdesc_factory_(new cricket::TransportDescriptionFactory()), 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_(new cricket::MediaSessionDescriptionFactory( 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org channel_manager_.get(), tdesc_factory_.get())), 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pss_(new talk_base::PhysicalSocketServer), 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org vss_(new talk_base::VirtualSocketServer(pss_.get())), 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_(new talk_base::FirewallSocketServer(vss_.get())), 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ss_scope_(fss_.get()), 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stun_server_(talk_base::Thread::Current(), kStunAddr), 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_(&network_manager_, kStunAddr, 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SocketAddress(), SocketAddress(), SocketAddress()) { 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tdesc_factory_->set_protocol(cricket::ICEPROTO_HYBRID); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_.set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY | 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel_manager_->Init()); 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_add_legacy_streams(false); 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AddInterface(const SocketAddress& addr) { 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org network_manager_.AddInterface(addr); 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2917bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org void Init(DTLSIdentityServiceInterface* identity_service) { 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(session_.get() == NULL); 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_.reset(new WebRtcSessionForTest( 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org channel_manager_.get(), talk_base::Thread::Current(), 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread::Current(), &allocator_, 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &observer_, 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &mediastream_signaling_)); 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_); 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_gathering_state_); 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3047bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(session_->Initialize(constraints_.get(), identity_service)); 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void InitWithDtmfCodec() { 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Add kTelephoneEventCodec for dtmf test. 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::AudioCodec> codecs; 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org codecs.push_back(kTelephoneEventCodec); 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org media_engine_->SetAudioCodecs(codecs); 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_audio_codecs(codecs); 3137bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void InitWithDtls() { 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_.reset(new FakeConstraints()); 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, true); 3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 3227bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 3237bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 3247bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org void InitWithAsyncDtls(bool identity_request_should_fail) { 3257bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org constraints_.reset(new FakeConstraints()); 3267bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org constraints_->AddOptional( 3277bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, true); 3287bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org FakeIdentityService* identity_service = new FakeIdentityService(); 3297bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org identity_service->set_should_fail(identity_request_should_fail); 3307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(identity_service); 3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates a local offer and applies it. Starts ice. 3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Call mediastream_signaling_.UseOptionsWithStreamX() before this function 3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // to decide which streams to create. 3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void InitiateCall() { 3377bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew != 3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_gathering_state_, 3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3447bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* CreateOffer( 3457bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org const webrtc::MediaConstraintsInterface* constraints) { 3467bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> 3477bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org observer = new WebRtcSessionCreateSDPObserverForTest(); 3487bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org session_->CreateOffer(observer, constraints); 3497bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE_WAIT( 3507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, 3517bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 1000); 3523ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org return observer->ReleaseDescription(); 3537bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 3547bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 3557bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* CreateAnswer( 3567bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org const webrtc::MediaConstraintsInterface* constraints) { 3577bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> observer 3587bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org = new WebRtcSessionCreateSDPObserverForTest(); 3597bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org session_->CreateAnswer(observer, constraints); 3607bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE_WAIT( 3617bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, 3627bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 1000); 3633ca2c3528853f8a25fe42f0e998596ea5ce1f33dmallinath@webrtc.org return observer->ReleaseDescription(); 3647bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 3657bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool ChannelsExist() { 3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (session_->voice_channel() != NULL && 3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->video_channel() != NULL); 3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CheckTransportChannels() { 3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 1) != NULL); 3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 2) != NULL); 3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 1) != NULL); 3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 2) != NULL); 3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyCryptoParams(const cricket::SessionDescription* sdp) { 3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(session_.get() != NULL); 3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::AudioContentDescription* audio_content = 3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<const cricket::AudioContentDescription*>( 3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content->description); 3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(audio_content != NULL); 3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1U, audio_content->cryptos().size()); 3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); 3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org audio_content->cryptos()[0].cipher_suite); 3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org audio_content->protocol()); 3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(sdp); 3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::VideoContentDescription* video_content = 3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<const cricket::VideoContentDescription*>( 3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content->description); 3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video_content != NULL); 3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1U, video_content->cryptos().size()); 4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_content->cryptos()[0].cipher_suite); 4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size()); 4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_content->protocol()); 4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) { 4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::AudioContentDescription* audio_content = 4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<const cricket::AudioContentDescription*>( 4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content->description); 4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(audio_content != NULL); 4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(0U, audio_content->cryptos().size()); 4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(sdp); 4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::VideoContentDescription* video_content = 4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<const cricket::VideoContentDescription*>( 4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content->description); 4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video_content != NULL); 4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(0U, video_content->cryptos().size()); 4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dtls) { 4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org audio_content->protocol()); 4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_content->protocol()); 4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), 4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org audio_content->protocol()); 4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), 4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_content->protocol()); 4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set the internal fake description factories to do DTLS-SRTP. 4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetFactoryDtlsSrtp() { 4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_secure(cricket::SEC_ENABLED); 4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string identity_name = "WebRTC" + 4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::ToString(talk_base::CreateRandomId()); 4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org identity_.reset(talk_base::SSLIdentity::Generate(identity_name)); 4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tdesc_factory_->set_identity(identity_.get()); 4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tdesc_factory_->set_digest_algorithm(talk_base::DIGEST_SHA_256); 4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org tdesc_factory_->set_secure(cricket::SEC_REQUIRED); 4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyFingerprintStatus(const cricket::SessionDescription* sdp, 4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool expected) { 4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const TransportInfo* audio = sdp->GetTransportInfoByName("audio"); 4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(audio != NULL); 4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(expected, audio->description.identity_fingerprint.get() != NULL); 4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (expected) { 4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(std::string(talk_base::DIGEST_SHA_256), audio->description. 4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org identity_fingerprint->algorithm); 4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const TransportInfo* video = sdp->GetTransportInfoByName("video"); 4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video != NULL); 4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(expected, video->description.identity_fingerprint.get() != NULL); 4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (expected) { 4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(std::string(talk_base::DIGEST_SHA_256), video->description. 4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org identity_fingerprint->algorithm); 4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyAnswerFromNonCryptoOffer() { 4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a SDP without Crypto. 4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 470b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org JsepSessionDescription* offer( 4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED)); 472b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org ASSERT_TRUE(offer != NULL); 4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyNoCryptoParams(offer->description(), false); 4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError("Called with a SDP without crypto enabled", 4757bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer); 4767bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org const webrtc::SessionDescriptionInterface* answer = CreateAnswer(NULL); 4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Answer should be NULL as no crypto params in offer. 4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer == NULL); 4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyAnswerFromCryptoOffer() { 4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.bundle_enabled = true; 4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org scoped_ptr<JsepSessionDescription> offer( 4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteOffer(options, cricket::SEC_REQUIRED)); 4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer.get() != NULL); 4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyCryptoParams(offer->description()); 4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 4907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer.get() != NULL); 4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyCryptoParams(answer->description()); 4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CompareIceUfragAndPassword(const cricket::SessionDescription* desc1, 4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::SessionDescription* desc2, 4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool expect_equal) { 4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (desc1->contents().size() != desc2->contents().size()) { 4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(expect_equal); 5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfos& contents = desc1->contents(); 5045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ContentInfos::const_iterator it = contents.begin(); 5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (; it != contents.end(); ++it) { 5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::TransportDescription* transport_desc1 = 5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc1->GetTransportDescriptionByName(it->name); 5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::TransportDescription* transport_desc2 = 5105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc2->GetTransportDescriptionByName(it->name); 5115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!transport_desc1 || !transport_desc2) { 5125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(expect_equal); 5135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 5145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || 5165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { 5175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(expect_equal); 5185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 5195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(expect_equal); 5225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates a remote offer and and applies it as a remote description, 5245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // creates a local answer and applies is as a local description. 5255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Call mediastream_signaling_.UseOptionsWithStreamX() before this function 5265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // to decide which local and remote streams to create. 5275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CreateAndSetRemoteOfferAndLocalAnswer() { 5285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 5295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 5307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 5315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 5325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetLocalDescriptionWithoutError(SessionDescriptionInterface* desc) { 5345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->SetLocalDescription(desc, NULL)); 5355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetLocalDescriptionExpectState(SessionDescriptionInterface* desc, 5375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BaseSession::State expected_state) { 5385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(desc); 5395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(expected_state, session_->state()); 5405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetLocalDescriptionExpectError(const std::string& expected_error, 5425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* desc) { 5435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string error; 5445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->SetLocalDescription(desc, &error)); 5455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(std::string::npos, error.find(kSetLocalSdpFailed)); 5465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(std::string::npos, error.find(expected_error)); 5475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetRemoteDescriptionWithoutError(SessionDescriptionInterface* desc) { 5495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->SetRemoteDescription(desc, NULL)); 5505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetRemoteDescriptionExpectState(SessionDescriptionInterface* desc, 5525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BaseSession::State expected_state) { 5535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(desc); 5545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(expected_state, session_->state()); 5555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetRemoteDescriptionExpectError(const std::string& expected_error, 5575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* desc) { 5585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string error; 5595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->SetRemoteDescription(desc, &error)); 5605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(std::string::npos, error.find(kSetRemoteSdpFailed)); 5615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(std::string::npos, error.find(expected_error)); 5625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CreateCryptoOfferAndNonCryptoAnswer(SessionDescriptionInterface** offer, 5655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface** nocrypto_answer) { 5665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a SDP without Crypto. 5675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 5685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 5695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.bundle_enabled = true; 5705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *offer = CreateRemoteOffer(options, cricket::SEC_ENABLED); 5715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(*offer != NULL); 5725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyCryptoParams((*offer)->description()); 5735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *nocrypto_answer = CreateRemoteAnswer(*offer, options, 5755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SEC_DISABLED); 5765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(*nocrypto_answer != NULL); 5775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteOfferWithVersion( 5805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options, 5815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SecurePolicy secure_policy, 5825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& session_version, 5835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* current_desc) { 5845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string session_id = talk_base::ToString(talk_base::CreateRandomId64()); 5855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::SessionDescription* cricket_desc = NULL; 5865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (current_desc) { 5875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket_desc = current_desc->description(); 5885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_id = current_desc->session_id(); 5895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_secure(secure_policy); 5925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* offer( 5935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer)); 5945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!offer->Initialize(desc_factory_->CreateOffer(options, cricket_desc), 5955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_id, session_version)) { 5965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete offer; 5975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer = NULL; 5985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return offer; 6005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteOffer( 6025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options) { 6035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED, 6045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kSessionVersion, NULL); 6055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteOffer( 6075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options, cricket::SecurePolicy policy) { 6085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteOfferWithVersion(options, policy, kSessionVersion, NULL); 6095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteOffer( 6115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options, 6125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* current_desc) { 6135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED, 6145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kSessionVersion, current_desc); 6155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer. Call mediastream_signaling_.UseOptionsWithStreamX() 6185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // before this function to decide which streams to create. 6195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteOffer() { 6205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 6215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.GetOptionsForAnswer(NULL, &options); 6225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteOffer(options, session_->remote_description()); 6235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 6265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* offer, 6275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options, 6285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SecurePolicy policy) { 6295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_secure(policy); 6305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_id = 6315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::ToString(talk_base::CreateRandomId64()); 6325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* answer( 6335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer)); 6345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!answer->Initialize(desc_factory_->CreateAnswer(offer->description(), 6355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options, NULL), 6365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_id, kSessionVersion)) { 6375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete answer; 6385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer = NULL; 6395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return answer; 6415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 6445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* offer, 6455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options) { 6465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED); 6475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates an answer session description with streams based on 6505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // |mediastream_signaling_|. Call 6515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // mediastream_signaling_.UseOptionsWithStreamX() before this function 6525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // to decide which streams to create. 6535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 6545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* offer) { 6555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 6565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.GetOptionsForAnswer(NULL, &options); 6575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED); 6585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void TestSessionCandidatesWithBundleRtcpMux(bool bundle, bool rtcp_mux) { 6615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 6627bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 6635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 6645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FakeConstraints constraints; 6655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints.SetMandatoryUseRtpMux(bundle); 6667bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(&constraints); 6675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 6685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // and answer. 6695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 6705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 6725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description())); 6735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 6745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 6755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t expected_candidate_num = 2; 6775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!rtcp_mux) { 6785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If rtcp_mux is enabled we should expect 4 candidates - host and srflex 6795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // for rtp and rtcp. 6805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org expected_candidate_num = 4; 6815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Disable rtcp-mux from the answer 6825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kRtcpMux = "a=rtcp-mux"; 6835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kXRtcpMux = "a=xrtcp-mux"; 6845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(kRtcpMux.c_str(), kRtcpMux.length(), 6855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kXRtcpMux.c_str(), kXRtcpMux.length(), 6865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 6875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* new_answer = CreateSessionDescription( 6905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription::kAnswer, sdp, NULL); 6915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription to enable rtcp mux. 6935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(new_answer); 6945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 6955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(expected_candidate_num, observer_.mline_0_candidates_.size()); 6965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(expected_candidate_num, observer_.mline_1_candidates_.size()); 6975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < observer_.mline_0_candidates_.size(); ++i) { 6985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate c0 = observer_.mline_0_candidates_[i]; 6995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate c1 = observer_.mline_1_candidates_[i]; 7005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (bundle) { 7015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(c0.IsEquivalent(c1)); 7025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 7035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(c0.IsEquivalent(c1)); 7045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Tests that we can only send DTMF when the dtmf codec is supported. 7085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void TestCanInsertDtmf(bool can) { 7095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (can) { 7105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitWithDtmfCodec(); 7115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 7127bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 7135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 7155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 7165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->CanInsertDtmf("")); 7175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(can, session_->CanInsertDtmf(kAudioTrack1)); 7185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The method sets up a call from the session to itself, in a loopback 7215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // arrangement. It also uses a firewall rule to create a temporary 7225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // disconnection. This code is placed as a method so that it can be invoked 7235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // by multiple tests with different allocators (e.g. with and without BUNDLE). 7245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // While running the call, this method also checks if the session goes through 7255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the correct sequence of ICE states when a connection is established, 7265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // broken, and re-established. 7275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The Connection state should go: 7285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // New -> Checking -> Connected -> Disconnected -> Connected. 7295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The Gathering state should go: New -> Gathering -> Completed. 7305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void TestLoopbackCall() { 7315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 7327bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 7335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 7347bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 7355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, 7375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_gathering_state_); 7385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 7395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, 7405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_); 7415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringGathering, 7425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_gathering_state_, 7435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 7455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringComplete, 7465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_gathering_state_, 7475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 7505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer->ToString(&sdp); 7515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* desc = 7525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::CreateSessionDescription(JsepSessionDescription::kAnswer, sdp); 7535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(desc != NULL); 7545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(desc); 7555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionChecking, 7575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_, 7585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionConnected, 7605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_, 7615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(bemasc): EXPECT(Completed) once the details are standardized. 7635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Adding firewall rule to block ping requests, which should cause 7655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // transport channel failure. 7665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->AddRule(false, talk_base::FP_ANY, talk_base::FD_ANY, kClientAddr1); 7675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected, 7685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_, 7695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Clearing the rules, session should move back to completed state. 7725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->ClearRules(); 7735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Session is automatically calling OnSignalingReady after creation of 7745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // new portallocator session which will allocate new set of candidates. 7755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(bemasc): Change this to Completed once the details are standardized. 7775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionConnected, 7785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org observer_.ice_connection_state_, 7795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 7805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void VerifyTransportType(const std::string& content_name, 7835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::TransportProtocol protocol) { 7845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::Transport* transport = session_->GetTransport(content_name); 7855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(transport != NULL); 7865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(protocol, transport->protocol()); 7875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Adds CN codecs to FakeMediaEngine and MediaDescriptionFactory. 7905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AddCNCodecs() { 7915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Add kTelephoneEventCodec for dtmf test. 7925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::AudioCodec> codecs = media_engine_->audio_codecs();; 7935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org codecs.push_back(kCNCodec1); 7945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org codecs.push_back(kCNCodec2); 7955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org media_engine_->SetAudioCodecs(codecs); 7965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org desc_factory_->set_audio_codecs(codecs); 7975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 7985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool VerifyNoCNCodecs(const cricket::ContentInfo* content) { 8005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentDescription* description = content->description; 8015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(description != NULL); 8025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::AudioContentDescription* audio_content_desc = 803b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org static_cast<const cricket::AudioContentDescription*>(description); 8045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(audio_content_desc != NULL); 8055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) { 8065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (audio_content_desc->codecs()[i].name == "CN") 8075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 8085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 8095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 8105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 8115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetLocalDescriptionWithDataChannel() { 8135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::DataChannelInit dci; 8145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dci.reliable = false; 8155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->CreateDataChannel("datachannel", &dci); 8167bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 8175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 8185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 8195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8207bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org void VerifyMultipleAsyncCreateDescription( 8217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org bool success, CreateSessionDescriptionRequest::Type type) { 8227bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org InitWithAsyncDtls(!success); 8237bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8247bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org if (type == CreateSessionDescriptionRequest::kAnswer) { 8257bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org cricket::MediaSessionOptions options; 8267bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org scoped_ptr<JsepSessionDescription> offer( 8277bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteOffer(options, cricket::SEC_REQUIRED)); 8287bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org ASSERT_TRUE(offer.get() != NULL); 8297bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 8307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8317bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8327bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org const int kNumber = 3; 8337bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> 8347bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org observers[kNumber]; 8357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org for (int i = 0; i < kNumber; ++i) { 8367bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org observers[i] = new WebRtcSessionCreateSDPObserverForTest(); 8377bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org if (type == CreateSessionDescriptionRequest::kOffer) { 8387bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org session_->CreateOffer(observers[i], NULL); 8397bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } else { 8407bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org session_->CreateAnswer(observers[i], NULL); 8417bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8427bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8437bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8447bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org WebRtcSessionCreateSDPObserverForTest::State expected_state = 8457bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org success ? WebRtcSessionCreateSDPObserverForTest::kSucceeded : 8467bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org WebRtcSessionCreateSDPObserverForTest::kFailed; 8477bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8487bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org for (int i = 0; i < kNumber; ++i) { 8497bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_EQ_WAIT(expected_state, observers[i]->state(), 1000); 8507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org if (success) { 8517bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(observers[i]->description() != NULL); 8527bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } else { 8537bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(observers[i]->description() == NULL); 8547bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8557bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8567bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org } 8577bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeMediaEngine* media_engine_; 8595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeDataEngine* data_engine_; 8605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeDeviceManager* device_manager_; 8615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; 8625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::TransportDescriptionFactory> tdesc_factory_; 8635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::SSLIdentity> identity_; 8645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::MediaSessionDescriptionFactory> desc_factory_; 8655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::PhysicalSocketServer> pss_; 8665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::VirtualSocketServer> vss_; 8675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::FirewallSocketServer> fss_; 8685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketServerScope ss_scope_; 8695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::TestStunServer stun_server_; 8705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FakeNetworkManager network_manager_; 8715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::BasicPortAllocator allocator_; 8725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<FakeConstraints> constraints_; 8735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FakeMediaStreamSignaling mediastream_signaling_; 8745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<WebRtcSessionForTest> session_; 8755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MockIceObserver observer_; 8765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoMediaChannel* video_channel_; 8775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVoiceMediaChannel* voice_channel_; 8785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 8795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitialize) { 8817bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 8825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 8835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitializeWithDtls) { 8855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitWithDtls(); 8865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 8875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8887bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that WebRtcSession uses SEC_REQUIRED by default. 8897bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestDefaultSetSecurePolicy) { 8907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 8917bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_EQ(cricket::SEC_REQUIRED, session_->secure_policy()); 8927bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 8937bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 8945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidates) { 8955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestSessionCandidatesWithBundleRtcpMux(false, false); 8965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 8975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Below test cases (TestSessionCandidatesWith*) verify the candidates gathered 8995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// with rtcp-mux and/or bundle. 9005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidatesWithRtcpMux) { 9015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestSessionCandidatesWithBundleRtcpMux(false, true); 9025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 9035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidatesWithBundleRtcpMux) { 9055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestSessionCandidatesWithBundleRtcpMux(true, true); 9065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 9075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestMultihomeCandidates) { 9095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 9105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr2); 9117bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 9125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitiateCall(); 9145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 9155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(8u, observer_.mline_0_candidates_.size()); 9165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(8u, observer_.mline_1_candidates_.size()); 9175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 9185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestStunError) { 9205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 9215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr2); 9225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->AddRule(false, talk_base::FP_UDP, talk_base::FD_ANY, kClientAddr1); 9237bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 9245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitiateCall(); 9265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Since kClientAddr1 is blocked, not expecting stun candidates for it. 9275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 9285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(6u, observer_.mline_0_candidates_.size()); 9295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(6u, observer_.mline_1_candidates_.size()); 9305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 9315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test creating offers and receive answers and make sure the 9335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// media engine creates the expected send and receive streams. 9345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferReceiveAnswer) { 9357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 9365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9377bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 9385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_id_orig = offer->session_id(); 9395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_version_orig = offer->session_version(); 9405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 9415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 9435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 9445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description()); 9455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 9465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 9485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 9495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 9515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 9525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 9545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 9555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 9575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 9585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 9595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 9605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create new offer without send streams. 9625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 9637bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer = CreateOffer(NULL); 9645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify the session id is the same and the session version is 9665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // increased. 9675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(session_id_orig, offer->session_id()); 9685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(talk_base::FromString<uint64>(session_version_orig), 9695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FromString<uint64>(offer->session_version())); 9705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 9725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 9745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer = CreateRemoteAnswer(session_->local_description()); 9755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 9765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, video_channel_->send_streams().size()); 9785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, voice_channel_->send_streams().size()); 9795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Make sure the receive streams have not changed. 9815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 9825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 9835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 9845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 9855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 9865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test receiving offers and creating answers and make sure the 9885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// media engine creates the expected send and receive streams. 9895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiveOfferCreateAnswer) { 9907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 9915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 9927bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 9935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 9945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9967bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 9975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 9985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 9995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_id_orig = answer->session_id(); 10005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_version_orig = answer->session_version(); 10015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 10035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 10045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 10065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 10075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 10095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 10105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 10125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 10135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 10145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 10155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1And2(); 10177bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer = CreateOffer(NULL); 10185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 10195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Answer by turning off all send streams. 10215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 10227bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org answer = CreateAnswer(NULL); 10235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify the session id is the same and the session version is 10255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // increased. 10265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(session_id_orig, answer->session_id()); 10275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(talk_base::FromString<uint64>(session_version_orig), 10285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FromString<uint64>(answer->session_version())); 10295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 10305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, video_channel_->recv_streams().size()); 10325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->recv_streams()[0].id); 10335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[1].id); 10345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, voice_channel_->recv_streams().size()); 10355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->recv_streams()[0].id); 10365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[1].id); 10375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Make sure we have no send streams. 10395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, video_channel_->send_streams().size()); 10405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, voice_channel_->send_streams().size()); 10415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 10425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test we will return fail when apply an offer that doesn't have 10445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// crypto enabled. 10455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetNonCryptoOffer) { 10467bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 10475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 10485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 10495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* offer = CreateRemoteOffer( 10505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options, cricket::SEC_DISABLED); 10515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 10525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyNoCryptoParams(offer->description(), false); 10535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 10545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the offer. 10555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError(kSdpWithoutCrypto, offer); 10565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer = CreateRemoteOffer(options, cricket::SEC_DISABLED); 10575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 10585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectError(kSdpWithoutCrypto, offer); 10595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 10605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test we will return fail when apply an answer that doesn't have 10625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// crypto enabled. 10635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetLocalNonCryptoAnswer) { 10647bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 10655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = NULL; 10665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = NULL; 10675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer); 10685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 10695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the offer. 10705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 10715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectError(kSdpWithoutCrypto, answer); 10725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 10735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test we will return fail when apply an answer that doesn't have 10755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// crypto enabled. 10765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetRemoteNonCryptoAnswer) { 10777bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 10785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = NULL; 10795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = NULL; 10805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer); 10815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 10825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the offer. 10835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 10845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError(kSdpWithoutCrypto, answer); 10855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 10865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we can create and set an offer with a DTLS fingerprint. 10885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateSetDtlsOffer) { 10895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 10905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitWithDtls(); 10915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 10927bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 10935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 10945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyFingerprintStatus(offer->description(), true); 10955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription will take the ownership of the offer. 10965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 10975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 10985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 10995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we can process an offer with a DTLS fingerprint 11005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// and that we return an answer with a fingerprint. 11015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, ReceiveDtlsOfferCreateAnswer) { 11025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 11035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitWithDtls(); 11045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetFactoryDtlsSrtp(); 11055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 11065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 11075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* offer = CreateRemoteOffer(options); 11085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 11095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyFingerprintStatus(offer->description(), true); 11105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription will take the ownership of the offer. 11125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 11135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify that we get a crypto fingerprint in the answer. 11157bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 11165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer != NULL); 11175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyFingerprintStatus(answer->description(), true); 11185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check that we don't have an a=crypto line in the answer. 11195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyNoCryptoParams(answer->description(), true); 11205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Now set the local description, which should work, even without a=crypto. 11225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 11235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that even if we support DTLS, if the other side didn't offer a 11265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// fingerprint, we don't either. 11275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, ReceiveNoDtlsOfferCreateAnswer) { 11285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 11295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InitWithDtls(); 11305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 11315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 11325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* offer = CreateRemoteOffer( 11335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options, cricket::SEC_REQUIRED); 11345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 11355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyFingerprintStatus(offer->description(), false); 11365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetRemoteDescription will take the ownership of 11385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the offer. 11395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 11405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify that we don't get a crypto fingerprint in the answer. 11427bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 11435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer != NULL); 11445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyFingerprintStatus(answer->description(), false); 11455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Now set the local description. 11475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 11485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalOfferTwice) { 11517bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 11525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 11535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription take ownership of offer. 11547bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 11555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 11565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription take ownership of offer. 11587bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer2 = CreateOffer(NULL); 11595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer2); 11605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteOfferTwice) { 11637bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 11645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 11655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription take ownership of offer. 11667bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 11675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 11685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11697bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer2 = CreateOffer(NULL); 11705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer2); 11715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAndRemoteOffer) { 11747bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 11755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 11767bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 11775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 11787bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer = CreateOffer(NULL); 11795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError( 11805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "Called with type in wrong state, type: offer state: STATE_SENTINITIATE", 11815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer); 11825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteAndLocalOffer) { 11857bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 11865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 11877bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 11885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 11897bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer = CreateOffer(NULL); 11905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectError( 11915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "Called with type in wrong state, type: " 11925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "offer state: STATE_RECEIVEDINITIATE", 11935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer); 11945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 11955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 11965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalPrAnswer) { 11977bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 11985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 11995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 12005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectState(offer, BaseSession::STATE_RECEIVEDINITIATE); 12015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* pranswer = static_cast<JsepSessionDescription*>( 12037bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 12045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pranswer->set_type(SessionDescriptionInterface::kPrAnswer); 12055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectState(pranswer, BaseSession::STATE_SENTPRACCEPT); 12065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* pranswer2 = static_cast<JsepSessionDescription*>( 12097bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 12105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pranswer2->set_type(SessionDescriptionInterface::kPrAnswer); 12115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectState(pranswer2, BaseSession::STATE_SENTPRACCEPT); 12135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 12157bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 12165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectState(answer, BaseSession::STATE_SENTACCEPT); 12175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 12185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemotePrAnswer) { 12207bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 12215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 12227bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 12235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectState(offer, BaseSession::STATE_SENTINITIATE); 12245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* pranswer = 12265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description()); 12275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pranswer->set_type(SessionDescriptionInterface::kPrAnswer); 12285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectState(pranswer, 12305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BaseSession::STATE_RECEIVEDPRACCEPT); 12315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* pranswer2 = 12345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description()); 12355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pranswer2->set_type(SessionDescriptionInterface::kPrAnswer); 12365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectState(pranswer2, 12385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BaseSession::STATE_RECEIVEDPRACCEPT); 12395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 12415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 12425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description()); 12435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectState(answer, BaseSession::STATE_RECEIVEDACCEPT); 12445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 12455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAnswerWithoutOffer) { 12477bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 12485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 12495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 12507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 12515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 12525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(offer.get()); 12535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectError( 12545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "Called with type in wrong state, type: answer state: STATE_INIT", 12555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer); 12565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 12575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithoutOffer) { 12597bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 12605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendNothing(); 12615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 12627bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 12635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 12645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(offer.get()); 12655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError( 12665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "Called with type in wrong state, type: answer state: STATE_INIT", 12675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer); 12685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 12695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { 12717bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 12725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate; 12755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate.set_component(1); 12765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate); 12775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Fail since we have not set a offer description. 12795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1)); 12805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12817bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 12825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 12835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Candidate should be allowed to add before remote description. 12845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); 12855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate.set_component(2); 12865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate); 12875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 12885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer( 12905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->local_description()); 12915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 12925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 12935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verifying the candidates are copied properly from internal vector. 12945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* remote_desc = 12955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->remote_description(); 12965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(remote_desc != NULL); 12975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 12985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const IceCandidateCollection* candidates = 12995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_desc->candidates(kMediaContentIndex0); 13005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, candidates->count()); 13015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 13025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentName0, candidates->at(0)->sdp_mid()); 13035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, candidates->at(0)->candidate().component()); 13045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, candidates->at(1)->candidate().component()); 13055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate.set_component(2); 13075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate3(kMediaContentName0, 0, candidate); 13085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate3)); 13095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(3u, candidates->count()); 13105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate); 13125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate)); 13135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 13145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that a remote candidate is added to the remote session description and 13165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// that it is retained if the remote session description is changed. 13175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) { 13187bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 13195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate1; 13205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1.set_component(1); 13215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, 13225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1); 13235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 13245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 13255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); 13275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* remote_desc = 13285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->remote_description(); 13295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(remote_desc != NULL); 13305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 13315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const IceCandidateCollection* candidates = 13325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_desc->candidates(kMediaContentIndex0); 13335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, candidates->count()); 13345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 13355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Update the RemoteSessionDescription with a new session description and 13375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // a candidate and check that the new remote session description contains both 13385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // candidates. 13395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 13405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate2; 13415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, 13425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate2); 13435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate2)); 13445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 13455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_desc = session_->remote_description(); 13475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(remote_desc != NULL); 13485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 13495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates = remote_desc->candidates(kMediaContentIndex0); 13505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, candidates->count()); 13515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 13525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Username and password have be updated with the TransportInfo of the 13535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SessionDescription, won't be equal to the original one. 13545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate2.set_username(candidates->at(0)->candidate().username()); 13555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate2.set_password(candidates->at(0)->candidate().password()); 13565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate2.IsEquivalent(candidates->at(0)->candidate())); 13575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(1)->sdp_mline_index()); 13585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // No need to verify the username and password. 13595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1.set_username(candidates->at(1)->candidate().username()); 13605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1.set_password(candidates->at(1)->candidate().password()); 13615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate1.IsEquivalent(candidates->at(1)->candidate())); 13625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test that the candidate is ignored if we can add the same candidate again. 13645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 13655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 13665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that local candidates are added to the local session description and 13685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// that they are retained if the local session description is changed. 13695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestLocalCandidatesAddedToSessionDescription) { 13705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 13717bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 13725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 13735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 13745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* local_desc = session_->local_description(); 13765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const IceCandidateCollection* candidates = 13775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org local_desc->candidates(kMediaContentIndex0); 13785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(candidates != NULL); 13795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, candidates->count()); 13805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 13825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org local_desc = session_->local_description(); 13845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates = local_desc->candidates(kMediaContentIndex0); 13855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(candidates != NULL); 13865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, candidates->count()); 13875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates = local_desc->candidates(1); 13885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(candidates != NULL); 13895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, candidates->count()); 13905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Update the session descriptions. 13925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 13935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 13945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 13955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org local_desc = session_->local_description(); 13965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates = local_desc->candidates(kMediaContentIndex0); 13975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(candidates != NULL); 13985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, candidates->count()); 13995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates = local_desc->candidates(1); 14005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(candidates != NULL); 14015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, candidates->count()); 14025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 14035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we can set a remote session description with remote candidates. 14055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) { 14067bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 14075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate1; 14095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1.set_component(1); 14105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, 14115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1); 14125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 14137bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 14145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); 14165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 14175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SessionDescriptionInterface* remote_desc = 14195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->remote_description(); 14205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(remote_desc != NULL); 14215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 14225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const IceCandidateCollection* candidates = 14235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_desc->candidates(kMediaContentIndex0); 14245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, candidates->count()); 14255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 14265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14277bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 14285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 14295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 14305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that offers and answers contains ice candidates when Ice candidates have 14325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// been gathered. 14335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAndRemoteDescriptionWithCandidates) { 14345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr1); 14357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 14365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 14375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Ice is started but candidates are not provided until SetLocalDescription 14385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // is called. 14395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, observer_.mline_0_candidates_.size()); 14405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, observer_.mline_1_candidates_.size()); 14415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 14425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Wait until at least one local candidate has been collected. 14435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(0u < observer_.mline_0_candidates_.size(), 14445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 14455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(0u < observer_.mline_1_candidates_.size(), 14465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceCandidatesTimeout); 14475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> local_offer( 14497bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 14505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(local_offer->candidates(kMediaContentIndex0) != NULL); 14515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex0)->count()); 14525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(local_offer->candidates(kMediaContentIndex1) != NULL); 14535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex1)->count()); 14545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* remote_offer(CreateRemoteOffer()); 14565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(remote_offer); 14577bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 14585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer->candidates(kMediaContentIndex0) != NULL); 14595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, answer->candidates(kMediaContentIndex0)->count()); 14605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(answer->candidates(kMediaContentIndex1) != NULL); 14615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_LT(0u, answer->candidates(kMediaContentIndex1)->count()); 14625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 14635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 14645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Verifies TransportProxy and media channels are created with content names 14665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// present in the SessionDescription. 14675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestChannelCreationsWithContentNames) { 14687bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 14695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 14705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 14717bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 14725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // CreateOffer creates session description with the content names "audio" and 14745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // "video". Goal is to modify these content names and verify transport channel 14755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // proxy in the BaseSession, as proxies are created with the content names 14765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // present in SDP. 14775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 14785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 14795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kAudioMid = "a=mid:audio"; 14805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kAudioMidReplaceStr = "a=mid:audio_content_name"; 14815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kVideoMid = "a=mid:video"; 14825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kVideoMidReplaceStr = "a=mid:video_content_name"; 14835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Replacing |audio| with |audio_content_name|. 14855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(kAudioMid.c_str(), kAudioMid.length(), 14865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kAudioMidReplaceStr.c_str(), 14875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kAudioMidReplaceStr.length(), 14885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 14895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Replacing |video| with |video_content_name|. 14905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(kVideoMid.c_str(), kVideoMid.length(), 14915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kVideoMidReplaceStr.c_str(), 14925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kVideoMidReplaceStr.length(), 14935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 14945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* modified_offer = 14965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 14975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 14985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(modified_offer); 14995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 15017bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL); 15025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 15035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("audio_content_name") != NULL); 15055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("video_content_name") != NULL); 15065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((video_channel_ = media_engine_->GetVideoChannel(0)) != NULL); 15075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((voice_channel_ = media_engine_->GetVoiceChannel(0)) != NULL); 15085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 15095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an offer contains the correct media content descriptions based on 15115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// the send streams when no constraints have been set. 15125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutConstraintsOrStreams) { 15137bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 15145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 15157bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 15165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 15175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 15185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 15195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content == NULL); 15225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 15235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an offer contains the correct media content descriptions based on 15255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// the send streams when no constraints have been set. 15265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutConstraints) { 15277bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 15285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test Audio only offer. 15295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 15305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 15317bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 15325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 15335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 15345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content == NULL); 15375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test Audio / Video offer. 15395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 15407bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org offer.reset(CreateOffer(NULL)); 15415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstAudioContent(offer->description()); 15425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 15465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an offer contains no media content descriptions if 15485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// kOfferToReceiveVideo and kOfferToReceiveAudio constraints are set to false. 15495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithConstraintsWithoutStreams) { 15507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 15515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints_no_receive; 15525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveAudio(false); 15535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveVideo(false); 15545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 15567bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(&constraints_no_receive)); 15575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(offer != NULL); 15585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 15595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 15605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content == NULL); 15615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content == NULL); 15635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 15645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an offer contains only audio media content descriptions if 15665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// kOfferToReceiveAudio constraints are set to true. 15675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAudioOnlyOfferWithConstraints) { 15687bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 15695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints_audio_only; 15705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_audio_only.SetMandatoryReceiveAudio(true); 15715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 15727bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(&constraints_audio_only)); 15735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 15755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 15765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content == NULL); 15795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 15805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an offer contains audio and video media content descriptions if 15825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// kOfferToReceiveAudio and kOfferToReceiveVideo constraints are set to true. 15835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithConstraints) { 15847bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 15855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test Audio / Video offer. 15865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints_audio_video; 15875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_audio_video.SetMandatoryReceiveAudio(true); 15885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_audio_video.SetMandatoryReceiveVideo(true); 15895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 15907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(&constraints_audio_video)); 15915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 15925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 15935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 15965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 15975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 15985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(perkj): Should the direction be set to SEND_ONLY if 15995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The constraints is set to not receive audio or video but a track is added? 16005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 16015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer can not be created if the last remote description is not 16035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// an offer. 16045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutAnOffer) { 16057bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 16067bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 16075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 16085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 16095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 16107bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(CreateAnswer(NULL) == NULL); 16115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 16125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer contains the correct media content descriptions when no 16145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// constraints have been set. 16155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraintsOrStreams) { 16167bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 16175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio and video content. 16185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 16195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 16205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 16217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 16225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 16235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 16245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 16265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 16285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 16305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 16315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer contains the correct media content descriptions when no 16335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// constraints have been set and the offer only contain audio. 16345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAudioAnswerWithoutConstraintsOrStreams) { 16357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 16365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio only. 16375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 16385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_audio = true; 16395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = false; 16405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer( 16415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteOffer(options)); 16425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(cricket::GetFirstVideoContent(offer->description()) == NULL); 16435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(cricket::GetFirstAudioContent(offer->description()) != NULL); 16445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 16465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 16477bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 16485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 16495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 16505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 16525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(cricket::GetFirstVideoContent(answer->description()) == NULL); 16545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 16555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer contains the correct media content descriptions when no 16575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// constraints have been set. 16585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraints) { 16597bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 16605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio and video content. 16615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 16625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 16635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test with a stream with tracks. 16645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 16655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 16667bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 16675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 16685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 16695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 16715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 16735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 16755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 16765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer contains the correct media content descriptions when 16785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// constraints have been set but no stream is sent. 16795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithConstraintsWithoutStreams) { 16807bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 16815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio and video content. 16825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 16835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 16845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints_no_receive; 16865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveAudio(false); 16875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveVideo(false); 16885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 16907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(&constraints_no_receive)); 16915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 16925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 16935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content->rejected); 16955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 16965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 16975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 16985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content->rejected); 16995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 17005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that an answer contains the correct media content descriptions when 17025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// constraints have been set and streams are sent. 17035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithConstraints) { 17047bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 17055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio and video content. 17065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 17075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 17085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints_no_receive; 17105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveAudio(false); 17115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_no_receive.SetMandatoryReceiveVideo(false); 17125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test with a stream with tracks. 17145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 17155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 17167bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(&constraints_no_receive)); 17175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(perkj): Should the direction be set to SEND_ONLY? 17195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 17205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 17215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 17225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 17235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(perkj): Should the direction be set to SEND_ONLY? 17255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 17265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 17275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(content->rejected); 17285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 17295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutCNCodecs) { 17315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddCNCodecs(); 17327bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 17335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints; 17345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints.SetOptionalVAD(false); 17355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 17367bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(&constraints)); 17375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 17385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(offer->description()); 17395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(content != NULL); 17405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyNoCNCodecs(content)); 17415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 17425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutCNCodecs) { 17445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddCNCodecs(); 17457bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 17465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a remote offer with audio and video content. 17475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 17485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 17495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::FakeConstraints constraints; 17515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints.SetOptionalVAD(false); 17525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 17537bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(&constraints)); 17545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const cricket::ContentInfo* content = 17555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::GetFirstAudioContent(answer->description()); 17565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(content != NULL); 17575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyNoCNCodecs(content)); 17585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 17595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the call setup when remote answer with audio only and 17615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// later updates with video. 17625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestAVOfferWithAudioOnlyAnswer) { 17637bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 17645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL); 17655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL); 17665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 17687bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 17695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 17715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = false; 17725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer, options); 17735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 17755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // and answer; 17765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 17775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 17785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 17805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 17815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video_channel_ == NULL); 17835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(0u, voice_channel_->recv_streams().size()); 17855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 17865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack1, voice_channel_->send_streams()[0].id); 17875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Let the remote end update the session descriptions, with Audio and Video. 17895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 17905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 17915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 17935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 17945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 17965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 17975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 17985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 17995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 18005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id); 18015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id); 18025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 18035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 18045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 18055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 18065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Change session back to audio only. 18085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 18095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, video_channel_->recv_streams().size()); 18125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 18135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 18145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 18155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 18165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 18175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the call setup when remote answer with video only and 18195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// later updates with audio. 18205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestAVOfferWithVideoOnlyAnswer) { 18217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 18225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL); 18235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL); 18245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18257bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 18265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 18285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_audio = false; 18295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 18305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer( 18315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer, options, cricket::SEC_ENABLED); 18325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 18345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // and answer. 18355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 18365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 18375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 18395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 18405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(voice_channel_ == NULL); 18425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 18435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0u, video_channel_->recv_streams().size()); 18455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 18465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kVideoTrack1, video_channel_->send_streams()[0].id); 18475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Update the session descriptions, with Audio and Video. 18495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 18505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 18535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 18545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 18565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 18575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 18585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 18595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Change session back to video only. 18615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.UseOptionsVideoOnly(); 18625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 18655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 18665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 18685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id); 18695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 18705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id); 18715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 18725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { 18747bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 18755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org scoped_ptr<SessionDescriptionInterface> offer( 18777bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 18785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyCryptoParams(offer->description()); 18795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 18807bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 18815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyCryptoParams(answer->description()); 18825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 18835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { 18857bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 18865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->set_secure_policy(cricket::SEC_DISABLED); 18875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org scoped_ptr<SessionDescriptionInterface> offer( 18897bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 18905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyNoCryptoParams(offer->description(), false); 18915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 18925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) { 18947bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 18955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyAnswerFromNonCryptoOffer(); 18965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 18975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 18985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, VerifyAnswerFromCryptoOffer) { 18997bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 19005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyAnswerFromCryptoOffer(); 19015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 19025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, VerifyBundleFlagInPA) { 19045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This test verifies BUNDLE flag in PortAllocator, if BUNDLE information in 19055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // local description is removed by the application, BUNDLE flag should be 19065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // disabled in PortAllocator. By default BUNDLE is enabled in the WebRtc. 19077bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 19085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & allocator_.flags()) == 19095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 19105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 19117bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 19125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SessionDescription* offer_copy = 19135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer->description()->Copy(); 19145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); 19155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* modified_offer = 19165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 19175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org modified_offer->Initialize(offer_copy, "1", "1"); 19185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(modified_offer); 19205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(allocator_.flags() & cricket::PORTALLOCATOR_ENABLE_BUNDLE); 19215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 19225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestDisabledBundleInAnswer) { 19247bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 19255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 19265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & allocator_.flags()) == 19275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 19285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FakeConstraints constraints; 19295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints.SetMandatoryUseRtpMux(true); 19307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(&constraints); 19315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 19325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 19335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 19345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description())); 19355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 19365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); 19375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription* modified_answer = 19385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 19395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org modified_answer->Initialize(answer_copy, "1", "1"); 19405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(modified_answer); 19415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & allocator_.flags()) == 19425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 19435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 19455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 19465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 19485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 19495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 19515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 19525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 19535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 19545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 19555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 19565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 19575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 19585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1959c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org// This test verifies that SetLocalDescription and SetRemoteDescription fails 1960c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org// if BUNDLE is enabled but rtcp-mux is disabled in m-lines. 1961c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestDisabledRtcpMuxWithBundleEnabled) { 19627bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org WebRtcSessionTest::Init(NULL); 1963c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 1964c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & allocator_.flags()) == 1965c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 1966c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org FakeConstraints constraints; 1967c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org constraints.SetMandatoryUseRtpMux(true); 19687bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(&constraints); 1969c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org std::string offer_str; 1970c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org offer->ToString(&offer_str); 1971c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org // Disable rtcp-mux 1972c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org const std::string rtcp_mux = "rtcp-mux"; 1973c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org const std::string xrtcp_mux = "xrtcp-mux"; 1974c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org talk_base::replace_substrs(rtcp_mux.c_str(), rtcp_mux.length(), 1975c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org xrtcp_mux.c_str(), xrtcp_mux.length(), 1976c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org &offer_str); 1977c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org JsepSessionDescription *local_offer = 1978c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 1979c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); 1980c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org SetLocalDescriptionExpectError(kBundleWithoutRtcpMux, local_offer); 1981c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org JsepSessionDescription *remote_offer = 1982c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 1983c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); 1984c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org SetRemoteDescriptionExpectError(kBundleWithoutRtcpMux, remote_offer); 1985c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org // Trying unmodified SDP. 1986c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1987c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org} 1988c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org 19895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetAudioPlayout) { 19907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 19915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 19925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 19935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 19945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(channel != NULL); 19955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, channel->recv_streams().size()); 19965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 receive_ssrc = channel->recv_streams()[0].first_ssrc(); 19975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org double left_vol, right_vol; 19985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 19995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, left_vol); 20005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, right_vol); 2001c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org talk_base::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer()); 2002c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org session_->SetAudioPlayout(receive_ssrc, false, renderer.get()); 20035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 20045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, left_vol); 20055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, right_vol); 2006c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_EQ(0, renderer->channel_id()); 2007c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org session_->SetAudioPlayout(receive_ssrc, true, NULL); 20085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 20095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, left_vol); 20105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, right_vol); 2011c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_EQ(-1, renderer->channel_id()); 20125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetAudioSend) { 20157bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 20165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 20175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 20185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 20195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(channel != NULL); 20205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, channel->send_streams().size()); 20215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 20225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 20235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::AudioOptions options; 20255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.echo_cancellation.Set(true); 20265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2027c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org talk_base::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer()); 2028c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org session_->SetAudioSend(send_ssrc, false, options, renderer.get()); 20295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->IsStreamMuted(send_ssrc)); 20305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(channel->options().echo_cancellation.IsSet()); 2031c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_EQ(0, renderer->channel_id()); 20325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2033c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org session_->SetAudioSend(send_ssrc, true, options, NULL); 20345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 20355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool value; 20365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->options().echo_cancellation.Get(&value)); 20375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(value); 2038c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org EXPECT_EQ(-1, renderer->channel_id()); 20395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetVideoPlayout) { 20427bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 20435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 20445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 20455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoMediaChannel* channel = media_engine_->GetVideoChannel(0); 20465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(channel != NULL); 20475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_LT(0u, channel->renderers().size()); 20485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == NULL); 20495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, channel->recv_streams().size()); 20505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 receive_ssrc = channel->recv_streams()[0].first_ssrc(); 20515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoRenderer renderer; 20525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->SetVideoPlayout(receive_ssrc, true, &renderer); 20535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == &renderer); 20545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->SetVideoPlayout(receive_ssrc, false, &renderer); 20555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == NULL); 20565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, SetVideoSend) { 20597bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 20605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 20615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 20625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoMediaChannel* channel = media_engine_->GetVideoChannel(0); 20635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(channel != NULL); 20645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, channel->send_streams().size()); 20655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 20665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 20675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::VideoOptions* options = NULL; 20685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->SetVideoSend(send_ssrc, false, options); 20695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(channel->IsStreamMuted(send_ssrc)); 20705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->SetVideoSend(send_ssrc, true, options); 20715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 20725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CanNotInsertDtmf) { 20755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestCanInsertDtmf(false); 20765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, CanInsertDtmf) { 20795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestCanInsertDtmf(true); 20805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 20815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, InsertDtmf) { 20835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Setup 20847bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 20855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 20865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 20875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 20885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0U, channel->dtmf_info_queue().size()); 20895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Insert DTMF 20915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const int expected_flags = DF_SEND; 20925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const int expected_duration = 90; 20935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->InsertDtmf(kAudioTrack1, 0, expected_duration); 20945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->InsertDtmf(kAudioTrack1, 1, expected_duration); 20955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->InsertDtmf(kAudioTrack1, 2, expected_duration); 20965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 20975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify 20985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(3U, channel->dtmf_info_queue().size()); 20995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 21005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[0], send_ssrc, 0, 21015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org expected_duration, expected_flags)); 21025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[1], send_ssrc, 1, 21035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org expected_duration, expected_flags)); 21045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[2], send_ssrc, 2, 21055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org expected_duration, expected_flags)); 21065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the |initiator| flag when session initiates the call. 21095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorFlagAsOriginator) { 21107bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->initiator()); 21127bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 21135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 21145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 21155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->initiator()); 21165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 21175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->initiator()); 21185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the |initiator| flag when session receives the call. 21215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorFlagAsReceiver) { 21227bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->initiator()); 21245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 21255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 21267bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 21275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->initiator()); 21295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 21305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->initiator()); 21315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the ice protocol type at initiator of the call 21345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// if |a=ice-options:google-ice| is present in answer. 21355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorGIceInAnswer) { 21367bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21387bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 21395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 21407bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteAnswer(offer)); 21415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 21425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 21435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 21445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Adding ice-options to the session level. 21455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InjectAfter("t=0 0\r\n", 21465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "a=ice-options:google-ice\r\n", 21475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 21485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer_with_gice = 21495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 21505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer_with_gice); 21515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_GOOGLE); 21525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_GOOGLE); 21535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the ice protocol type at initiator of the call 21565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// if ICE RFC5245 is supported in answer. 21575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorIceInAnswer) { 21587bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21607bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 21615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 21625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 21635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer); 21655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_RFC5245); 21665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_RFC5245); 21675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the ice protocol type at receiver side of the call if 21705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// receiver decides to use google-ice. 21715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiverGIceInOffer) { 21727bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21747bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 21755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 21765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 21777bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 21785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 21795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 21805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Adding ice-options to the session level. 21815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InjectAfter("t=0 0\r\n", 21825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "a=ice-options:google-ice\r\n", 21835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 21845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer_with_gice = 21855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 21865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer_with_gice); 21875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_GOOGLE); 21885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_GOOGLE); 21895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 21905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 21915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the ice protocol type at receiver side of the call if 21925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// receiver decides to use ice RFC 5245. 21935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiverIceInOffer) { 21947bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 21955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21967bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 21975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 21987bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 21995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 22005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_RFC5245); 22015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_RFC5245); 22025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 22035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the session state when ICE RFC5245 in offer and 22055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// ICE google-ice in answer. 22065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestIceOfferGIceOnlyAnswer) { 22077bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 22085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 22095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 22107bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 22115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string offer_str; 22125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer->ToString(&offer_str); 22135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Disable google-ice 22145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string gice_option = "google-ice"; 22155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string xgoogle_xice = "xgoogle-xice"; 22165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(gice_option.c_str(), gice_option.length(), 22175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xgoogle_xice.c_str(), xgoogle_xice.length(), 22185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &offer_str); 22195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepSessionDescription *ice_only_offer = 22205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 22215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE((ice_only_offer)->Initialize(offer_str, NULL)); 22225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(ice_only_offer); 22235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string original_offer_sdp; 22245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->ToString(&original_offer_sdp)); 2225b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SessionDescriptionInterface* pranswer_with_gice = 22265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kPrAnswer, 2227b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org original_offer_sdp, NULL); 22285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError(kPushDownPranswerTDFailed, 2229b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org pranswer_with_gice); 2230b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SessionDescriptionInterface* answer_with_gice = 22315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, 2232b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org original_offer_sdp, NULL); 22335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError(kPushDownAnswerTDFailed, 2234b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org answer_with_gice); 22355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 22365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Verifing local offer and remote answer have matching m-lines as per RFC 3264. 22385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestIncorrectMLinesInRemoteAnswer) { 22397bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 22405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 22417bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 22425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 22435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 22445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(session_->local_description())); 22455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 22475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer_copy->RemoveContentByName("video"); 2248b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org JsepSessionDescription* modified_answer = 2249b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 22505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(modified_answer->Initialize(answer_copy, 22525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer->session_id(), 22535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer->session_version())); 2254b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SetRemoteDescriptionExpectError(kMlineMismatch, modified_answer); 22555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Modifying content names. 22575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string sdp; 22585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 22595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kAudioMid = "a=mid:audio"; 22605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string kAudioMidReplaceStr = "a=mid:audio_content_name"; 22615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Replacing |audio| with |audio_content_name|. 22635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::replace_substrs(kAudioMid.c_str(), kAudioMid.length(), 22645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kAudioMidReplaceStr.c_str(), 22655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kAudioMidReplaceStr.length(), 22665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &sdp); 22675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2268b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SessionDescriptionInterface* modified_answer1 = 2269b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 2270b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SetRemoteDescriptionExpectError(kMlineMismatch, modified_answer1); 22715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(answer.release()); 22735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 22745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Verifying remote offer and local answer have matching m-lines as per 22765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// RFC 3264. 22775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestIncorrectMLinesInLocalAnswer) { 22787bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 22795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 22805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 22815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 22827bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 22835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 22855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer_copy->RemoveContentByName("video"); 2286b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org JsepSessionDescription* modified_answer = 2287b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 22885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(modified_answer->Initialize(answer_copy, 22905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer->session_id(), 22915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org answer->session_version())); 2292b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SetLocalDescriptionExpectError(kMlineMismatch, modified_answer); 22935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 22945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 22955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 22965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies that WebRtcSession does not start candidate allocation 22975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// before SetLocalDescription is called. 22985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestIceStartAfterSetLocalDescriptionOnly) { 22997bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 23005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 23025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate; 23035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate.set_component(1); 23045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, 23055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate); 23065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); 23075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::Candidate candidate1; 23085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1.set_component(1); 23095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1, 23105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate1); 23115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate1)); 23125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer); 23135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(session_->GetTransportProxy("audio") != NULL); 23145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_TRUE(session_->GetTransportProxy("video") != NULL); 23155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Pump for 1 second and verify that no candidates are generated. 23175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread::Current()->ProcessMessages(1000); 23185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(observer_.mline_0_candidates_.empty()); 23195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(observer_.mline_1_candidates_.empty()); 23205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23217bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 23225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer); 23235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("audio")->negotiated()); 23245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("video")->negotiated()); 23255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 23265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 23275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies that crypto parameter is updated in local session 23295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// description as per security policy set in MediaSessionDescriptionFactory. 23305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) { 23317bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 23325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 23347bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 23355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Making sure SetLocalDescription correctly sets crypto value in 23375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SessionDescription object after de-serialization of sdp string. The value 23385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will be set as per MediaSessionDescriptionFactory. 23395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string offer_str; 23405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer->ToString(&offer_str); 23415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* jsep_offer_str = 23425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); 23435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(jsep_offer_str); 23445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->voice_channel()->secure_required()); 23455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(session_->video_channel()->secure_required()); 23465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 23475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies the crypto parameter when security is disabled. 23495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescriptionWithDisabled) { 23507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 23515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->set_secure_policy(cricket::SEC_DISABLED); 23535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer( 23547bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateOffer(NULL)); 23555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Making sure SetLocalDescription correctly sets crypto value in 23575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // SessionDescription object after de-serialization of sdp string. The value 23585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will be set as per MediaSessionDescriptionFactory. 23595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string offer_str; 23605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org offer->ToString(&offer_str); 23615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface *jsep_offer_str = 23625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); 23635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(jsep_offer_str); 23645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->voice_channel()->secure_required()); 23655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(session_->video_channel()->secure_required()); 23665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 23675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies that an answer contains new ufrag and password if an offer 23695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// with new ufrag and password is received. 23705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) { 23717bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 23725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 23735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_audio = true; 23745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 23755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer( 23765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteOffer(options)); 23775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 23785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 23817bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 23825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(answer.release()); 23835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Receive an offer with new ufrag and password. 23855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.transport_options.ice_restart = true; 23865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> updated_offer1( 23877bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteOffer(options, session_->remote_description())); 23885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(updated_offer1.release()); 23895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> updated_answer1( 23917bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 23925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CompareIceUfragAndPassword(updated_answer1->description(), 23945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->local_description()->description(), 23955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org false); 23965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 23975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(updated_answer1.release()); 23987bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 23997bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 24007bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// This test verifies that an answer contains old ufrag and password if an offer 24017bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// with old ufrag and password is received. 24027bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { 24037bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 24047bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org cricket::MediaSessionOptions options; 24057bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org options.has_audio = true; 24067bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org options.has_video = true; 24077bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> offer( 24087bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteOffer(options)); 24097bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 24107bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 24117bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 24127bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer( 24137bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 24147bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SetLocalDescriptionWithoutError(answer.release()); 24155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24167bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org // Receive an offer without changed ufrag or password. 24175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.transport_options.ice_restart = false; 24185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<JsepSessionDescription> updated_offer2( 24197bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteOffer(options, session_->remote_description())); 24205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionWithoutError(updated_offer2.release()); 24215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> updated_answer2( 24237bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateAnswer(NULL)); 24245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CompareIceUfragAndPassword(updated_answer2->description(), 24265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->local_description()->description(), 24275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org true); 24285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(updated_answer2.release()); 24305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionContentError) { 24337bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 24345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 24357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SessionDescriptionInterface* offer = CreateOffer(NULL); 24365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_id_orig = offer->session_id(); 24375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string session_version_orig = offer->session_version(); 24385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithoutError(offer); 24395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 24415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_channel_->set_fail_set_send_codecs(true); 24425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 2444b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SessionDescriptionInterface* answer = 2445b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org CreateRemoteAnswer(session_->local_description()); 2446b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org SetRemoteDescriptionExpectError("ERROR_CONTENT", answer); 24475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Runs the loopback call test with BUNDLE and STUN disabled. 24505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestIceStatesBasic) { 24515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Lets try with only UDP ports. 24525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_.set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 24535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_TCP | 24545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_STUN | 24555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY); 24565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestLoopbackCall(); 24575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Regression-test for a crash which should have been an error. 24605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestNoStateTransitionPendingError) { 24617bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 24625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::MediaSessionOptions options; 24635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_audio = true; 24645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org options.has_video = true; 24655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->SetError(cricket::BaseSession::ERROR_CONTENT); 24675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(options); 24685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionDescriptionInterface* answer = 24695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateRemoteAnswer(offer, options); 24705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetRemoteDescriptionExpectError(kSessionError, offer); 24715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionExpectError(kSessionError, answer); 24725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Not crashing is our success. 24735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestRtpDataChannel) { 24765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_.reset(new FakeConstraints()); 24775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 24785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableRtpDataChannels, true); 24797bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 24805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithDataChannel(); 24825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); 24835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { 24865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 24875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_.reset(new FakeConstraints()); 24895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 24905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableRtpDataChannels, true); 24915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 24925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); 24935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 24945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, true); 24957bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 24965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 24975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithDataChannel(); 24985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); 24995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 25005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { 25025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_.reset(new FakeConstraints()); 25035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 25045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); 25057bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 25065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithDataChannel(); 25085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); 25095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 25105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(WebRtcSessionTest, TestSctpDataChannelWithDtls) { 25125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_.reset(new FakeConstraints()); 25155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 25165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); 25175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org constraints_->AddOptional( 25185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, true); 25197bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org Init(NULL); 25205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetLocalDescriptionWithDataChannel(); 25225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); 25235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 25247bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25257bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateOffer succeeds when CreateOffer is called before async 25267bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// identity generation is finished. 25277bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferBeforeIdentityRequestReturnSuccess) { 25287bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25297bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org InitWithAsyncDtls(false); 25307bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25317bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(session_->waiting_for_identity()); 25327bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer(NULL)); 25337bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(offer != NULL); 25347bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25357bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25367bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateAnswer succeeds when CreateOffer is called before async 25377bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// identity generation is finished. 25387bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerBeforeIdentityRequestReturnSuccess) { 25397bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25407bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org InitWithAsyncDtls(false); 25417bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25427bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org cricket::MediaSessionOptions options; 25437bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org scoped_ptr<JsepSessionDescription> offer( 25447bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org CreateRemoteOffer(options, cricket::SEC_REQUIRED)); 25457bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org ASSERT_TRUE(offer.get() != NULL); 25467bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 25477bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25487bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 25497bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(answer != NULL); 25507bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25517bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25527bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateOffer succeeds when CreateOffer is called after async 25537bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// identity generation is finished. 25547bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnSuccess) { 25557bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25567bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org InitWithAsyncDtls(false); 25577bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25587bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE_WAIT(!session_->waiting_for_identity(), 1000); 25597bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer(NULL)); 25607bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(offer != NULL); 25617bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25627bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25637bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateOffer fails when CreateOffer is called after async 25647bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// identity generation fails. 25657bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnFailure) { 25667bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25677bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org InitWithAsyncDtls(true); 25687bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25697bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE_WAIT(!session_->waiting_for_identity(), 1000); 25707bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org talk_base::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer(NULL)); 25717bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org EXPECT_TRUE(offer == NULL); 25727bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25737bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25747bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateOffer succeeds when Multiple CreateOffer calls are made 25757bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// before async identity generation is finished. 25767bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, 25777bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org TestMultipleCreateOfferBeforeIdentityRequestReturnSuccess) { 25787bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25797bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org VerifyMultipleAsyncCreateDescription( 25807bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org true, CreateSessionDescriptionRequest::kOffer); 25817bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25827bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25837bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateOffer fails when Multiple CreateOffer calls are made 25847bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// before async identity generation fails. 25857bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, 25867bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org TestMultipleCreateOfferBeforeIdentityRequestReturnFailure) { 25877bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25887bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org VerifyMultipleAsyncCreateDescription( 25897bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org false, CreateSessionDescriptionRequest::kOffer); 25907bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 25917bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 25927bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateAnswer succeeds when Multiple CreateAnswer calls are made 25937bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// before async identity generation is finished. 25947bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, 25957bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org TestMultipleCreateAnswerBeforeIdentityRequestReturnSuccess) { 25967bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 25977bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org VerifyMultipleAsyncCreateDescription( 25987bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org true, CreateSessionDescriptionRequest::kAnswer); 25997bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 26007bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org 26017bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// Verifies that CreateAnswer fails when Multiple CreateAnswer calls are made 26027bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org// before async identity generation fails. 26037bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.orgTEST_F(WebRtcSessionTest, 26047bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org TestMultipleCreateAnswerBeforeIdentityRequestReturnFailure) { 26057bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); 26067bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org VerifyMultipleAsyncCreateDescription( 26077bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org false, CreateSessionDescriptionRequest::kAnswer); 26087bf94f9c4ab08aa82f78018d8ba363b5b60b05edwu@webrtc.org} 26095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 26105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// currently fails because upon disconnection and reconnection OnIceComplete is 26115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// called more than once without returning to IceGatheringGathering. 2612