10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/audiotrack.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/jsepicecandidate.h" 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/streamcollection.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 345aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org#include "talk/app/webrtc/test/fakedtlsidentityservice.h" 355aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org#include "talk/app/webrtc/test/fakemediastreamsignaling.h" 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/app/webrtc/videotrack.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/webrtcsession.h" 385aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org#include "talk/app/webrtc/webrtcsessiondescriptionfactory.h" 39cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/fakemediaengine.h" 40cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/fakevideorenderer.h" 41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/mediachannel.h" 42cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/stunserver.h" 44cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/teststunserver.h" 45cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/testturnserver.h" 46cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/client/basicportallocator.h" 47cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/session/media/channelmanager.h" 48cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/session/media/mediasession.h" 492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/fakenetwork.h" 502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/firewallsocketserver.h" 512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h" 532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/network.h" 542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/physicalsocketserver.h" 552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/ssladapter.h" 562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h" 572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringutils.h" 582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h" 592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/virtualsocketserver.h" 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!(feature())) { \ 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; \ 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::BaseSession; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::DF_PLAY; 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::DF_SEND; 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::FakeVoiceMediaChannel; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::NS_GINGLE_P2P; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::NS_JINGLE_ICE_UDP; 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::TransportInfo; 742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::SocketAddress; 752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_ptr; 762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::Thread; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::CreateSessionDescription; 785aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgusing webrtc::CreateSessionDescriptionObserver; 795aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgusing webrtc::CreateSessionDescriptionRequest; 805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgusing webrtc::DTLSIdentityRequestObserver; 815aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgusing webrtc::DTLSIdentityServiceInterface; 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::FakeConstraints; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::IceCandidateCollection; 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::JsepIceCandidate; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::JsepSessionDescription; 865c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgusing webrtc::PeerConnectionFactoryInterface; 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::PeerConnectionInterface; 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::StreamCollection; 905aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgusing webrtc::WebRtcSession; 913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::kBundleWithoutRtcpMux; 92f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgusing webrtc::kCreateChannelFailed; 93f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgusing webrtc::kInvalidSdp; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::kMlineMismatch; 95f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgusing webrtc::kPushDownTDFailed; 968841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.orgusing webrtc::kSdpWithoutIceUfragPwd; 97ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgusing webrtc::kSdpWithoutDtlsFingerprint; 98ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgusing webrtc::kSdpWithoutSdesCrypto; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::kSessionError; 100f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgusing webrtc::kSessionErrorDesc; 101b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.orgusing webrtc::kMaxUnsignalledRecvStreams; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1034fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgtypedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; 1044fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 1053db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const int kClientAddrPort = 0; 1063db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kClientAddrHost1[] = "11.11.11.11"; 1073db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kClientAddrHost2[] = "22.22.22.22"; 1083db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgstatic const char kStunAddrHost[] = "99.99.99.1"; 10941c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.orgstatic const SocketAddress kTurnUdpIntAddr("99.99.99.4", 3478); 11041c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.orgstatic const SocketAddress kTurnUdpExtAddr("99.99.99.6", 0); 1112ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.orgstatic const char kTurnUsername[] = "test"; 1122ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.orgstatic const char kTurnPassword[] = "test"; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSessionVersion[] = "1"; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Media index of candidates belonging to the first media content. 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kMediaContentIndex0 = 0; 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kMediaContentName0[] = "audio"; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Media index of candidates belonging to the second media content. 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kMediaContentIndex1 = 1; 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kMediaContentName1[] = "video"; 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kIceCandidatesTimeout = 10000; 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1265528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.orgstatic const char kFakeDtlsFingerprint[] = 1275528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org "BB:CD:72:F7:2F:D0:BA:43:F3:68:B1:0C:23:72:B6:4A:" 1285528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org "0F:DE:34:06:BC:E0:FE:01:BC:73:C8:6D:F4:65:D5:24"; 1295528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org 1303922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.orgstatic const char kTooLongIceUfragPwd[] = 1313922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag" 1323922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag" 1333922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag" 1343922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag"; 1353922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Add some extra |newlines| to the |message| after |line|. 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void InjectAfter(const std::string& line, 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& newlines, 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* message) { 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string tmp = line + newlines; 1412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(line.c_str(), line.length(), 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tmp.c_str(), tmp.length(), message); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MockIceObserver : public webrtc::IceObserver { 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockIceObserver() 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : oncandidatesready_(false), 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_gathering_state_(PeerConnectionInterface::kIceGatheringNew) { 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceConnectionChange( 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceConnectionState new_state) { 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_connection_state_ = new_state; 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceGatheringChange( 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceGatheringState new_state) { 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We can never transition back to "new". 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, new_state); 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_gathering_state_ = new_state; 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // oncandidatesready_ really means "ICE gathering is complete". 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This if statement ensures that this value remains correct when we 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // transition from kIceGatheringComplete to kIceGatheringGathering. 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (new_state == PeerConnectionInterface::kIceGatheringGathering) { 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org oncandidatesready_ = false; 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Found a new candidate. 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 1733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org switch (candidate->sdp_mline_index()) { 1743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org case kMediaContentIndex0: 1753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org mline_0_candidates_.push_back(candidate->candidate()); 1763db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org break; 1773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org case kMediaContentIndex1: 1783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org mline_1_candidates_.push_back(candidate->candidate()); 1793db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org break; 1803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org default: 1813db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org ASSERT(false); 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The ICE gathering state should always be Gathering when a candidate is 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // received (or possibly Completed in the case of the final candidate). 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_); 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnIceComplete() { 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(oncandidatesready_); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org oncandidatesready_ = true; 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // OnIceGatheringChange(IceGatheringCompleted) and OnIceComplete() should 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // be called approximately simultaneously. For ease of testing, this 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // check additionally requires that they be called in the above order. 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_gathering_state_); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool oncandidatesready_; 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::Candidate> mline_0_candidates_; 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::Candidate> mline_1_candidates_; 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceConnectionState ice_connection_state_; 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PeerConnectionInterface::IceGatheringState ice_gathering_state_; 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass WebRtcSessionForTest : public webrtc::WebRtcSession { 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WebRtcSessionForTest(cricket::ChannelManager* cmgr, 2112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread, 2122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread, 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PortAllocator* port_allocator, 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::IceObserver* ice_observer, 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaStreamSignaling* mediastream_signaling) 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : WebRtcSession(cmgr, signaling_thread, worker_thread, port_allocator, 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling) { 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RegisterIceObserver(ice_observer); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~WebRtcSessionForTest() {} 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using cricket::BaseSession::GetTransportProxy; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::WebRtcSession::SetAudioPlayout; 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::WebRtcSession::SetAudioSend; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::WebRtcSession::SetCaptureDevice; 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::WebRtcSession::SetVideoPlayout; 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::WebRtcSession::SetVideoSend; 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2305aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgclass WebRtcSessionCreateSDPObserverForTest 2312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : public rtc::RefCountedObject<CreateSessionDescriptionObserver> { 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 2335aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org enum State { 2345aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org kInit, 2355aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org kFailed, 2365aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org kSucceeded, 2375aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org }; 238e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org WebRtcSessionCreateSDPObserverForTest() : state_(kInit) {} 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2405aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // CreateSessionDescriptionObserver implementation. 2415aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org virtual void OnSuccess(SessionDescriptionInterface* desc) { 242e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org description_.reset(desc); 2435aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org state_ = kSucceeded; 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2455aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org virtual void OnFailure(const std::string& error) { 2465aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org state_ = kFailed; 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 249e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org SessionDescriptionInterface* description() { return description_.get(); } 250e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org 251e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org SessionDescriptionInterface* ReleaseDescription() { 252e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org return description_.release(); 253e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org } 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2555aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org State state() const { return state_; } 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2575aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org protected: 2585aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org ~WebRtcSessionCreateSDPObserverForTest() {} 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 2612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> description_; 2625aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org State state_; 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2657162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgclass FakeAudioRenderer : public cricket::AudioRenderer { 2667162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org public: 267e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org FakeAudioRenderer() : channel_id_(-1), sink_(NULL) {} 268e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org virtual ~FakeAudioRenderer() { 269e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org if (sink_) 270e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org sink_->OnClose(); 271e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org } 2727162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 2737162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org virtual void AddChannel(int channel_id) OVERRIDE { 2747162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org ASSERT(channel_id_ == -1); 2757162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org channel_id_ = channel_id; 2767162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org } 2777162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org virtual void RemoveChannel(int channel_id) OVERRIDE { 2787162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org ASSERT(channel_id == channel_id_); 2797162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org channel_id_ = -1; 2807162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org } 281e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org virtual void SetSink(Sink* sink) OVERRIDE { 282e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org sink_ = sink; 283e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org } 2847162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 2857162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int channel_id() const { return channel_id_; } 286e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org cricket::AudioRenderer::Sink* sink() const { return sink_; } 2877162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org private: 2887162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int channel_id_; 289e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org cricket::AudioRenderer::Sink* sink_; 2907162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org}; 2917162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass WebRtcSessionTest : public testing::Test { 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO Investigate why ChannelManager crashes, if it's created 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // after stun_server. 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WebRtcSessionTest() 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_engine_(new cricket::FakeDataEngine()), 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org device_manager_(new cricket::FakeDeviceManager()), 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_manager_(new cricket::ChannelManager( 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_engine_, data_engine_, device_manager_, 3022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org new cricket::CaptureManager(), rtc::Thread::Current())), 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tdesc_factory_(new cricket::TransportDescriptionFactory()), 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_(new cricket::MediaSessionDescriptionFactory( 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_manager_.get(), tdesc_factory_.get())), 3062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org pss_(new rtc::PhysicalSocketServer), 3072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org vss_(new rtc::VirtualSocketServer(pss_.get())), 3082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org fss_(new rtc::FirewallSocketServer(vss_.get())), 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ss_scope_(fss_.get()), 3102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org stun_socket_addr_(rtc::SocketAddress(kStunAddrHost, 3113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org cricket::STUN_SERVER_PORT)), 31241c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org stun_server_(Thread::Current(), stun_socket_addr_), 31341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org turn_server_(Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr), 31441c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org mediastream_signaling_(channel_manager_.get()), 31541c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org ice_type_(PeerConnectionInterface::kAll) { 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tdesc_factory_->set_protocol(cricket::ICEPROTO_HYBRID); 317459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org 318459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org cricket::ServerAddresses stun_servers; 319459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org stun_servers.insert(stun_socket_addr_); 320459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org allocator_.reset(new cricket::BasicPortAllocator( 321459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org &network_manager_, 322459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org stun_servers, 323459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org SocketAddress(), SocketAddress(), SocketAddress())); 32441c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY | 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_manager_->Init()); 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_->set_add_legacy_streams(false); 32941c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->set_step_delay(cricket::kMinimumStepDelay); 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3328841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org static void SetUpTestCase() { 3332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::InitializeSSL(); 3348841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 3358841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 3368841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org static void TearDownTestCase() { 3372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CleanupSSL(); 3388841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 3398841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddInterface(const SocketAddress& addr) { 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org network_manager_.AddInterface(addr); 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 34441c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org void SetIceTransportType(PeerConnectionInterface::IceTransportsType type) { 34541c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org ice_type_ = type; 34641c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org } 34741c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org 3485aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org void Init(DTLSIdentityServiceInterface* identity_service) { 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(session_.get() == NULL); 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_.reset(new WebRtcSessionForTest( 3512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org channel_manager_.get(), rtc::Thread::Current(), 3522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current(), allocator_.get(), 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &observer_, 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &mediastream_signaling_)); 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_); 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_gathering_state_); 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3615c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(session_->Initialize(options_, constraints_.get(), 36241c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org identity_service, ice_type_)); 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void InitWithDtmfCodec() { 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add kTelephoneEventCodec for dtmf test. 3673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const cricket::AudioCodec kTelephoneEventCodec( 3683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 106, "telephone-event", 8000, 0, 1, 0); 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_engine_->SetAudioCodecs(codecs); 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_->set_audio_codecs(codecs); 3735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 376c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org void InitWithDtls(bool identity_request_should_fail = false) { 3775aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org FakeIdentityService* identity_service = new FakeIdentityService(); 3785aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org identity_service->set_should_fail(identity_request_should_fail); 3795aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(identity_service); 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Creates a local offer and applies it. Starts ice. 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Call mediastream_signaling_.UseOptionsWithStreamX() before this function 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // to decide which streams to create. 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void InitiateCall() { 3864fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew != 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_gathering_state_, 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3934fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* CreateOffer() { 3944fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 3954fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_audio = 3964fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kOfferToReceiveMediaTrue; 3974fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 3984fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org return CreateOffer(options); 3994fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org } 4004fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 4015aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* CreateOffer( 4024fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org const PeerConnectionInterface::RTCOfferAnswerOptions& options) { 4032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> 4045aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org observer = new WebRtcSessionCreateSDPObserverForTest(); 4054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org session_->CreateOffer(observer, options); 4065aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE_WAIT( 4075aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, 408fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org 2000); 409e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org return observer->ReleaseDescription(); 4105aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 4115aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 4125aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* CreateAnswer( 4135aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org const webrtc::MediaConstraintsInterface* constraints) { 4142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> observer 4155aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org = new WebRtcSessionCreateSDPObserverForTest(); 4165aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org session_->CreateAnswer(observer, constraints); 4175aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE_WAIT( 4185aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, 419fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org 2000); 420e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org return observer->ReleaseDescription(); 4215aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 4225aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 4233db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org bool ChannelsExist() const { 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (session_->voice_channel() != NULL && 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->video_channel() != NULL); 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org void CheckTransportChannels() const { 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 1) != NULL); 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 2) != NULL); 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 1) != NULL); 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 2) != NULL); 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyCryptoParams(const cricket::SessionDescription* sdp) { 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(session_.get() != NULL); 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::AudioContentDescription* audio_content = 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::AudioContentDescription*>( 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content->description); 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(audio_content != NULL); 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1U, audio_content->cryptos().size()); 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->cryptos()[0].cipher_suite); 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->protocol()); 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(sdp); 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoContentDescription* video_content = 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::VideoContentDescription*>( 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content->description); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_content != NULL); 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1U, video_content->cryptos().size()); 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->cryptos()[0].cipher_suite); 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size()); 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->protocol()); 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) { 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::AudioContentDescription* audio_content = 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::AudioContentDescription*>( 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content->description); 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(audio_content != NULL); 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(0U, audio_content->cryptos().size()); 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(sdp); 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoContentDescription* video_content = 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::VideoContentDescription*>( 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content->description); 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_content != NULL); 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(0U, video_content->cryptos().size()); 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (dtls) { 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->protocol()); 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->protocol()); 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->protocol()); 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->protocol()); 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set the internal fake description factories to do DTLS-SRTP. 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetFactoryDtlsSrtp() { 496ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org desc_factory_->set_secure(cricket::SEC_DISABLED); 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string identity_name = "WebRTC" + 4982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ToString(rtc::CreateRandomId()); 4992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org identity_.reset(rtc::SSLIdentity::Generate(identity_name)); 500a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org tdesc_factory_->set_identity(identity_.get()); 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tdesc_factory_->set_secure(cricket::SEC_REQUIRED); 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyFingerprintStatus(const cricket::SessionDescription* sdp, 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool expected) { 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const TransportInfo* audio = sdp->GetTransportInfoByName("audio"); 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(audio != NULL); 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(expected, audio->description.identity_fingerprint.get() != NULL); 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const TransportInfo* video = sdp->GetTransportInfoByName("video"); 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video != NULL); 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(expected, video->description.identity_fingerprint.get() != NULL); 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyAnswerFromNonCryptoOffer() { 515966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // Create an SDP without Crypto. 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 5181a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org JsepSessionDescription* offer( 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED)); 5201a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org ASSERT_TRUE(offer != NULL); 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyNoCryptoParams(offer->description(), false); 522ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto, 523ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org offer); 5245aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org const webrtc::SessionDescriptionInterface* answer = CreateAnswer(NULL); 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Answer should be NULL as no crypto params in offer. 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer == NULL); 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyAnswerFromCryptoOffer() { 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.bundle_enabled = true; 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<JsepSessionDescription> offer( 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_REQUIRED)); 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer.get() != NULL); 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCryptoParams(offer->description()); 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 5385aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer.get() != NULL); 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCryptoParams(answer->description()); 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 543b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org void SetAndVerifyNumUnsignalledRecvStreams( 544b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org int value_set, int value_expected) { 545b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org constraints_.reset(new FakeConstraints()); 546b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org constraints_->AddOptional( 547b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org webrtc::MediaConstraintsInterface::kNumUnsignalledRecvStreams, 548b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org value_set); 549b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org session_.reset(); 550b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org Init(NULL); 551b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 552b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 553b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org 554b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org SetLocalDescriptionWithoutError(offer); 555b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org 556b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 557b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org 558b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 559b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org cricket::VideoOptions video_options; 560b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org EXPECT_TRUE(video_channel_->GetOptions(&video_options)); 561b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org EXPECT_EQ(value_expected, 562b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org video_options.unsignalled_recv_stream_limit.GetWithDefaultIfUnset(-1)); 563b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org } 564b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CompareIceUfragAndPassword(const cricket::SessionDescription* desc1, 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::SessionDescription* desc2, 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool expect_equal) { 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (desc1->contents().size() != desc2->contents().size()) { 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(expect_equal); 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfos& contents = desc1->contents(); 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentInfos::const_iterator it = contents.begin(); 5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (; it != contents.end(); ++it) { 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportDescription* transport_desc1 = 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc1->GetTransportDescriptionByName(it->name); 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportDescription* transport_desc2 = 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc2->GetTransportDescriptionByName(it->name); 5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!transport_desc1 || !transport_desc2) { 5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(expect_equal); 5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || 5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { 5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(expect_equal); 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(expect_equal); 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5938841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 5948841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc, 5958841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string *sdp) { 5968841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const cricket::SessionDescription* desc = current_desc->description(); 5978841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_TRUE(current_desc->ToString(sdp)); 5988841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 5998841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const cricket::ContentInfos& contents = desc->contents(); 6008841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org cricket::ContentInfos::const_iterator it = contents.begin(); 6018841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // Replace ufrag and pwd lines with empty strings. 6028841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org for (; it != contents.end(); ++it) { 6038841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const cricket::TransportDescription* transport_desc = 6048841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org desc->GetTransportDescriptionByName(it->name); 6058841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag 6068841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org + "\r\n"; 6078841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd 6088841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org + "\r\n"; 6092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), 6108841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org "", 0, 6118841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org sdp); 6122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), 6138841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org "", 0, 6148841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org sdp); 6158841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 6168841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 6178841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 6183922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org void ModifyIceUfragPwdLines(const SessionDescriptionInterface* current_desc, 6193922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org const std::string& modified_ice_ufrag, 6203922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org const std::string& modified_ice_pwd, 6213922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string* sdp) { 6223922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org const cricket::SessionDescription* desc = current_desc->description(); 6233922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org EXPECT_TRUE(current_desc->ToString(sdp)); 6243922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 6253922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org const cricket::ContentInfos& contents = desc->contents(); 6263922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org cricket::ContentInfos::const_iterator it = contents.begin(); 6273922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // Replace ufrag and pwd lines with |modified_ice_ufrag| and 6283922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // |modified_ice_pwd| strings. 6293922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org for (; it != contents.end(); ++it) { 6303922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org const cricket::TransportDescription* transport_desc = 6313922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org desc->GetTransportDescriptionByName(it->name); 6323922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag 6333922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org + "\r\n"; 6343922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd 6353922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org + "\r\n"; 6363922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string mod_ufrag = "a=ice-ufrag:" + modified_ice_ufrag + "\r\n"; 6373922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n"; 6382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), 6393922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org mod_ufrag.c_str(), mod_ufrag.length(), 6403922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org sdp); 6412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), 6423922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org mod_pwd.c_str(), mod_pwd.length(), 6433922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org sdp); 6443922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org } 6453922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org } 6463922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Creates a remote offer and and applies it as a remote description, 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // creates a local answer and applies is as a local description. 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Call mediastream_signaling_.UseOptionsWithStreamX() before this function 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // to decide which local and remote streams to create. 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateAndSetRemoteOfferAndLocalAnswer() { 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 6545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetLocalDescriptionWithoutError(SessionDescriptionInterface* desc) { 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->SetLocalDescription(desc, NULL)); 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetLocalDescriptionExpectState(SessionDescriptionInterface* desc, 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession::State expected_state) { 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(desc); 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_state, session_->state()); 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 665f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetLocalDescriptionExpectError(const std::string& action, 666f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org const std::string& expected_error, 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* desc) { 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string error; 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->SetLocalDescription(desc, &error)); 670f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string sdp_type = "local "; 671f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org sdp_type.append(action); 672f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_NE(std::string::npos, error.find(sdp_type)); 6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(std::string::npos, error.find(expected_error)); 6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 675f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetLocalDescriptionOfferExpectError(const std::string& expected_error, 676f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SessionDescriptionInterface* desc) { 677f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionExpectError(SessionDescriptionInterface::kOffer, 678f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org expected_error, desc); 679f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org } 680f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetLocalDescriptionAnswerExpectError(const std::string& expected_error, 681f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SessionDescriptionInterface* desc) { 682f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionExpectError(SessionDescriptionInterface::kAnswer, 683f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org expected_error, desc); 684f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org } 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetRemoteDescriptionWithoutError(SessionDescriptionInterface* desc) { 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->SetRemoteDescription(desc, NULL)); 6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetRemoteDescriptionExpectState(SessionDescriptionInterface* desc, 6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession::State expected_state) { 6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(desc); 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_state, session_->state()); 6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 693f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetRemoteDescriptionExpectError(const std::string& action, 694f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org const std::string& expected_error, 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* desc) { 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string error; 6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->SetRemoteDescription(desc, &error)); 698f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string sdp_type = "remote "; 699f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org sdp_type.append(action); 700f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_NE(std::string::npos, error.find(sdp_type)); 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(std::string::npos, error.find(expected_error)); 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 703f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetRemoteDescriptionOfferExpectError( 704f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org const std::string& expected_error, SessionDescriptionInterface* desc) { 705f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionExpectError(SessionDescriptionInterface::kOffer, 706f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org expected_error, desc); 707f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org } 708f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetRemoteDescriptionPranswerExpectError( 709f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org const std::string& expected_error, SessionDescriptionInterface* desc) { 710f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionExpectError(SessionDescriptionInterface::kPrAnswer, 711f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org expected_error, desc); 712f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org } 713f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org void SetRemoteDescriptionAnswerExpectError( 714f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org const std::string& expected_error, SessionDescriptionInterface* desc) { 715f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionExpectError(SessionDescriptionInterface::kAnswer, 716f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org expected_error, desc); 717f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org } 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateCryptoOfferAndNonCryptoAnswer(SessionDescriptionInterface** offer, 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface** nocrypto_answer) { 7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a SDP without Crypto. 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.bundle_enabled = true; 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *offer = CreateRemoteOffer(options, cricket::SEC_ENABLED); 7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(*offer != NULL); 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCryptoParams((*offer)->description()); 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *nocrypto_answer = CreateRemoteAnswer(*offer, options, 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SEC_DISABLED); 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(*nocrypto_answer != NULL); 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 734ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org void CreateDtlsOfferAndNonDtlsAnswer(SessionDescriptionInterface** offer, 735ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SessionDescriptionInterface** nodtls_answer) { 736ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options; 737ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 738ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.bundle_enabled = true; 739ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 7402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> temp_offer( 741ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_ENABLED)); 742ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 743ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org *nodtls_answer = 744ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteAnswer(temp_offer.get(), options, cricket::SEC_ENABLED); 745ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org EXPECT_TRUE(*nodtls_answer != NULL); 746ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus((*nodtls_answer)->description(), false); 747ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyCryptoParams((*nodtls_answer)->description()); 748ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 749ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetFactoryDtlsSrtp(); 750ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org *offer = CreateRemoteOffer(options, cricket::SEC_ENABLED); 751ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(*offer != NULL); 752ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus((*offer)->description(), true); 753ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyCryptoParams((*offer)->description()); 754ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org } 755ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteOfferWithVersion( 7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options, 7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SecurePolicy secure_policy, 7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& session_version, 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* current_desc) { 7612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org std::string session_id = rtc::ToString(rtc::CreateRandomId64()); 7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::SessionDescription* cricket_desc = NULL; 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (current_desc) { 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket_desc = current_desc->description(); 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_id = current_desc->session_id(); 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_->set_secure(secure_policy); 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* offer( 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer)); 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!offer->Initialize(desc_factory_->CreateOffer(options, cricket_desc), 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_id, session_version)) { 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete offer; 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer = NULL; 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return offer; 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteOffer( 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options) { 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED, 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionVersion, NULL); 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteOffer( 784ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options, cricket::SecurePolicy sdes_policy) { 785ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org return CreateRemoteOfferWithVersion( 786ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options, sdes_policy, kSessionVersion, NULL); 7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteOffer( 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options, 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* current_desc) { 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED, 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionVersion, current_desc); 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7958841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org JsepSessionDescription* CreateRemoteOfferWithSctpPort( 7968841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const char* sctp_stream_name, int new_port, 7978841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org cricket::MediaSessionOptions options) { 7988841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org options.data_channel_type = cricket::DCT_SCTP; 7998841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org options.AddStream(cricket::MEDIA_TYPE_DATA, "datachannel", 8008841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org sctp_stream_name); 8018841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org return ChangeSDPSctpPort(new_port, CreateRemoteOffer(options)); 8028841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 8038841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 8048841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // Takes ownership of offer_basis (and deletes it). 8058841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org JsepSessionDescription* ChangeSDPSctpPort( 8068841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org int new_port, webrtc::SessionDescriptionInterface *offer_basis) { 8078841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // Stringify the input SDP, swap the 5000 for 'new_port' and create a new 8088841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // SessionDescription from the mutated string. 8098841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const char* default_port_str = "5000"; 8108841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org char new_port_str[16]; 8112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::sprintfn(new_port_str, sizeof(new_port_str), "%d", new_port); 8128841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string offer_str; 8138841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org offer_basis->ToString(&offer_str); 8142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(default_port_str, strlen(default_port_str), 8158841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org new_port_str, strlen(new_port_str), 8168841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org &offer_str); 8178841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org JsepSessionDescription* offer = new JsepSessionDescription( 8188841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org offer_basis->type()); 8198841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org delete offer_basis; 8208841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org offer->Initialize(offer_str, NULL); 8218841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org return offer; 8228841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org } 8238841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer. Call mediastream_signaling_.UseOptionsWithStreamX() 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // before this function to decide which streams to create. 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteOffer() { 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.GetOptionsForAnswer(NULL, &options); 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return CreateRemoteOffer(options, session_->remote_description()); 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* offer, 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options, 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SecurePolicy policy) { 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_->set_secure(policy); 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_id = 8382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ToString(rtc::CreateRandomId64()); 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* answer( 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer)); 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!answer->Initialize(desc_factory_->CreateAnswer(offer->description(), 8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options, NULL), 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_id, kSessionVersion)) { 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete answer; 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer = NULL; 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return answer; 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* offer, 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options) { 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED); 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Creates an answer session description with streams based on 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |mediastream_signaling_|. Call 8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // mediastream_signaling_.UseOptionsWithStreamX() before this function 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // to decide which streams to create. 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* CreateRemoteAnswer( 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* offer) { 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.GetOptionsForAnswer(NULL, &options); 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED); 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestSessionCandidatesWithBundleRtcpMux(bool bundle, bool rtcp_mux) { 8682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 8695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 8714fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 8724fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 8734fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.use_rtp_mux = bundle; 8744fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 8754fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(options); 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and answer. 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 881a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org CreateRemoteAnswer(session_->local_description())); 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t expected_candidate_num = 2; 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!rtcp_mux) { 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // If rtcp_mux is enabled we should expect 4 candidates - host and srflex 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // for rtp and rtcp. 8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_candidate_num = 4; 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Disable rtcp-mux from the answer 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kRtcpMux = "a=rtcp-mux"; 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kXRtcpMux = "a=xrtcp-mux"; 8932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(kRtcpMux.c_str(), kRtcpMux.length(), 8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kXRtcpMux.c_str(), kXRtcpMux.length(), 8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* new_answer = CreateSessionDescription( 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kAnswer, sdp, NULL); 9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription to enable rtcp mux. 902a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org SetRemoteDescriptionWithoutError(new_answer); 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_candidate_num, observer_.mline_0_candidates_.size()); 9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_candidate_num, observer_.mline_1_candidates_.size()); 9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < observer_.mline_0_candidates_.size(); ++i) { 9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate c0 = observer_.mline_0_candidates_[i]; 9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate c1 = observer_.mline_1_candidates_[i]; 9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (bundle) { 9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(c0.IsEquivalent(c1)); 9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(c0.IsEquivalent(c1)); 9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Tests that we can only send DTMF when the dtmf codec is supported. 9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestCanInsertDtmf(bool can) { 9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (can) { 9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitWithDtmfCodec(); 9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 9215aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->CanInsertDtmf("")); 9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(can, session_->CanInsertDtmf(kAudioTrack1)); 9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The method sets up a call from the session to itself, in a loopback 9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // arrangement. It also uses a firewall rule to create a temporary 931f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // disconnection, and then a permanent disconnection. 932f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // This code is placed in a method so that it can be invoked 9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // by multiple tests with different allocators (e.g. with and without BUNDLE). 9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // While running the call, this method also checks if the session goes through 9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the correct sequence of ICE states when a connection is established, 9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // broken, and re-established. 9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The Connection state should go: 938f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // New -> Checking -> (Connected) -> Completed -> Disconnected -> Completed 939f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // -> Failed. 9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The Gathering state should go: New -> Gathering -> Completed. 9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestLoopbackCall() { 9422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 9435aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 9454fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_gathering_state_); 9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, 9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_); 9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringGathering, 9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_gathering_state_, 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringComplete, 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_gathering_state_, 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer->ToString(&sdp); 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* desc = 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(JsepSessionDescription::kAnswer, sdp); 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(desc); 9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionChecking, 9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_, 9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 970c3792f79c0296e4fb07e49ef395710c573c34e6dmallinath@webrtc.org 971f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // The ice connection state is "Connected" too briefly to catch in a test. 972f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted, 9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_, 9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adding firewall rule to block ping requests, which should cause 9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // transport channel failure. 9783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org fss_->AddRule(false, 9792a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FP_ANY, 9802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FD_ANY, 9812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected, 9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_, 9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Clearing the rules, session should move back to completed state. 9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fss_->ClearRules(); 9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Session is automatically calling OnSignalingReady after creation of 9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // new portallocator session which will allocate new set of candidates. 9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 991f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted, 9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.ice_connection_state_, 9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 994f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org 995f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // Now we block ping requests and wait until the ICE connection transitions 996f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // to the Failed state. This will take at least 30 seconds because it must 997f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // wait for the Port to timeout. 998f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org int port_timeout = 30000; 999f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org fss_->AddRule(false, 10002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FP_ANY, 10012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FD_ANY, 10022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 1003f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionFailed, 1004f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org observer_.ice_connection_state_, 1005f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org kIceCandidatesTimeout + port_timeout); 10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyTransportType(const std::string& content_name, 10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::TransportProtocol protocol) { 10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::Transport* transport = session_->GetTransport(content_name); 10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(transport != NULL); 10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(protocol, transport->protocol()); 10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adds CN codecs to FakeMediaEngine and MediaDescriptionFactory. 10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddCNCodecs() { 10173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const cricket::AudioCodec kCNCodec1(102, "CN", 8000, 0, 1, 0); 10183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org const cricket::AudioCodec kCNCodec2(103, "CN", 16000, 0, 1, 0); 10193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org 10203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Add kCNCodec for dtmf test. 10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs = media_engine_->audio_codecs();; 10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCNCodec1); 10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCNCodec2); 10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_engine_->SetAudioCodecs(codecs); 10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_factory_->set_audio_codecs(codecs); 10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool VerifyNoCNCodecs(const cricket::ContentInfo* content) { 10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentDescription* description = content->description; 10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(description != NULL); 10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::AudioContentDescription* audio_content_desc = 10321a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org static_cast<const cricket::AudioContentDescription*>(description); 10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(audio_content_desc != NULL); 10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) { 10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_content_desc->codecs()[i].name == "CN") 10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetLocalDescriptionWithDataChannel() { 10428485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::InternalDataChannelInit dci; 10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dci.reliable = false; 10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->CreateDataChannel("datachannel", &dci); 10454fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10495aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org void VerifyMultipleAsyncCreateDescription( 10505aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org bool success, CreateSessionDescriptionRequest::Type type) { 1051c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org InitWithDtls(!success); 1052ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetFactoryDtlsSrtp(); 10535aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org if (type == CreateSessionDescriptionRequest::kAnswer) { 10545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org cricket::MediaSessionOptions options; 10555aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org scoped_ptr<JsepSessionDescription> offer( 1056ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED)); 10575aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org ASSERT_TRUE(offer.get() != NULL); 10585aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 10595aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10605aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 10614fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 10625aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org const int kNumber = 3; 10632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> 10645aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org observers[kNumber]; 10655aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org for (int i = 0; i < kNumber; ++i) { 10665aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org observers[i] = new WebRtcSessionCreateSDPObserverForTest(); 10675aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org if (type == CreateSessionDescriptionRequest::kOffer) { 10684fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org session_->CreateOffer(observers[i], options); 10695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } else { 10705aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org session_->CreateAnswer(observers[i], NULL); 10715aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10725aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 10745aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org WebRtcSessionCreateSDPObserverForTest::State expected_state = 10755aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org success ? WebRtcSessionCreateSDPObserverForTest::kSucceeded : 10765aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org WebRtcSessionCreateSDPObserverForTest::kFailed; 10775aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 10785aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org for (int i = 0; i < kNumber; ++i) { 10795aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_EQ_WAIT(expected_state, observers[i]->state(), 1000); 10805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org if (success) { 10815aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(observers[i]->description() != NULL); 10825aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } else { 10835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(observers[i]->description() == NULL); 10845aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10855aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10865aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 10875aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 10882ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org void ConfigureAllocatorWithTurn() { 10892ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); 10902ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword); 10912ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org relay_server.credentials = credentials; 10922ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org relay_server.ports.push_back(cricket::ProtocolAddress( 10932ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org kTurnUdpIntAddr, cricket::PROTO_UDP, false)); 10942ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org allocator_->AddRelay(relay_server); 10952ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org allocator_->set_step_delay(cricket::kMinimumStepDelay); 10962ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | 10972ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE); 10982ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org } 10992ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org 11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeDataEngine* data_engine_; 11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeDeviceManager* device_manager_; 11032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 11042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::TransportDescriptionFactory> tdesc_factory_; 11052a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::SSLIdentity> identity_; 11062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::MediaSessionDescriptionFactory> desc_factory_; 11072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 11082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 11092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::FirewallSocketServer> fss_; 11102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketServerScope ss_scope_; 11112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress stun_socket_addr_; 11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::TestStunServer stun_server_; 111341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org cricket::TestTurnServer turn_server_; 11142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FakeNetworkManager network_manager_; 11152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::BasicPortAllocator> allocator_; 11165c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org PeerConnectionFactoryInterface::Options options_; 11172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<FakeConstraints> constraints_; 11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeMediaStreamSignaling mediastream_signaling_; 11192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<WebRtcSessionForTest> session_; 11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockIceObserver observer_; 11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVideoMediaChannel* video_channel_; 11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVoiceMediaChannel* voice_channel_; 112341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org PeerConnectionInterface::IceTransportsType ice_type_; 11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitializeWithDtls) { 11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitWithDtls(); 1128ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SDES is disabled when DTLS is on. 1129ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy()); 11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1132ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) { 11335aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 1134ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SDES is required if DTLS is off. 1135ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org EXPECT_EQ(cricket::SEC_REQUIRED, session_->SdesPolicy()); 11365aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 11375aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidates) { 11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSessionCandidatesWithBundleRtcpMux(false, false); 11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Below test cases (TestSessionCandidatesWith*) verify the candidates gathered 11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// with rtcp-mux and/or bundle. 11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidatesWithRtcpMux) { 11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSessionCandidatesWithBundleRtcpMux(false, true); 11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionCandidatesWithBundleRtcpMux) { 11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSessionCandidatesWithBundleRtcpMux(true, true); 11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestMultihomeCandidates) { 11532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 11542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost2, kClientAddrPort)); 11555aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(8u, observer_.mline_0_candidates_.size()); 11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(8u, observer_.mline_1_candidates_.size()); 11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestStunError) { 11642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 11652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost2, kClientAddrPort)); 11663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org fss_->AddRule(false, 11672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FP_UDP, 11682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FD_ANY, 11692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 11705aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitiateCall(); 11733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org // Since kClientAddrHost1 is blocked, not expecting stun candidates for it. 11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(6u, observer_.mline_0_candidates_.size()); 11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(6u, observer_.mline_1_candidates_.size()); 1177265eb22e59e6aa1feebeaa0598ef92da579ff2b2mallinath@webrtc.org} 1178265eb22e59e6aa1feebeaa0598ef92da579ff2b2mallinath@webrtc.org 11792ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org// Test session delivers no candidates gathered when constraint set to "none". 11802ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestIceTransportsNone) { 11812ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 11822ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org SetIceTransportType(PeerConnectionInterface::kNone); 11832ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org Init(NULL); 11842ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 11852ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org InitiateCall(); 11862ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 11872ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(0u, observer_.mline_0_candidates_.size()); 11882ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(0u, observer_.mline_1_candidates_.size()); 11892ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org} 11902ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org 11912ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org// Test session delivers only relay candidates gathered when constaint set to 11922ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org// "relay". 11932ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestIceTransportsRelay) { 11942ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 11952ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org ConfigureAllocatorWithTurn(); 11962ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org SetIceTransportType(PeerConnectionInterface::kRelay); 11972ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org Init(NULL); 11982ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 11992ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org InitiateCall(); 12002ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 12012ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(2u, observer_.mline_0_candidates_.size()); 12022ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(2u, observer_.mline_1_candidates_.size()); 12032ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org for (size_t i = 0; i < observer_.mline_0_candidates_.size(); ++i) { 12042ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(cricket::RELAY_PORT_TYPE, 12052ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org observer_.mline_0_candidates_[i].type()); 12062ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org } 12072ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org for (size_t i = 0; i < observer_.mline_1_candidates_.size(); ++i) { 12082ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(cricket::RELAY_PORT_TYPE, 12092ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org observer_.mline_1_candidates_[i].type()); 12102ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org } 12112ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org} 12122ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org 12132ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org// Test session delivers all candidates gathered when constaint set to "all". 12142ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestIceTransportsAll) { 12152ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 12162ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org SetIceTransportType(PeerConnectionInterface::kAll); 12172ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org Init(NULL); 12182ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12192ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org InitiateCall(); 12202ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 12212ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org // Host + STUN. By default allocator is disabled to gather relay candidates. 12222ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(4u, observer_.mline_0_candidates_.size()); 12232ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org EXPECT_EQ(4u, observer_.mline_1_candidates_.size()); 12242ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org} 12252ca56577c4c9aaedeb70024d2012a1f519dfb201mallinath@webrtc.org 1226f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcSessionTest, SetSdpFailedOnInvalidSdp) { 1227f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org Init(NULL); 1228f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SessionDescriptionInterface* offer = NULL; 1229f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // Since |offer| is NULL, there's no way to tell if it's an offer or answer. 1230f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string unknown_action; 1231f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionExpectError(unknown_action, kInvalidSdp, offer); 1232f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionExpectError(unknown_action, kInvalidSdp, offer); 1233f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org} 1234f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 12350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test creating offers and receive answers and make sure the 12360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// media engine creates the expected send and receive streams. 1237ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateSdesOfferReceiveSdesAnswer) { 12385aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12404fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_id_orig = offer->session_id(); 12420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_version_orig = offer->session_version(); 12430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description()); 12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 12570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 12580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 12600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 12610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 12620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 12630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create new offer without send streams. 12650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 12664fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer = CreateOffer(); 12670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify the session id is the same and the session version is 12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // increased. 12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(session_id_orig, offer->session_id()); 12712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_LT(rtc::FromString<uint64>(session_version_orig), 12722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FromString<uint64>(offer->session_version())); 12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1275966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_EQ(0u, video_channel_->send_streams().size()); 1276966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_EQ(0u, voice_channel_->send_streams().size()); 12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer = CreateRemoteAnswer(session_->local_description()); 12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Make sure the receive streams have not changed. 12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 12880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test receiving offers and creating answers and make sure the 12900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// media engine creates the expected send and receive streams. 1291ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiveSdesOfferCreateSdesAnswer) { 12925aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 12930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 12944fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 1295ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyCryptoParams(offer->description()); 12960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 12970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 12995aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 1300ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyCryptoParams(answer->description()); 13010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 13020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_id_orig = answer->session_id(); 13040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_version_orig = answer->session_version(); 13050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 13070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 13080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 13100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 13110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 13130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 13140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 13160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 13170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 13180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 13190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1And2(); 13214fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer = CreateOffer(); 13220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 13230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Answer by turning off all send streams. 13250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 13265aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org answer = CreateAnswer(NULL); 13270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify the session id is the same and the session version is 13290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // increased. 13300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(session_id_orig, answer->session_id()); 13312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_LT(rtc::FromString<uint64>(session_version_orig), 13322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FromString<uint64>(answer->session_version())); 13330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 13340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, video_channel_->recv_streams().size()); 13360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->recv_streams()[0].id); 13370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[1].id); 13380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, voice_channel_->recv_streams().size()); 13390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->recv_streams()[0].id); 13400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[1].id); 13410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Make sure we have no send streams. 13430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, video_channel_->send_streams().size()); 13440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, voice_channel_->send_streams().size()); 13450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 13460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1347f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcSessionTest, SetLocalSdpFailedOnCreateChannel) { 1348f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org Init(NULL); 1349f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org media_engine_->set_fail_create_channel(true); 1350f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 13514fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 1352f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ASSERT_TRUE(offer != NULL); 1353f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // SetRemoteDescription and SetLocalDescription will take the ownership of 1354f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // the offer. 1355f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionOfferExpectError(kCreateChannelFailed, offer); 13564fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer = CreateOffer(); 1357f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ASSERT_TRUE(offer != NULL); 1358f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionOfferExpectError(kCreateChannelFailed, offer); 1359f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org} 1360f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 1361ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// 1362ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Tests for creating/setting SDP under different SDES/DTLS polices: 1363ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// 1364ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// --DTLS off and SDES on 1365ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestCreateSdesOfferReceiveSdesAnswer/TestReceiveSdesOfferCreateSdesAnswer: 1366ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// set local/remote offer/answer with crypto --> success 1367ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestSetNonSdesOfferWhenSdesOn: set local/remote offer without crypto ---> 1368ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// failure 1369ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestSetLocalNonSdesAnswerWhenSdesOn: set local answer without crypto --> 1370ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// failure 1371ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestSetRemoteNonSdesAnswerWhenSdesOn: set remote answer without crypto --> 1372ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// failure 1373ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// 1374ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// --DTLS on and SDES off 1375ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestCreateDtlsOfferReceiveDtlsAnswer/TestReceiveDtlsOfferCreateDtlsAnswer: 1376ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// set local/remote offer/answer with DTLS fingerprint --> success 1377ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestReceiveNonDtlsOfferWhenDtlsOn: set local/remote offer without DTLS 1378ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// fingerprint --> failure 1379ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestSetLocalNonDtlsAnswerWhenDtlsOn: set local answer without fingerprint 1380ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// --> failure 1381ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestSetRemoteNonDtlsAnswerWhenDtlsOn: set remote answer without fingerprint 1382ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// --> failure 1383ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// 1384ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// --Encryption disabled: DTLS off and SDES off 1385ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestCreateOfferReceiveAnswerWithoutEncryption: set local offer and remote 1386ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// answer without SDES or DTLS --> success 1387ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// TestCreateAnswerReceiveOfferWithoutEncryption: set remote offer and local 1388ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// answer without SDES or DTLS --> success 1389ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// 1390ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1391ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we return a failure when applying a remote/local offer that doesn't 1392ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// have cryptos enabled when DTLS is off. 1393ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetNonSdesOfferWhenSdesOn) { 13945aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 13950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 13960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 13970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* offer = CreateRemoteOffer( 13980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options, cricket::SEC_DISABLED); 13990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 14000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyNoCryptoParams(offer->description(), false); 14010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 14020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the offer. 1403ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto, offer); 14040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer = CreateRemoteOffer(options, cricket::SEC_DISABLED); 14050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 1406ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionOfferExpectError(kSdpWithoutSdesCrypto, offer); 14070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1409ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we return a failure when applying a local answer that doesn't have 1410ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// cryptos enabled when DTLS is off. 1411ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalNonSdesAnswerWhenSdesOn) { 14125aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 14130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 14140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 14150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer); 14160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 14170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the offer. 14180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 1419ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionAnswerExpectError(kSdpWithoutSdesCrypto, answer); 14200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1422ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test we will return fail when apply an remote answer that doesn't have 1423ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// crypto enabled when DTLS is off. 1424ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteNonSdesAnswerWhenSdesOn) { 14255aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 14260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 14270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 14280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer); 14290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 14300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the offer. 14310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1432ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionAnswerExpectError(kSdpWithoutSdesCrypto, answer); 14330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1435ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we accept an offer with a DTLS fingerprint when DTLS is on 1436ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// and that we return an answer with a DTLS fingerprint. 1437ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiveDtlsOfferCreateDtlsAnswer) { 14382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 14390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 14400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitWithDtls(); 14410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetFactoryDtlsSrtp(); 14420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 14430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 1444ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org JsepSessionDescription* offer = 1445ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED); 14460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 14470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyFingerprintStatus(offer->description(), true); 1448ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(offer->description(), true); 14490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetRemoteDescription will take the ownership of the offer. 14510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 14520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify that we get a crypto fingerprint in the answer. 14545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 14550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer != NULL); 14560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyFingerprintStatus(answer->description(), true); 14570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check that we don't have an a=crypto line in the answer. 14580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyNoCryptoParams(answer->description(), true); 14590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now set the local description, which should work, even without a=crypto. 14610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 14620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1464ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we set a local offer with a DTLS fingerprint when DTLS is on 1465ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// and then we accept a remote answer with a DTLS fingerprint successfully. 1466ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateDtlsOfferReceiveDtlsAnswer) { 14672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1468ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 1469ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 1470ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetFactoryDtlsSrtp(); 1471ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1472ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Verify that we get a crypto fingerprint in the answer. 14734fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 1474ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(offer != NULL); 1475ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(offer->description(), true); 1476ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Check that we don't have an a=crypto line in the offer. 1477ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(offer->description(), true); 1478ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1479ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Now set the local description, which should work, even without a=crypto. 1480ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1481ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1482ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options; 1483ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 1484ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org JsepSessionDescription* answer = 1485ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED); 1486ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(answer != NULL); 1487ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(answer->description(), true); 1488ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(answer->description(), true); 1489ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1490ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription will take the ownership of the answer. 1491ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 1492ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org} 1493ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1494ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that if we support DTLS and the other side didn't offer a fingerprint, 1495ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// we will fail to set the remote description. 1496ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiveNonDtlsOfferWhenDtlsOn) { 14972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 14980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InitWithDtls(); 14990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 15000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 1501ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.bundle_enabled = true; 15020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* offer = CreateRemoteOffer( 15030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options, cricket::SEC_REQUIRED); 15040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 15050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyFingerprintStatus(offer->description(), false); 1506ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyCryptoParams(offer->description()); 15070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1508ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription will take the ownership of the offer. 1509ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionOfferExpectError( 1510ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org kSdpWithoutDtlsFingerprint, offer); 1511ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1512ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org offer = CreateRemoteOffer(options, cricket::SEC_REQUIRED); 1513ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetLocalDescription will take the ownership of the offer. 1514ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionOfferExpectError( 1515ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org kSdpWithoutDtlsFingerprint, offer); 1516ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org} 1517ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1518ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we return a failure when applying a local answer that doesn't have 1519ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// a DTLS fingerprint when DTLS is required. 1520ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalNonDtlsAnswerWhenDtlsOn) { 15212a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1522ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 1523ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SessionDescriptionInterface* offer = NULL; 1524ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SessionDescriptionInterface* answer = NULL; 1525ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateDtlsOfferAndNonDtlsAnswer(&offer, &answer); 1526ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1527ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 1528ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // the offer and answer. 15290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 1530ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionAnswerExpectError( 1531ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org kSdpWithoutDtlsFingerprint, answer); 1532ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org} 15330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1534ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we return a failure when applying a remote answer that doesn't have 1535ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// a DTLS fingerprint when DTLS is required. 1536ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteNonDtlsAnswerWhenDtlsOn) { 15372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 1538ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 15394fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 1540ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options; 1541ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 1542ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org JsepSessionDescription* answer = 1543ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteAnswer(offer, options, cricket::SEC_ENABLED); 1544ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1545ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription and SetLocalDescription will take the ownership of 1546ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // the offer and answer. 1547ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1548ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionAnswerExpectError( 1549ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org kSdpWithoutDtlsFingerprint, answer); 1550ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org} 1551ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1552ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we create a local offer without SDES or DTLS and accept a remote 1553ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// answer without SDES or DTLS when encryption is disabled. 1554ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferReceiveAnswerWithoutEncryption) { 1555ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 1556ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options_.disable_encryption = true; 1557ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 1558ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1559ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Verify that we get a crypto fingerprint in the answer. 15604fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 1561ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(offer != NULL); 1562ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(offer->description(), false); 1563ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Check that we don't have an a=crypto line in the offer. 1564ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(offer->description(), false); 1565ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1566ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Now set the local description, which should work, even without a=crypto. 1567ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetLocalDescriptionWithoutError(offer); 1568ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1569ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options; 1570ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 1571ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org JsepSessionDescription* answer = 1572ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED); 1573ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(answer != NULL); 1574ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(answer->description(), false); 1575ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(answer->description(), false); 1576ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1577ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription will take the ownership of the answer. 1578ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 1579ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org} 1580ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1581ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// Test that we create a local answer without SDES or DTLS and accept a remote 1582ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org// offer without SDES or DTLS when encryption is disabled. 1583ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerReceiveOfferWithoutEncryption) { 1584ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options_.disable_encryption = true; 1585ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 1586ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1587ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org cricket::MediaSessionOptions options; 1588ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 1589ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org JsepSessionDescription* offer = 1590ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED); 1591ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org ASSERT_TRUE(offer != NULL); 1592ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(offer->description(), false); 1593ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(offer->description(), false); 1594ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1595ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // SetRemoteDescription will take the ownership of the offer. 1596ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 1597ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org 1598ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Verify that we get a crypto fingerprint in the answer. 15995aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 16000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer != NULL); 16010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyFingerprintStatus(answer->description(), false); 1602ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Check that we don't have an a=crypto line in the answer. 1603ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(answer->description(), false); 16040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1605ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org // Now set the local description, which should work, even without a=crypto. 16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalOfferTwice) { 16105aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription take ownership of offer. 16134fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 16150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription take ownership of offer. 16174fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer2 = CreateOffer(); 16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer2); 16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteOfferTwice) { 16225aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription take ownership of offer. 16254fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 16260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 16270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16284fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer2 = CreateOffer(); 16290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer2); 16300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAndRemoteOffer) { 16335aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16354fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 16374fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer = CreateOffer(); 1638f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionOfferExpectError( 1639f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org "Called in wrong state: STATE_SENTINITIATE", offer); 16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteAndLocalOffer) { 16435aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16454fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 16460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 16474fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer = CreateOffer(); 1648f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionOfferExpectError( 1649f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org "Called in wrong state: STATE_RECEIVEDINITIATE", offer); 16500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalPrAnswer) { 16535aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 16560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionExpectState(offer, BaseSession::STATE_RECEIVEDINITIATE); 16570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* pranswer = static_cast<JsepSessionDescription*>( 16595aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 16600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pranswer->set_type(SessionDescriptionInterface::kPrAnswer); 16610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionExpectState(pranswer, BaseSession::STATE_SENTPRACCEPT); 16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* pranswer2 = static_cast<JsepSessionDescription*>( 16655aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 16660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pranswer2->set_type(SessionDescriptionInterface::kPrAnswer); 16670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionExpectState(pranswer2, BaseSession::STATE_SENTPRACCEPT); 16690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 16715aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 16720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionExpectState(answer, BaseSession::STATE_SENTACCEPT); 16730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemotePrAnswer) { 16765aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 16770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 16784fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionExpectState(offer, BaseSession::STATE_SENTINITIATE); 16800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* pranswer = 16820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description()); 16830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pranswer->set_type(SessionDescriptionInterface::kPrAnswer); 16840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionExpectState(pranswer, 16860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession::STATE_RECEIVEDPRACCEPT); 16870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 16890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* pranswer2 = 16900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description()); 16910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pranswer2->set_type(SessionDescriptionInterface::kPrAnswer); 16920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionExpectState(pranswer2, 16940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession::STATE_RECEIVEDPRACCEPT); 16950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 16970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 16980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description()); 16990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionExpectState(answer, BaseSession::STATE_RECEIVEDACCEPT); 17000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAnswerWithoutOffer) { 17035aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 17040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 17054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 17064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(offer.get()); 1709f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionAnswerExpectError("Called in wrong state: STATE_INIT", 1710f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org answer); 17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithoutOffer) { 17145aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendNothing(); 17164fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 17174fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(offer.get()); 1720f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionAnswerExpectError( 1721f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org "Called in wrong state: STATE_INIT", answer); 17220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { 17255aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 17260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 17270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate; 17290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate.set_component(1); 17300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate); 17310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Fail since we have not set a offer description. 17330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1)); 17340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17354fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 17360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 17370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Candidate should be allowed to add before remote description. 17380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); 17390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate.set_component(2); 17400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate); 17410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 17420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer( 17440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->local_description()); 17450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 17460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verifying the candidates are copied properly from internal vector. 17480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* remote_desc = 17490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->remote_description(); 17500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(remote_desc != NULL); 17510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 17520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* candidates = 17530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_desc->candidates(kMediaContentIndex0); 17540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, candidates->count()); 17550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 17560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentName0, candidates->at(0)->sdp_mid()); 17570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, candidates->at(0)->candidate().component()); 17580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, candidates->at(1)->candidate().component()); 17590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1760b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org // |ice_candidate3| is identical to |ice_candidate2|. It can be added 1761b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org // successfully, but the total count of candidates will not increase. 17620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate.set_component(2); 17630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate3(kMediaContentName0, 0, candidate); 17640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate3)); 1765b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org ASSERT_EQ(2u, candidates->count()); 17660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate); 17680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate)); 17690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a remote candidate is added to the remote session description and 17720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// that it is retained if the remote session description is changed. 17730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) { 17745aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 17750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate1; 17760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1.set_component(1); 17770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, 17780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1); 17790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 17800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 17810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); 17830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* remote_desc = 17840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->remote_description(); 17850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(remote_desc != NULL); 17860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 17870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* candidates = 17880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_desc->candidates(kMediaContentIndex0); 17890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, candidates->count()); 17900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 17910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the RemoteSessionDescription with a new session description and 17930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // a candidate and check that the new remote session description contains both 17940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // candidates. 17950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 17960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate2; 17970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, 17980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate2); 17990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate2)); 18000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 18010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_desc = session_->remote_description(); 18030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(remote_desc != NULL); 18040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 18050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates = remote_desc->candidates(kMediaContentIndex0); 18060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, candidates->count()); 18070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 18080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Username and password have be updated with the TransportInfo of the 18090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescription, won't be equal to the original one. 18100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate2.set_username(candidates->at(0)->candidate().username()); 18110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate2.set_password(candidates->at(0)->candidate().password()); 18120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(candidate2.IsEquivalent(candidates->at(0)->candidate())); 18130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(1)->sdp_mline_index()); 18140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // No need to verify the username and password. 18150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1.set_username(candidates->at(1)->candidate().username()); 18160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1.set_password(candidates->at(1)->candidate().password()); 18170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(candidate1.IsEquivalent(candidates->at(1)->candidate())); 18180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that the candidate is ignored if we can add the same candidate again. 18200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 18210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that local candidates are added to the local session description and 18240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// that they are retained if the local session description is changed. 18250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestLocalCandidatesAddedToSessionDescription) { 18262a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 18275aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 18280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* local_desc = session_->local_description(); 18320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* candidates = 18330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_desc->candidates(kMediaContentIndex0); 18340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(candidates != NULL); 18350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, candidates->count()); 18360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 18380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_desc = session_->local_description(); 18400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates = local_desc->candidates(kMediaContentIndex0); 18410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(candidates != NULL); 18420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, candidates->count()); 18430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates = local_desc->candidates(1); 18440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(candidates != NULL); 18450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, candidates->count()); 18460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the session descriptions. 18480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_desc = session_->local_description(); 18520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates = local_desc->candidates(kMediaContentIndex0); 18530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(candidates != NULL); 18540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, candidates->count()); 18550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates = local_desc->candidates(1); 18560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(candidates != NULL); 18570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, candidates->count()); 18580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set a remote session description with remote candidates. 18610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) { 18625aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 18630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate1; 18650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1.set_component(1); 18660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, 18670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1); 18680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18694fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 18700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); 18720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 18730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* remote_desc = 18750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->remote_description(); 18760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(remote_desc != NULL); 18770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 18780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* candidates = 18790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_desc->candidates(kMediaContentIndex0); 18800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, candidates->count()); 18810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 18820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 18840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 18850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that offers and answers contains ice candidates when Ice candidates have 18880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// been gathered. 18890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalAndRemoteDescriptionWithCandidates) { 18902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 18915aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 18920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 18930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Ice is started but candidates are not provided until SetLocalDescription 18940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // is called. 18950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_.mline_0_candidates_.size()); 18960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_.mline_1_candidates_.size()); 18970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 18980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Wait until at least one local candidate has been collected. 18990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(0u < observer_.mline_0_candidates_.size(), 19000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 19010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(0u < observer_.mline_1_candidates_.size(), 19020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIceCandidatesTimeout); 19030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19044fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> local_offer(CreateOffer()); 19054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 19060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(local_offer->candidates(kMediaContentIndex0) != NULL); 19070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex0)->count()); 19080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(local_offer->candidates(kMediaContentIndex1) != NULL); 19090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex1)->count()); 19100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* remote_offer(CreateRemoteOffer()); 19120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(remote_offer); 19135aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 19140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer->candidates(kMediaContentIndex0) != NULL); 19150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, answer->candidates(kMediaContentIndex0)->count()); 19160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(answer->candidates(kMediaContentIndex1) != NULL); 19170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(0u, answer->candidates(kMediaContentIndex1)->count()); 19180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 19190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifies TransportProxy and media channels are created with content names 19220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// present in the SessionDescription. 19230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestChannelCreationsWithContentNames) { 19245aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 19250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 19264fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 19270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateOffer creates session description with the content names "audio" and 19290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // "video". Goal is to modify these content names and verify transport channel 19300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // proxy in the BaseSession, as proxies are created with the content names 19310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // present in SDP. 19320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 19330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 19340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kAudioMid = "a=mid:audio"; 19350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kAudioMidReplaceStr = "a=mid:audio_content_name"; 19360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kVideoMid = "a=mid:video"; 19370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kVideoMidReplaceStr = "a=mid:video_content_name"; 19380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replacing |audio| with |audio_content_name|. 19402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(kAudioMid.c_str(), kAudioMid.length(), 19410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kAudioMidReplaceStr.c_str(), 19420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kAudioMidReplaceStr.length(), 19430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 19440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replacing |video| with |video_content_name|. 19452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(kVideoMid.c_str(), kVideoMid.length(), 19460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kVideoMidReplaceStr.c_str(), 19470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kVideoMidReplaceStr.length(), 19480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 19490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* modified_offer = 19510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 19520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(modified_offer); 19540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 19565aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL); 19570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 19580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("audio_content_name") != NULL); 19600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("video_content_name") != NULL); 19610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE((video_channel_ = media_engine_->GetVideoChannel(0)) != NULL); 19620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE((voice_channel_ = media_engine_->GetVoiceChannel(0)) != NULL); 19630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an offer contains the correct media content descriptions based on 19660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the send streams when no constraints have been set. 19670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutConstraintsOrStreams) { 19685aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 19694fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 19704fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 19710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 19720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 19730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 19740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 19750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 19760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content == NULL); 19770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an offer contains the correct media content descriptions based on 19800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the send streams when no constraints have been set. 19810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutConstraints) { 19825aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 19830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test Audio only offer. 19840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 19854fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 19864fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 19870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 19880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 19890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 19900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 19910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content == NULL); 19920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test Audio / Video offer. 19940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 19954fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org offer.reset(CreateOffer()); 19960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstAudioContent(offer->description()); 19970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 19980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 19990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 20000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an offer contains no media content descriptions if 20030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kOfferToReceiveVideo and kOfferToReceiveAudio constraints are set to false. 20040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithConstraintsWithoutStreams) { 20055aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 20064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 20074fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_audio = 0; 20084fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_video = 0; 20090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer( 20114fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org CreateOffer(options)); 20124fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 20130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(offer != NULL); 20140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 20150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 20160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content == NULL); 20170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 20180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content == NULL); 20190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an offer contains only audio media content descriptions if 20220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kOfferToReceiveAudio constraints are set to true. 20230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAudioOnlyOfferWithConstraints) { 20245aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 20254fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 20264fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_audio = 20274fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kOfferToReceiveMediaTrue; 20284fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 20292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer( 20304fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org CreateOffer(options)); 20310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 20330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 20340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 20350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 20360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content == NULL); 20370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an offer contains audio and video media content descriptions if 20400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kOfferToReceiveAudio and kOfferToReceiveVideo constraints are set to true. 20410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithConstraints) { 20425aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 20430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test Audio / Video offer. 20444fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 20454fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_audio = 20464fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kOfferToReceiveMediaTrue; 20474fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_video = 20484fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kOfferToReceiveMediaTrue; 20494fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 20502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer( 20514fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org CreateOffer(options)); 20524fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 20530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 20540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 20555e09ab5d40e8dfc4f8ffcbf02e890494cb0ee3a4jiayl@webrtc.org EXPECT_TRUE(content != NULL); 2056966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 20570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 20580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 20590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2060966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // Sets constraints to false and verifies that audio/video contents are 2061966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // removed. 2062966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options.offer_to_receive_audio = 0; 2063966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options.offer_to_receive_video = 0; 2064966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org offer.reset(CreateOffer(options)); 2065966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 2066966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org content = cricket::GetFirstAudioContent(offer->description()); 2067966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_TRUE(content == NULL); 2068966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org content = cricket::GetFirstVideoContent(offer->description()); 2069966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_TRUE(content == NULL); 20700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer can not be created if the last remote description is not 20730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// an offer. 20740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutAnOffer) { 20755aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 20764fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 20770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 20780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 20790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 20805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(CreateAnswer(NULL) == NULL); 20810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer contains the correct media content descriptions when no 20840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// constraints have been set. 20850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraintsOrStreams) { 20865aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 20870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio and video content. 20882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 20890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 20902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 20915aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 20920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 20930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 20940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 20950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 20960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 20980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 20990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer contains the correct media content descriptions when no 21030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// constraints have been set and the offer only contain audio. 21040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAudioAnswerWithoutConstraintsOrStreams) { 21055aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 21060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio only. 21070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 2108966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 21092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer( 21100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteOffer(options)); 21110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::GetFirstVideoContent(offer->description()) == NULL); 21120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::GetFirstAudioContent(offer->description()) != NULL); 21130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 21152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 21165aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 21170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 21180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 21190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cricket::GetFirstVideoContent(answer->description()) == NULL); 21230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer contains the correct media content descriptions when no 21260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// constraints have been set. 21270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraints) { 21285aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 21290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio and video content. 21302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 21310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 21320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test with a stream with tracks. 21330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 21355aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 21360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 21370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 21380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 21420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer contains the correct media content descriptions when 21470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// constraints have been set but no stream is sent. 21480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithConstraintsWithoutStreams) { 21495aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 21500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio and video content. 21512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 21520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 21530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::FakeConstraints constraints_no_receive; 21550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_no_receive.SetMandatoryReceiveAudio(false); 21560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_no_receive.SetMandatoryReceiveVideo(false); 21570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 21595aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(&constraints_no_receive)); 21600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 21610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 21620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content->rejected); 21640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 21660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content->rejected); 21680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that an answer contains the correct media content descriptions when 21710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// constraints have been set and streams are sent. 21720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithConstraints) { 21735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 21740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio and video content. 21752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 21760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 21770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::FakeConstraints constraints_no_receive; 21790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_no_receive.SetMandatoryReceiveAudio(false); 21800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_no_receive.SetMandatoryReceiveVideo(false); 21810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test with a stream with tracks. 21830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 21842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 21855aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(&constraints_no_receive)); 21860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(perkj): Should the direction be set to SEND_ONLY? 21880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 21890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 21900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(perkj): Should the direction be set to SEND_ONLY? 21940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content = cricket::GetFirstVideoContent(answer->description()); 21950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 21960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(content->rejected); 21970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateOfferWithoutCNCodecs) { 22000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddCNCodecs(); 22015aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 22024fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 22034fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.offer_to_receive_audio = 22044fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kOfferToReceiveMediaTrue; 22054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.voice_activity_detection = false; 22064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 22072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer( 22084fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org CreateOffer(options)); 22094fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 22100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 22110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(offer->description()); 22120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(content != NULL); 22130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(VerifyNoCNCodecs(content)); 22140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 22150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CreateAnswerWithoutCNCodecs) { 22170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddCNCodecs(); 22185aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 22190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a remote offer with audio and video content. 22202a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer()); 22210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 22220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::FakeConstraints constraints; 22240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints.SetOptionalVAD(false); 22252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 22265aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(&constraints)); 22270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* content = 22280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::GetFirstAudioContent(answer->description()); 22290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(content != NULL); 22300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(VerifyNoCNCodecs(content)); 22310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 22320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the call setup when remote answer with audio only and 22340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// later updates with video. 22350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestAVOfferWithAudioOnlyAnswer) { 22365aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 22370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL); 22380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL); 22390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 22414fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 22420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 22440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer, options); 22450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 22470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and answer; 22480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 22490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 22500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 22520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 22530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_channel_ == NULL); 22550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(0u, voice_channel_->recv_streams().size()); 22570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 22580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack1, voice_channel_->send_streams()[0].id); 22590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Let the remote end update the session descriptions, with Audio and Video. 22610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 22620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 22630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 22650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 22660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 22680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 22690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 22710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 22720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id); 22730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id); 22740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 22750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 22760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 22770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 22780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Change session back to audio only. 22800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 22810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 22820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, video_channel_->recv_streams().size()); 22840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 22850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 22860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 22870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 22880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 22890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the call setup when remote answer with video only and 22910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// later updates with audio. 22920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestAVOfferWithVideoOnlyAnswer) { 22935aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 22940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL); 22950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL); 22960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 22974fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 22980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 23000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_audio = false; 23010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 23020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer( 23030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer, options, cricket::SEC_ENABLED); 23040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SetLocalDescription and SetRemoteDescriptions takes ownership of offer 23060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and answer. 23070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 23080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 23090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 23110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 23120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(voice_channel_ == NULL); 23140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 23150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, video_channel_->recv_streams().size()); 23170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 23180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kVideoTrack1, video_channel_->send_streams()[0].id); 23190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the session descriptions, with Audio and Video. 23210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 23220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 23230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 23250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 23260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 23280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 23290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id); 23300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id); 23310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Change session back to video only. 23330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.UseOptionsVideoOnly(); 23340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 23350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 23370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 23380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 23400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id); 23410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 23420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id); 23430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { 23465aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 23470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23484fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 23490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCryptoParams(offer->description()); 23500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 23515aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 23520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCryptoParams(answer->description()); 23530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { 23565c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options_.disable_encryption = true; 23575aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 23580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23594fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 23600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyNoCryptoParams(offer->description(), false); 23610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) { 23645aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 23650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyAnswerFromNonCryptoOffer(); 23660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, VerifyAnswerFromCryptoOffer) { 23695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 23700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyAnswerFromCryptoOffer(); 23710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23738841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org// This test verifies that setLocalDescription fails if 23748841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org// no a=ice-ufrag and a=ice-pwd lines are present in the SDP. 23758841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalDescriptionWithoutIce) { 23768841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org Init(NULL); 23778841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 23784fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 23794fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 23808841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string sdp; 23818841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org RemoveIceUfragPwdLines(offer.get(), &sdp); 23828841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SessionDescriptionInterface* modified_offer = 23838841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 2384f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer); 23858841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org} 23868841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 23878841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org// This test verifies that setRemoteDescription fails if 23888841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org// no a=ice-ufrag and a=ice-pwd lines are present in the SDP. 23898841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteDescriptionWithoutIce) { 23908841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org Init(NULL); 23912a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); 23928841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org std::string sdp; 23938841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org RemoveIceUfragPwdLines(offer.get(), &sdp); 23948841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SessionDescriptionInterface* modified_offer = 23958841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 2396f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer); 23978841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org} 23988841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 23993922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org// This test verifies that setLocalDescription fails if local offer has 24003922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org// too short ice ufrag and pwd strings. 24013922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.orgTEST_F(WebRtcSessionTest, TestSetLocalDescriptionInvalidIceCredentials) { 24023922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org Init(NULL); 24033922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org tdesc_factory_->set_protocol(cricket::ICEPROTO_RFC5245); 24043922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 24054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 24064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 24073922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string sdp; 24083922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // Modifying ice ufrag and pwd in local offer with strings smaller than the 24093922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // recommended values of 4 and 22 bytes respectively. 24103922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org ModifyIceUfragPwdLines(offer.get(), "ice", "icepwd", &sdp); 24113922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org SessionDescriptionInterface* modified_offer = 24123922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 24133922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string error; 24143922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org EXPECT_FALSE(session_->SetLocalDescription(modified_offer, &error)); 24153922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 24163922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // Test with string greater than 256. 24173922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org sdp.clear(); 24183922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org ModifyIceUfragPwdLines(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd, 24193922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org &sdp); 24203922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org modified_offer = CreateSessionDescription(JsepSessionDescription::kOffer, sdp, 24213922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org NULL); 24223922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org EXPECT_FALSE(session_->SetLocalDescription(modified_offer, &error)); 24233922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org} 24243922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 24253922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org// This test verifies that setRemoteDescription fails if remote offer has 24263922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org// too short ice ufrag and pwd strings. 24273922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteDescriptionInvalidIceCredentials) { 24283922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org Init(NULL); 24293922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org tdesc_factory_->set_protocol(cricket::ICEPROTO_RFC5245); 24302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); 24313922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string sdp; 24323922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // Modifying ice ufrag and pwd in remote offer with strings smaller than the 24333922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org // recommended values of 4 and 22 bytes respectively. 24343922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org ModifyIceUfragPwdLines(offer.get(), "ice", "icepwd", &sdp); 24353922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org SessionDescriptionInterface* modified_offer = 24363922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); 24373922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org std::string error; 24383922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org EXPECT_FALSE(session_->SetRemoteDescription(modified_offer, &error)); 24393922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 24403922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org sdp.clear(); 24413922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org ModifyIceUfragPwdLines(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd, 24423922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org &sdp); 24433922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org modified_offer = CreateSessionDescription(JsepSessionDescription::kOffer, sdp, 24443922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org NULL); 24453922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org EXPECT_FALSE(session_->SetRemoteDescription(modified_offer, &error)); 24463922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org} 24473922cbc3a79d8ed6052eaeaf3e3f297096162f10buildbot@webrtc.org 24480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, VerifyBundleFlagInPA) { 24490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This test verifies BUNDLE flag in PortAllocator, if BUNDLE information in 24500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // local description is removed by the application, BUNDLE flag should be 24510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // disabled in PortAllocator. By default BUNDLE is enabled in the WebRtc. 24525aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 245341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & 245441c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->flags()) == cricket::PORTALLOCATOR_ENABLE_BUNDLE); 24554fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 24564fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 24570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* offer_copy = 24580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer->description()->Copy(); 24590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); 24600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* modified_offer = 24610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 24620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org modified_offer->Initialize(offer_copy, "1", "1"); 24630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(modified_offer); 246541c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org EXPECT_FALSE(allocator_->flags() & cricket::PORTALLOCATOR_ENABLE_BUNDLE); 24660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestDisabledBundleInAnswer) { 24695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 24700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 247141c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & 247241c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->flags()) == cricket::PORTALLOCATOR_ENABLE_BUNDLE); 24734fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 24744fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 24754fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.use_rtp_mux = true; 24764fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 24774fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(options); 24784fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 24790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 24800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 24812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 24820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description())); 24830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 24840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); 24850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* modified_answer = 24860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 24870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org modified_answer->Initialize(answer_copy, "1", "1"); 24880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(modified_answer); 248941c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & 249041c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->flags()) == cricket::PORTALLOCATOR_ENABLE_BUNDLE); 24910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 24930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 24940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->recv_streams().size()); 24960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id); 24970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->recv_streams().size()); 24990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id); 25000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, video_channel_->send_streams().size()); 25020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id); 25030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, voice_channel_->send_streams().size()); 25040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id); 25050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25077162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// This test verifies that SetLocalDescription and SetRemoteDescription fails 25087162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// if BUNDLE is enabled but rtcp-mux is disabled in m-lines. 25097162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcSessionTest, TestDisabledRtcpMuxWithBundleEnabled) { 25105aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org WebRtcSessionTest::Init(NULL); 25117162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 251241c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org EXPECT_TRUE((cricket::PORTALLOCATOR_ENABLE_BUNDLE & 251341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->flags()) == cricket::PORTALLOCATOR_ENABLE_BUNDLE); 25144fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 25154fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org PeerConnectionInterface::RTCOfferAnswerOptions options; 25164fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org options.use_rtp_mux = true; 25174fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 25184fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(options); 25197162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org std::string offer_str; 25207162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org offer->ToString(&offer_str); 25217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // Disable rtcp-mux 25227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org const std::string rtcp_mux = "rtcp-mux"; 25237162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org const std::string xrtcp_mux = "xrtcp-mux"; 25242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(rtcp_mux.c_str(), rtcp_mux.length(), 25257162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org xrtcp_mux.c_str(), xrtcp_mux.length(), 25267162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org &offer_str); 25277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org JsepSessionDescription *local_offer = 25287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 25297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); 2530f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); 25317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org JsepSessionDescription *remote_offer = 25327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 25337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); 2534f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); 25357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // Trying unmodified SDP. 25367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org SetLocalDescriptionWithoutError(offer); 25377162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org} 25387162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 25390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, SetAudioPlayout) { 25405aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 25410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 25420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 25430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 25440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel != NULL); 25450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, channel->recv_streams().size()); 25460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 receive_ssrc = channel->recv_streams()[0].first_ssrc(); 25470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org double left_vol, right_vol; 25480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 25490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, left_vol); 25500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, right_vol); 25512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer()); 25527162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org session_->SetAudioPlayout(receive_ssrc, false, renderer.get()); 25530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 25540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, left_vol); 25550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, right_vol); 25567162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, renderer->channel_id()); 25577162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org session_->SetAudioPlayout(receive_ssrc, true, NULL); 25580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol)); 25590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, left_vol); 25600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, right_vol); 25617162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(-1, renderer->channel_id()); 25620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, SetAudioSend) { 25655aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 25660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 25670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 25680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 25690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel != NULL); 25700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, channel->send_streams().size()); 25710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 25720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 25730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options; 25750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.echo_cancellation.Set(true); 25760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25772a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer()); 25787162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org session_->SetAudioSend(send_ssrc, false, options, renderer.get()); 25790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->IsStreamMuted(send_ssrc)); 25800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->options().echo_cancellation.IsSet()); 25817162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, renderer->channel_id()); 2582e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(renderer->sink() != NULL); 25830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2584e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // This will trigger SetSink(NULL) to the |renderer|. 25857162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org session_->SetAudioSend(send_ssrc, true, options, NULL); 25860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 25870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool value; 25880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->options().echo_cancellation.Get(&value)); 25890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(value); 25907162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(-1, renderer->channel_id()); 2591e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(renderer->sink() == NULL); 2592e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org} 2593e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 2594e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.orgTEST_F(WebRtcSessionTest, AudioRendererForLocalStream) { 2595e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org Init(NULL); 2596e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 2597e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 2598e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 2599e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org ASSERT_TRUE(channel != NULL); 2600e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org ASSERT_EQ(1u, channel->send_streams().size()); 2601e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 2602e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 26032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer()); 2604e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org cricket::AudioOptions options; 2605e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org session_->SetAudioSend(send_ssrc, true, options, renderer.get()); 2606e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(renderer->sink() != NULL); 2607e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 2608e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // Delete the |renderer| and it will trigger OnClose() to the sink, and this 2609e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // will invalidate the |renderer_| pointer in the sink and prevent getting a 2610e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // SetSink(NULL) callback afterwards. 2611e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org renderer.reset(); 2612e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 2613e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // This will trigger SetSink(NULL) if no OnClose() callback. 2614e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org session_->SetAudioSend(send_ssrc, true, options, NULL); 26150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, SetVideoPlayout) { 26185aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 26190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 26200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 26210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVideoMediaChannel* channel = media_engine_->GetVideoChannel(0); 26220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel != NULL); 26230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LT(0u, channel->renderers().size()); 26240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == NULL); 26250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, channel->recv_streams().size()); 26260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 receive_ssrc = channel->recv_streams()[0].first_ssrc(); 26270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVideoRenderer renderer; 26280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->SetVideoPlayout(receive_ssrc, true, &renderer); 26290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == &renderer); 26300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->SetVideoPlayout(receive_ssrc, false, &renderer); 26310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->renderers().begin()->second == NULL); 26320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, SetVideoSend) { 26355aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 26360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 26370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 26380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeVideoMediaChannel* channel = media_engine_->GetVideoChannel(0); 26390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel != NULL); 26400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, channel->send_streams().size()); 26410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 26420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 26430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VideoOptions* options = NULL; 26440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->SetVideoSend(send_ssrc, false, options); 26450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel->IsStreamMuted(send_ssrc)); 26460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->SetVideoSend(send_ssrc, true, options); 26470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel->IsStreamMuted(send_ssrc)); 26480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CanNotInsertDtmf) { 26510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestCanInsertDtmf(false); 26520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, CanInsertDtmf) { 26550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestCanInsertDtmf(true); 26560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, InsertDtmf) { 26590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Setup 26605aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 26610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 26620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateAndSetRemoteOfferAndLocalAnswer(); 26630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 26640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, channel->dtmf_info_queue().size()); 26650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Insert DTMF 26670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const int expected_flags = DF_SEND; 26680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const int expected_duration = 90; 26690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->InsertDtmf(kAudioTrack1, 0, expected_duration); 26700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->InsertDtmf(kAudioTrack1, 1, expected_duration); 26710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->InsertDtmf(kAudioTrack1, 2, expected_duration); 26720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify 26740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(3U, channel->dtmf_info_queue().size()); 26750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32 send_ssrc = channel->send_streams()[0].first_ssrc(); 26760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[0], send_ssrc, 0, 26770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_duration, expected_flags)); 26780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[1], send_ssrc, 1, 26790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_duration, expected_flags)); 26800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareDtmfInfo(channel->dtmf_info_queue()[2], send_ssrc, 2, 26810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_duration, expected_flags)); 26820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the |initiator| flag when session initiates the call. 26850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorFlagAsOriginator) { 26865aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 26870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->initiator()); 26884fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 26890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 26900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 26910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->initiator()); 26920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 26930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->initiator()); 26940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the |initiator| flag when session receives the call. 26970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorFlagAsReceiver) { 26985aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 26990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->initiator()); 27000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 27010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 27025aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 27030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->initiator()); 27050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 27060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->initiator()); 27070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the ice protocol type at initiator of the call 27100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// if |a=ice-options:google-ice| is present in answer. 27110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorGIceInAnswer) { 27125aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 27130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 27144fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 27152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 27165aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateRemoteAnswer(offer)); 27170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 27180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 27190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 27200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adding ice-options to the session level. 27210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("t=0 0\r\n", 27220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:google-ice\r\n", 27230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 27240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer_with_gice = 27250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 27260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer_with_gice); 27270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_GOOGLE); 27280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_GOOGLE); 27290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the ice protocol type at initiator of the call 27320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// if ICE RFC5245 is supported in answer. 27330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestInitiatorIceInAnswer) { 27345aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 27350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 27364fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 27370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 27380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 27390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer); 27410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_RFC5245); 27420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_RFC5245); 27430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the ice protocol type at receiver side of the call if 27460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// receiver decides to use google-ice. 27470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiverGIceInOffer) { 27485aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 27490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 27504fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 27510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 27522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 27535aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 27540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 27550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 27560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adding ice-options to the session level. 27570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("t=0 0\r\n", 27580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:google-ice\r\n", 27590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 27600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer_with_gice = 27610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 27620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer_with_gice); 27630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_GOOGLE); 27640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_GOOGLE); 27650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the ice protocol type at receiver side of the call if 27680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// receiver decides to use ice RFC 5245. 27690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestReceiverIceInOffer) { 27705aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 27710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 27724fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 27730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 27745aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 27750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 27760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("audio", cricket::ICEPROTO_RFC5245); 27770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTransportType("video", cricket::ICEPROTO_RFC5245); 27780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the session state when ICE RFC5245 in offer and 27810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// ICE google-ice in answer. 27820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestIceOfferGIceOnlyAnswer) { 27835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 27840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 27854fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 27864fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 27870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string offer_str; 27880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer->ToString(&offer_str); 27890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Disable google-ice 27900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string gice_option = "google-ice"; 27910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string xgoogle_xice = "xgoogle-xice"; 27922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(gice_option.c_str(), gice_option.length(), 27930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xgoogle_xice.c_str(), xgoogle_xice.length(), 27940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &offer_str); 27950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription *ice_only_offer = 27960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kOffer); 27970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE((ice_only_offer)->Initialize(offer_str, NULL)); 27980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(ice_only_offer); 27990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string original_offer_sdp; 28000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&original_offer_sdp)); 28011a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org SessionDescriptionInterface* pranswer_with_gice = 28020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kPrAnswer, 28031a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org original_offer_sdp, NULL); 2804f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionPranswerExpectError(kPushDownTDFailed, 2805f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org pranswer_with_gice); 28061a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org SessionDescriptionInterface* answer_with_gice = 28070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, 28081a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org original_offer_sdp, NULL); 2809f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionAnswerExpectError(kPushDownTDFailed, 2810f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org answer_with_gice); 28110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 28120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifing local offer and remote answer have matching m-lines as per RFC 3264. 28140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestIncorrectMLinesInRemoteAnswer) { 28155aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 28160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 28174fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 28180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 28192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 28200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(session_->local_description())); 28210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 28230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_copy->RemoveContentByName("video"); 28241a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org JsepSessionDescription* modified_answer = 28251a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 28260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(modified_answer->Initialize(answer_copy, 28280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer->session_id(), 28290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer->session_version())); 2830f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionAnswerExpectError(kMlineMismatch, modified_answer); 28310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2832cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org // Different content names. 28330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 28340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 28350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kAudioMid = "a=mid:audio"; 28360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string kAudioMidReplaceStr = "a=mid:audio_content_name"; 28372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(kAudioMid.c_str(), kAudioMid.length(), 28380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kAudioMidReplaceStr.c_str(), 28390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kAudioMidReplaceStr.length(), 28400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 28411a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org SessionDescriptionInterface* modified_answer1 = 28421a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 2843f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionAnswerExpectError(kMlineMismatch, modified_answer1); 28440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2845cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org // Different media types. 2846cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 2847cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org const std::string kAudioMline = "m=audio"; 2848cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org const std::string kAudioMlineReplaceStr = "m=video"; 28492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(kAudioMline.c_str(), kAudioMline.length(), 2850cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org kAudioMlineReplaceStr.c_str(), 2851cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org kAudioMlineReplaceStr.length(), 2852cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org &sdp); 2853cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org SessionDescriptionInterface* modified_answer2 = 2854cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL); 2855cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org SetRemoteDescriptionAnswerExpectError(kMlineMismatch, modified_answer2); 2856cf402e4e30f3b7538d0d71f5fc91b505e496247dwu@webrtc.org 28570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(answer.release()); 28580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 28590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying remote offer and local answer have matching m-lines as per 28610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// RFC 3264. 28620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestIncorrectMLinesInLocalAnswer) { 28635aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 28640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 28650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 28660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 28675aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 28680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* answer_copy = answer->description()->Copy(); 28700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_copy->RemoveContentByName("video"); 28711a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org JsepSessionDescription* modified_answer = 28721a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org new JsepSessionDescription(JsepSessionDescription::kAnswer); 28730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(modified_answer->Initialize(answer_copy, 28750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer->session_id(), 28760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer->session_version())); 2877f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionAnswerExpectError(kMlineMismatch, modified_answer); 28780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 28790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 28800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that WebRtcSession does not start candidate allocation 28820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// before SetLocalDescription is called. 28830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestIceStartAfterSetLocalDescriptionOnly) { 28845aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 28850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 28860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(); 28870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate; 28880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate.set_component(1); 28890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, 28900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate); 28910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); 28920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate1; 28930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1.set_component(1); 28940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1, 28950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate1); 28960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate1)); 28970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer); 28980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(session_->GetTransportProxy("audio") != NULL); 28990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(session_->GetTransportProxy("video") != NULL); 29000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pump for 1 second and verify that no candidates are generated. 29022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->ProcessMessages(1000); 29030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(observer_.mline_0_candidates_.empty()); 29040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(observer_.mline_1_candidates_.empty()); 29050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29065aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SessionDescriptionInterface* answer = CreateAnswer(NULL); 29070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer); 29080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("audio")->negotiated()); 29090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->GetTransportProxy("video")->negotiated()); 29100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); 29110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 29120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that crypto parameter is updated in local session 29140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// description as per security policy set in MediaSessionDescriptionFactory. 29150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) { 29165aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 29170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 29184fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 29190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Making sure SetLocalDescription correctly sets crypto value in 29210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescription object after de-serialization of sdp string. The value 29220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // will be set as per MediaSessionDescriptionFactory. 29230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string offer_str; 29240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer->ToString(&offer_str); 29250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* jsep_offer_str = 29260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); 29270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(jsep_offer_str); 29280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->voice_channel()->secure_required()); 29290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(session_->video_channel()->secure_required()); 29300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 29310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the crypto parameter when security is disabled. 29330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescriptionWithDisabled) { 29345c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options_.disable_encryption = true; 29355aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 29360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 29374fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 29380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Making sure SetLocalDescription correctly sets crypto value in 29400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescription object after de-serialization of sdp string. The value 29410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // will be set as per MediaSessionDescriptionFactory. 29420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string offer_str; 29430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer->ToString(&offer_str); 29440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface *jsep_offer_str = 29450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); 29460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(jsep_offer_str); 29470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->voice_channel()->secure_required()); 29480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(session_->video_channel()->secure_required()); 29490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 29500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that an answer contains new ufrag and password if an offer 29520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// with new ufrag and password is received. 29530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) { 29545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 29550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 29560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 29572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer( 29580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteOffer(options)); 29590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 29600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 29622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 29635aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 29640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(answer.release()); 29650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Receive an offer with new ufrag and password. 29670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.transport_options.ice_restart = true; 29682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> updated_offer1( 29695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateRemoteOffer(options, session_->remote_description())); 29700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(updated_offer1.release()); 29710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( 29735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 29740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareIceUfragAndPassword(updated_answer1->description(), 29760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->local_description()->description(), 29770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org false); 29780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(updated_answer1.release()); 29805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 29815aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 29825aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// This test verifies that an answer contains old ufrag and password if an offer 29835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// with old ufrag and password is received. 29845aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { 29855aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 29865aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org cricket::MediaSessionOptions options; 29875aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org options.has_video = true; 29882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> offer( 29895aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateRemoteOffer(options)); 29905aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 29915aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 29925aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 29932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer( 29945aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 29955aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SetLocalDescriptionWithoutError(answer.release()); 29960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29975aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // Receive an offer without changed ufrag or password. 29980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.transport_options.ice_restart = false; 29992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<JsepSessionDescription> updated_offer2( 30005aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateRemoteOffer(options, session_->remote_description())); 30010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetRemoteDescriptionWithoutError(updated_offer2.release()); 30020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( 30045aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org CreateAnswer(NULL)); 30050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareIceUfragAndPassword(updated_answer2->description(), 30070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org session_->local_description()->description(), 30080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org true); 30090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(updated_answer2.release()); 30110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSessionContentError) { 30145aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 30150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 30164fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 30170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_id_orig = offer->session_id(); 30180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string session_version_orig = offer->session_version(); 30190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 30200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 30220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_channel_->set_fail_set_send_codecs(true); 30230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream2(); 30251a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org SessionDescriptionInterface* answer = 30261a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org CreateRemoteAnswer(session_->local_description()); 3027f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionAnswerExpectError("ERROR_CONTENT", answer); 30280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Runs the loopback call test with BUNDLE and STUN disabled. 30310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestIceStatesBasic) { 30320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Lets try with only UDP ports. 303341c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 30340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PORTALLOCATOR_DISABLE_TCP | 30350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PORTALLOCATOR_DISABLE_STUN | 30360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY); 30370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestLoopbackCall(); 30380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3040c3792f79c0296e4fb07e49ef395710c573c34e6dmallinath@webrtc.org// Runs the loopback call test with BUNDLE and STUN enabled. 3041f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestIceStatesBundle) { 304241c4db4baf4ecf1e3e5e91178534a2603b7dce87buildbot@webrtc.org allocator_->set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 3043f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org cricket::PORTALLOCATOR_ENABLE_BUNDLE | 3044c3792f79c0296e4fb07e49ef395710c573c34e6dmallinath@webrtc.org cricket::PORTALLOCATOR_DISABLE_TCP | 3045f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY); 3046f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org TestLoopbackCall(); 3047f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org} 3048f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org 3049f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcSessionTest, SetSdpFailedOnSessionError) { 30505aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 30510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 30520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.has_video = true; 30530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3054f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org cricket::BaseSession::Error error_code = cricket::BaseSession::ERROR_CONTENT; 3055f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string error_code_str = "ERROR_CONTENT"; 3056f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string error_desc = "Fake session error description."; 3057f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org session_->SetError(error_code, error_desc); 3058f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 30590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* offer = CreateRemoteOffer(options); 30600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface* answer = 30610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteAnswer(offer, options); 3062f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 3063f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string action; 3064f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::ostringstream session_error_msg; 3065f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org session_error_msg << kSessionError << error_code_str << ". "; 3066f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org session_error_msg << kSessionErrorDesc << error_desc << "."; 3067f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetRemoteDescriptionExpectError(action, session_error_msg.str(), offer); 3068f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org SetLocalDescriptionExpectError(action, session_error_msg.str(), answer); 30690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestRtpDataChannel) { 30720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_.reset(new FakeConstraints()); 30730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_->AddOptional( 30740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaConstraintsInterface::kEnableRtpDataChannels, true); 30755aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org Init(NULL); 30760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithDataChannel(); 30780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); 30790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { 30822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 30830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_.reset(new FakeConstraints()); 30850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_->AddOptional( 30860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaConstraintsInterface::kEnableRtpDataChannels, true); 30875c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options_.disable_sctp_data_channels = false; 30885c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 3089ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 30900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithDataChannel(); 30920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); 30930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30954ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) { 30962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 30974ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org 3098ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 3099ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org 31004fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 3101ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org EXPECT_TRUE(offer->description()->GetContentByName("data") == NULL); 3102391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org EXPECT_TRUE(offer->description()->GetTransportInfoByName("data") == NULL); 3103391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org} 3104391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org 3105391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerWithSctpInOfferAndNoStreams) { 31062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 3107391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org SetFactoryDtlsSrtp(); 3108ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 3109391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org 3110391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org // Create remote offer with SCTP. 3111391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org cricket::MediaSessionOptions options; 3112391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org options.data_channel_type = cricket::DCT_SCTP; 3113391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org JsepSessionDescription* offer = 3114ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED); 3115391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org SetRemoteDescriptionWithoutError(offer); 3116391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org 3117391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org // Verifies the answer contains SCTP. 31182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 3119391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org EXPECT_TRUE(answer != NULL); 3120391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org EXPECT_TRUE(answer->description()->GetContentByName("data") != NULL); 3121391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org EXPECT_TRUE(answer->description()->GetTransportInfoByName("data") != NULL); 3122ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org} 3123ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org 31240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { 31250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_.reset(new FakeConstraints()); 31260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org constraints_->AddOptional( 3127ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false); 3128ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 31290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithDataChannel(); 31310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); 31320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSctpDataChannelWithDtls) { 31352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 31360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3137ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 31380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetLocalDescriptionWithDataChannel(); 31400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); 31410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31425aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 31435c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcSessionTest, TestDisableSctpDataChannels) { 31442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 31455c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options_.disable_sctp_data_channels = true; 3146ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 31475c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 31485c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org SetLocalDescriptionWithDataChannel(); 31495c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); 31505c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org} 31515c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 31528841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestSctpDataChannelSendPortParsing) { 31532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 31548841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const int new_send_port = 9998; 31558841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org const int new_recv_port = 7775; 31568841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 3157ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 31588841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SetFactoryDtlsSrtp(); 31598841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31608841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // By default, don't actually add the codecs to desc_factory_; they don't 31618841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // actually get serialized for SCTP in BuildMediaDescription(). Instead, 31628841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // let the session description get parsed. That'll get the proper codecs 31638841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // into the stream. 31648841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org cricket::MediaSessionOptions options; 31658841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org JsepSessionDescription* offer = CreateRemoteOfferWithSctpPort( 31668841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org "stream1", new_send_port, options); 31678841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31688841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // SetRemoteDescription will take the ownership of the offer. 31698841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SetRemoteDescriptionWithoutError(offer); 31708841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31718841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SessionDescriptionInterface* answer = ChangeSDPSctpPort( 31728841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org new_recv_port, CreateAnswer(NULL)); 31738841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ASSERT_TRUE(answer != NULL); 31748841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31758841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // Now set the local description, which'll take ownership of the answer. 31768841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org SetLocalDescriptionWithoutError(answer); 31778841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31788841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // TEST PLAN: Set the port number to something new, set it in the SDP, 31798841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org // and pass it all the way down. 31808485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::InternalDataChannelInit dci; 31818841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org dci.reliable = true; 31828841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); 31832a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> dc = 31848841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org session_->CreateDataChannel("datachannel", &dci); 31858841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31868841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org cricket::FakeDataMediaChannel* ch = data_engine_->GetChannel(0); 31878841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org int portnum = -1; 31888841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ASSERT_TRUE(ch != NULL); 31898841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ASSERT_EQ(1UL, ch->send_codecs().size()); 31908841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_EQ(cricket::kGoogleSctpDataCodecId, ch->send_codecs()[0].id); 31918841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_TRUE(!strcmp(cricket::kGoogleSctpDataCodecName, 31928841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ch->send_codecs()[0].name.c_str())); 31938841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_TRUE(ch->send_codecs()[0].GetParam(cricket::kCodecParamPort, 31948841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org &portnum)); 31958841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_EQ(new_send_port, portnum); 31968841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 31978841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ASSERT_EQ(1UL, ch->recv_codecs().size()); 31988841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_EQ(cricket::kGoogleSctpDataCodecId, ch->recv_codecs()[0].id); 31998841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_TRUE(!strcmp(cricket::kGoogleSctpDataCodecName, 32008841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org ch->recv_codecs()[0].name.c_str())); 32018841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_TRUE(ch->recv_codecs()[0].GetParam(cricket::kCodecParamPort, 32028841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org &portnum)); 32038841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org EXPECT_EQ(new_recv_port, portnum); 32048841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org} 32058841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org 32065aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateOffer succeeds when CreateOffer is called before async 32075aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// identity generation is finished. 32085aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferBeforeIdentityRequestReturnSuccess) { 32092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 3210ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 32115aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32125aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(session_->waiting_for_identity()); 3213ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 32144fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 32154fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 32165aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(offer != NULL); 3217ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(offer->description(), true); 3218ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(offer->description(), true); 32195aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32205aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32215aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateAnswer succeeds when CreateOffer is called before async 32225aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// identity generation is finished. 32235aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateAnswerBeforeIdentityRequestReturnSuccess) { 32242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 3225ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 3226ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetFactoryDtlsSrtp(); 32275aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32285aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org cricket::MediaSessionOptions options; 3229ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org options.has_video = true; 32305aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org scoped_ptr<JsepSessionDescription> offer( 3231ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org CreateRemoteOffer(options, cricket::SEC_DISABLED)); 32325aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org ASSERT_TRUE(offer.get() != NULL); 32335aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org SetRemoteDescriptionWithoutError(offer.release()); 32345aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); 32365aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(answer != NULL); 3237ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyNoCryptoParams(answer->description(), true); 3238ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org VerifyFingerprintStatus(answer->description(), true); 32395aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32405aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32415aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateOffer succeeds when CreateOffer is called after async 32425aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// identity generation is finished. 32435aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnSuccess) { 32442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 3245ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org InitWithDtls(); 32465aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32475aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE_WAIT(!session_->waiting_for_identity(), 1000); 32484fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 32494fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 32505aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(offer != NULL); 32515aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32525aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32535aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateOffer fails when CreateOffer is called after async 32545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// identity generation fails. 32555aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnFailure) { 32562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 3257c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org InitWithDtls(true); 32585aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32595aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE_WAIT(!session_->waiting_for_identity(), 1000); 32604fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 32614fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 32625aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org EXPECT_TRUE(offer == NULL); 32635aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32645aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32655aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateOffer succeeds when Multiple CreateOffer calls are made 32665aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// before async identity generation is finished. 32675aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, 32685aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org TestMultipleCreateOfferBeforeIdentityRequestReturnSuccess) { 32692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 32705aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org VerifyMultipleAsyncCreateDescription( 32715aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org true, CreateSessionDescriptionRequest::kOffer); 32725aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32745aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateOffer fails when Multiple CreateOffer calls are made 32755aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// before async identity generation fails. 32765aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, 32775aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org TestMultipleCreateOfferBeforeIdentityRequestReturnFailure) { 32782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 32795aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org VerifyMultipleAsyncCreateDescription( 32805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org false, CreateSessionDescriptionRequest::kOffer); 32815aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32825aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateAnswer succeeds when Multiple CreateAnswer calls are made 32845aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// before async identity generation is finished. 32855aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, 32865aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org TestMultipleCreateAnswerBeforeIdentityRequestReturnSuccess) { 32872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 32885aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org VerifyMultipleAsyncCreateDescription( 32895aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org true, CreateSessionDescriptionRequest::kAnswer); 32905aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 32915aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 32925aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// Verifies that CreateAnswer fails when Multiple CreateAnswer calls are made 32935aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org// before async identity generation fails. 32945aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(WebRtcSessionTest, 32955aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org TestMultipleCreateAnswerBeforeIdentityRequestReturnFailure) { 32962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 32975aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org VerifyMultipleAsyncCreateDescription( 32985aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org false, CreateSessionDescriptionRequest::kAnswer); 32995aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 33005528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org 33015528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org// Verifies that setRemoteDescription fails when DTLS is disabled and the remote 33025528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org// offer has no SDES crypto but only DTLS fingerprint. 33035528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.orgTEST_F(WebRtcSessionTest, TestSetRemoteOfferFailIfDtlsDisabledAndNoCrypto) { 33045528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org // Init without DTLS. 33055528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org Init(NULL); 33065528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org // Create a remote offer with secured transport disabled. 33075528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org cricket::MediaSessionOptions options; 33085528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org JsepSessionDescription* offer(CreateRemoteOffer( 33095528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org options, cricket::SEC_DISABLED)); 33105528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org // Adds a DTLS fingerprint to the remote offer. 33115528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org cricket::SessionDescription* sdp = offer->description(); 33125528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org TransportInfo* audio = sdp->GetTransportInfoByName("audio"); 33135528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(audio != NULL); 33145528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(audio->description.identity_fingerprint.get() == NULL); 33155528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org audio->description.identity_fingerprint.reset( 33162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLFingerprint::CreateFromRfc4572( 33172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::DIGEST_SHA_256, kFakeDtlsFingerprint)); 3318ac5a3e5f1e59174797dc60641cba617c1bf0c279henrike@webrtc.org SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto, 3319f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org offer); 33205528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org} 33215528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org 332280303b162fe139828d0661df23e03f09126508acwu@webrtc.org// This test verifies DSCP is properly applied on the media channels. 332380303b162fe139828d0661df23e03f09126508acwu@webrtc.orgTEST_F(WebRtcSessionTest, TestDscpConstraint) { 332480303b162fe139828d0661df23e03f09126508acwu@webrtc.org constraints_.reset(new FakeConstraints()); 332580303b162fe139828d0661df23e03f09126508acwu@webrtc.org constraints_->AddOptional( 332680303b162fe139828d0661df23e03f09126508acwu@webrtc.org webrtc::MediaConstraintsInterface::kEnableDscp, true); 332780303b162fe139828d0661df23e03f09126508acwu@webrtc.org Init(NULL); 332880303b162fe139828d0661df23e03f09126508acwu@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 33294fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 333080303b162fe139828d0661df23e03f09126508acwu@webrtc.org 333180303b162fe139828d0661df23e03f09126508acwu@webrtc.org SetLocalDescriptionWithoutError(offer); 333280303b162fe139828d0661df23e03f09126508acwu@webrtc.org 333380303b162fe139828d0661df23e03f09126508acwu@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 333480303b162fe139828d0661df23e03f09126508acwu@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 333580303b162fe139828d0661df23e03f09126508acwu@webrtc.org 333680303b162fe139828d0661df23e03f09126508acwu@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 333780303b162fe139828d0661df23e03f09126508acwu@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 333880303b162fe139828d0661df23e03f09126508acwu@webrtc.org cricket::AudioOptions audio_options; 333980303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(voice_channel_->GetOptions(&audio_options)); 334080303b162fe139828d0661df23e03f09126508acwu@webrtc.org cricket::VideoOptions video_options; 334180303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(video_channel_->GetOptions(&video_options)); 334280303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(audio_options.dscp.IsSet()); 334380303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(audio_options.dscp.GetWithDefaultIfUnset(false)); 334480303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(video_options.dscp.IsSet()); 334580303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(video_options.dscp.GetWithDefaultIfUnset(false)); 334680303b162fe139828d0661df23e03f09126508acwu@webrtc.org} 334780303b162fe139828d0661df23e03f09126508acwu@webrtc.org 3348bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.orgTEST_F(WebRtcSessionTest, TestSuspendBelowMinBitrateConstraint) { 3349bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org constraints_.reset(new FakeConstraints()); 3350bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org constraints_->AddOptional( 3351bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org webrtc::MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate, 3352bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org true); 3353bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org Init(NULL); 3354bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 33554fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 3356bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org 3357bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org SetLocalDescriptionWithoutError(offer); 3358bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org 3359bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org video_channel_ = media_engine_->GetVideoChannel(0); 3360bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org 3361bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org ASSERT_TRUE(video_channel_ != NULL); 3362bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org cricket::VideoOptions video_options; 3363bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org EXPECT_TRUE(video_channel_->GetOptions(&video_options)); 3364bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org EXPECT_TRUE( 3365bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org video_options.suspend_below_min_bitrate.GetWithDefaultIfUnset(false)); 3366bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org} 3367bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org 3368b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.orgTEST_F(WebRtcSessionTest, TestNumUnsignalledRecvStreamsConstraint) { 3369b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org // Number of unsignalled receiving streams should be between 0 and 3370b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org // kMaxUnsignalledRecvStreams. 3371b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org SetAndVerifyNumUnsignalledRecvStreams(10, 10); 3372b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org SetAndVerifyNumUnsignalledRecvStreams(kMaxUnsignalledRecvStreams + 1, 3373b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org kMaxUnsignalledRecvStreams); 3374b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org SetAndVerifyNumUnsignalledRecvStreams(-1, 0); 3375b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org} 3376b752f54aad7adfda3ccf223fb86f23c8b3ae7283buildbot@webrtc.org 33775462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcSessionTest, TestCombinedAudioVideoBweConstraint) { 33785462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org constraints_.reset(new FakeConstraints()); 33795462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org constraints_->AddOptional( 33805462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org webrtc::MediaConstraintsInterface::kCombinedAudioVideoBwe, 33815462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org true); 33825462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org Init(NULL); 33835462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org mediastream_signaling_.SendAudioVideoStream1(); 33845462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 33855462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33865462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org SetLocalDescriptionWithoutError(offer); 33875462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33885462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org voice_channel_ = media_engine_->GetVoiceChannel(0); 33895462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33905462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org ASSERT_TRUE(voice_channel_ != NULL); 33915462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::AudioOptions audio_options; 33925462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(voice_channel_->GetOptions(&audio_options)); 33935462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE( 33945462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org audio_options.combined_audio_video_bwe.GetWithDefaultIfUnset(false)); 33955462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org} 33965462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33973588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org// Tests that we can renegotiate new media content with ICE candidates in the 33983588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org// new remote SDP. 33993588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.orgTEST_F(WebRtcSessionTest, TestRenegotiateNewMediaWithCandidatesInSdp) { 34002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 34013588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org InitWithDtls(); 34023588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetFactoryDtlsSrtp(); 34033588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34043588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 34054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 34063588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetLocalDescriptionWithoutError(offer); 34073588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34083588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 34093588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetRemoteDescriptionWithoutError(answer); 34103588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34113588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org cricket::MediaSessionOptions options; 34123588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org options.has_video = true; 34133588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org offer = CreateRemoteOffer(options, cricket::SEC_DISABLED); 34143588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34153588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org cricket::Candidate candidate1; 34162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org candidate1.set_address(rtc::SocketAddress("1.1.1.1", 5000)); 34173588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org candidate1.set_component(1); 34183588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName1, kMediaContentIndex1, 34193588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org candidate1); 34203588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); 34213588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetRemoteDescriptionWithoutError(offer); 34223588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34233588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org answer = CreateAnswer(NULL); 34243588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetLocalDescriptionWithoutError(answer); 34253588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org} 34263588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34273588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org// Tests that we can renegotiate new media content with ICE candidates separated 34283588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org// from the remote SDP. 34293588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.orgTEST_F(WebRtcSessionTest, TestRenegotiateNewMediaWithCandidatesSeparated) { 34302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 34313588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org InitWithDtls(); 34323588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetFactoryDtlsSrtp(); 34333588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34343588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org mediastream_signaling_.UseOptionsAudioOnly(); 34354fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org SessionDescriptionInterface* offer = CreateOffer(); 34363588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetLocalDescriptionWithoutError(offer); 34373588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34383588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SessionDescriptionInterface* answer = CreateRemoteAnswer(offer); 34393588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetRemoteDescriptionWithoutError(answer); 34403588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34413588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org cricket::MediaSessionOptions options; 34423588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org options.has_video = true; 34433588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org offer = CreateRemoteOffer(options, cricket::SEC_DISABLED); 34443588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetRemoteDescriptionWithoutError(offer); 34453588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34463588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org cricket::Candidate candidate1; 34472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org candidate1.set_address(rtc::SocketAddress("1.1.1.1", 5000)); 34483588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org candidate1.set_component(1); 34493588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org JsepIceCandidate ice_candidate(kMediaContentName1, kMediaContentIndex1, 34503588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org candidate1); 34513588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate)); 34523588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34533588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org answer = CreateAnswer(NULL); 34543588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org SetLocalDescriptionWithoutError(answer); 34553588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org} 34563588cd9ca934134ac5512fa6afc36fcf533a0040jiayl@webrtc.org 34570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 34580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// currently fails because upon disconnection and reconnection OnIceComplete is 34590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// called more than once without returning to IceGatheringGathering. 3460