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