13db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org/*
23db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * libjingle
33db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * Copyright 2013, Google Inc.
43db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *
53db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * Redistribution and use in source and binary forms, with or without
63db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * modification, are permitted provided that the following conditions are met:
73db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *
83db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
93db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *     this list of conditions and the following disclaimer.
103db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *     this list of conditions and the following disclaimer in the documentation
123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *     and/or other materials provided with the distribution.
133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *  3. The name of the author may not be used to endorse or promote products
143db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *     derived from this software without specific prior written permission.
153db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org *
163db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
213db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
223db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
233db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
243db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
253db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
263db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org */
273db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/app/webrtc/test/peerconnectiontestwrapper.h"
292b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h"
302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h"
312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h"
322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/ssladapter.h"
332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h"
342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringencode.h"
352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringutils.h"
363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
372b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org#define MAYBE_SKIP_TEST(feature)                    \
382b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  if (!(feature())) {                               \
392b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    LOG(LS_INFO) << "Feature disabled... skipping"; \
402b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    return;                                         \
412b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
422b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
432b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgusing webrtc::DataChannelInterface;
443db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::FakeConstraints;
453db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::MediaConstraintsInterface;
463db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::MediaStreamInterface;
473db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgusing webrtc::PeerConnectionInterface;
483db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
493db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgnamespace {
503db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
513db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgconst char kExternalGiceUfrag[] = "1234567890123456";
523db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgconst char kExternalGicePwd[] = "123456789012345678901234";
532b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgconst size_t kMaxWait = 10000;
543db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
553db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid RemoveLinesFromSdp(const std::string& line_start,
563db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                               std::string* sdp) {
573db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const char kSdpLineEnd[] = "\r\n";
583db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  size_t ssrc_pos = 0;
593db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  while ((ssrc_pos = sdp->find(line_start, ssrc_pos)) !=
603db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      std::string::npos) {
613db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    size_t end_ssrc = sdp->find(kSdpLineEnd, ssrc_pos);
623db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    sdp->erase(ssrc_pos, end_ssrc - ssrc_pos + strlen(kSdpLineEnd));
633db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
643db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org// Add |newlines| to the |message| after |line|.
673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid InjectAfter(const std::string& line,
683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                 const std::string& newlines,
693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                 std::string* message) {
703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const std::string tmp = line + newlines;
712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::replace_substrs(line.c_str(), line.length(),
723db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                             tmp.c_str(), tmp.length(), message);
733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid Replace(const std::string& line,
763db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org             const std::string& newlines,
773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org             std::string* message) {
782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::replace_substrs(line.c_str(), line.length(),
793db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                             newlines.c_str(), newlines.length(), message);
803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
813db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
823db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid UseExternalSdes(std::string* sdp) {
833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  // Remove current crypto specification.
843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  RemoveLinesFromSdp("a=crypto", sdp);
853db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  RemoveLinesFromSdp("a=fingerprint", sdp);
863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  // Add external crypto.
873db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const char kAudioSdes[] =
883db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR\r\n";
903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const char kVideoSdes[] =
913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj\r\n";
933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const char kDataSdes[] =
943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj\r\n";
963db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:audio\r\n", kAudioSdes, sdp);
973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:video\r\n", kVideoSdes, sdp);
983db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:data\r\n", kDataSdes, sdp);
993db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
1003db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1013db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid UseGice(std::string* sdp) {
1023db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("t=0 0\r\n", "a=ice-options:google-ice\r\n", sdp);
1033db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1043db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  std::string ufragline = "a=ice-ufrag:";
1053db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  std::string pwdline = "a=ice-pwd:";
1063db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  RemoveLinesFromSdp(ufragline, sdp);
1073db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  RemoveLinesFromSdp(pwdline, sdp);
1083db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  ufragline.append(kExternalGiceUfrag);
1093db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  ufragline.append("\r\n");
1103db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  pwdline.append(kExternalGicePwd);
1113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  pwdline.append("\r\n");
1123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  const std::string ufrag_pwd = ufragline + pwdline;
1133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1143db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:audio\r\n", ufrag_pwd, sdp);
1153db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:video\r\n", ufrag_pwd, sdp);
1163db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  InjectAfter("a=mid:data\r\n", ufrag_pwd, sdp);
1173db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
1183db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1193db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgvoid RemoveBundle(std::string* sdp) {
1203db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  RemoveLinesFromSdp("a=group:BUNDLE", sdp);
1213db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
1223db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1233db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}  // namespace
1243db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1253db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgclass PeerConnectionEndToEndTest
1263db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    : public sigslot::has_slots<>,
1273db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      public testing::Test {
1283db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org public:
1292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  typedef std::vector<rtc::scoped_refptr<DataChannelInterface> >
1302b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      DataChannelList;
1312b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
1323db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  PeerConnectionEndToEndTest()
1332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      : caller_(new rtc::RefCountedObject<PeerConnectionTestWrapper>(
1343db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                    "caller")),
1352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        callee_(new rtc::RefCountedObject<PeerConnectionTestWrapper>(
1363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                    "callee")) {
1372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::InitializeSSL(NULL);
1383db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1393db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1403db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void CreatePcs() {
1413db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    CreatePcs(NULL);
1423db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1433db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1443db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void CreatePcs(const MediaConstraintsInterface* pc_constraints) {
1453db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    EXPECT_TRUE(caller_->CreatePc(pc_constraints));
1463db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    EXPECT_TRUE(callee_->CreatePc(pc_constraints));
1473db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get());
1482b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
1492b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    caller_->SignalOnDataChannel.connect(
1502b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org        this, &PeerConnectionEndToEndTest::OnCallerAddedDataChanel);
1512b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    callee_->SignalOnDataChannel.connect(
1522b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org        this, &PeerConnectionEndToEndTest::OnCalleeAddedDataChannel);
1533db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1543db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1553db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void GetAndAddUserMedia() {
1563db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    FakeConstraints audio_constraints;
1573db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    FakeConstraints video_constraints;
1583db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    GetAndAddUserMedia(true, audio_constraints, true, video_constraints);
1593db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1603db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1613db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void GetAndAddUserMedia(bool audio, FakeConstraints audio_constraints,
1623db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                          bool video, FakeConstraints video_constraints) {
1633db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    caller_->GetAndAddUserMedia(audio, audio_constraints,
1643db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                                video, video_constraints);
1653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    callee_->GetAndAddUserMedia(audio, audio_constraints,
1663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                                video, video_constraints);
1673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void Negotiate() {
1703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    caller_->CreateOffer(NULL);
1713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1723db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1733db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void WaitForCallEstablished() {
1743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    caller_->WaitForCallEstablished();
1753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    callee_->WaitForCallEstablished();
1763db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1773db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1782b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void WaitForConnection() {
1792b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    caller_->WaitForConnection();
1802b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    callee_->WaitForConnection();
1812b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
1822b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
1833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void SetupLegacySdpConverter() {
1843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    caller_->SignalOnSdpCreated.connect(
1853db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      this, &PeerConnectionEndToEndTest::ConvertToLegacySdp);
1863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    callee_->SignalOnSdpCreated.connect(
1873db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      this, &PeerConnectionEndToEndTest::ConvertToLegacySdp);
1883db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void ConvertToLegacySdp(std::string* sdp) {
1913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    UseExternalSdes(sdp);
1923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    UseGice(sdp);
1933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    RemoveBundle(sdp);
1943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    LOG(LS_INFO) << "ConvertToLegacySdp: " << *sdp;
1953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
1963db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
1973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void SetupGiceConverter() {
1983db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    caller_->SignalOnIceCandidateCreated.connect(
1993db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      this, &PeerConnectionEndToEndTest::AddGiceCredsToCandidate);
2003db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    callee_->SignalOnIceCandidateCreated.connect(
2013db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      this, &PeerConnectionEndToEndTest::AddGiceCredsToCandidate);
2023db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
2033db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
2043db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  void AddGiceCredsToCandidate(std::string* sdp) {
2053db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    std::string gice_creds = " username ";
2063db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    gice_creds.append(kExternalGiceUfrag);
2073db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    gice_creds.append(" password ");
2083db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    gice_creds.append(kExternalGicePwd);
2093db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    gice_creds.append("\r\n");
2103db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    Replace("\r\n", gice_creds, sdp);
2113db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    LOG(LS_INFO) << "AddGiceCredsToCandidate: " << *sdp;
2123db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
2133db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
2142b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void OnCallerAddedDataChanel(DataChannelInterface* dc) {
2152b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    caller_signaled_data_channels_.push_back(dc);
2162b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
2172b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2182b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void OnCalleeAddedDataChannel(DataChannelInterface* dc) {
2192b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    callee_signaled_data_channels_.push_back(dc);
2202b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
2212b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2222b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  // Tests that |dc1| and |dc2| can send to and receive from each other.
2232b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void TestDataChannelSendAndReceive(
2242b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      DataChannelInterface* dc1, DataChannelInterface* dc2) {
2252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc1_observer(
2262b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org        new webrtc::MockDataChannelObserver(dc1));
2272b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2282a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc2_observer(
2292b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org        new webrtc::MockDataChannelObserver(dc2));
2302b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2312b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    static const std::string kDummyData = "abcdefg";
2322b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    webrtc::DataBuffer buffer(kDummyData);
2332b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_TRUE(dc1->Send(buffer));
2342b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(kDummyData, dc2_observer->last_message(), kMaxWait);
2352b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2362b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_TRUE(dc2->Send(buffer));
2372b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(kDummyData, dc1_observer->last_message(), kMaxWait);
2382b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2392b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ(1U, dc1_observer->received_message_count());
2402b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ(1U, dc2_observer->received_message_count());
2412b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
2422b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2432b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void WaitForDataChannelsToOpen(DataChannelInterface* local_dc,
2442b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                                 const DataChannelList& remote_dc_list,
2452b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                                 size_t remote_dc_index) {
2462b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kOpen, local_dc->state(), kMaxWait);
2472b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2482b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_TRUE_WAIT(remote_dc_list.size() > remote_dc_index, kMaxWait);
2492b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kOpen,
2502b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                   remote_dc_list[remote_dc_index]->state(),
2512b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                   kMaxWait);
2522b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ(local_dc->id(), remote_dc_list[remote_dc_index]->id());
2532b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
2542b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2552b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  void CloseDataChannels(DataChannelInterface* local_dc,
2562b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                         const DataChannelList& remote_dc_list,
2572b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                         size_t remote_dc_index) {
2582b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    local_dc->Close();
2592b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kClosed, local_dc->state(), kMaxWait);
2602b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kClosed,
2612b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                   remote_dc_list[remote_dc_index]->state(),
2622b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org                   kMaxWait);
2632b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  }
2642b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
2653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  ~PeerConnectionEndToEndTest() {
2662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::CleanupSSL();
2673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
2683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
2693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org protected:
2702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<PeerConnectionTestWrapper> caller_;
2712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<PeerConnectionTestWrapper> callee_;
2722b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  DataChannelList caller_signaled_data_channels_;
2732b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  DataChannelList callee_signaled_data_channels_;
2743db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org};
2753db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
276658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org// Disable for TSan v2, see
277658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
278658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org#if !defined(THREAD_SANITIZER)
279658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org
2803db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.orgTEST_F(PeerConnectionEndToEndTest, Call) {
2813db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  CreatePcs();
2823db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  GetAndAddUserMedia();
2833db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  Negotiate();
2843db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  WaitForCallEstablished();
2853db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
2863db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
287b694da5277ab6c616cf46d3dee2fdd1da21d9228buildbot@webrtc.org// Disabled per b/14899892
288b694da5277ab6c616cf46d3dee2fdd1da21d9228buildbot@webrtc.orgTEST_F(PeerConnectionEndToEndTest, DISABLED_CallWithLegacySdp) {
2893db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  FakeConstraints pc_constraints;
2903db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  pc_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
2913db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                              false);
2923db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  CreatePcs(&pc_constraints);
2933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  SetupLegacySdpConverter();
2943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  SetupGiceConverter();
2953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  GetAndAddUserMedia();
2963db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  Negotiate();
2973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  WaitForCallEstablished();
2983db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org}
299658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org
3002b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// Verifies that a DataChannel created before the negotiation can transition to
3012b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// "OPEN" and transfer data.
3022b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) {
3032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
3042b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3052b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CreatePcs();
3062b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3072b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  webrtc::DataChannelInit init;
3082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc(
3092b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> callee_dc(
3112b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
3122b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3132b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  Negotiate();
3142b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForConnection();
3152b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3162b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0);
3172b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
3182b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3192b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[0]);
3202b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
3212b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3222b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0);
3232b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
3242b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org}
3252b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3262b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// Verifies that a DataChannel created after the negotiation can transition to
3272b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// "OPEN" and transfer data.
3282b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) {
3292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
3302b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3312b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CreatePcs();
3322b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3332b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  webrtc::DataChannelInit init;
3342b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3352b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  // This DataChannel is for creating the data content in the negotiation.
3362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> dummy(
3372b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3382b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  Negotiate();
3392b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForConnection();
3402b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3412b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  // Creates new DataChannels after the negotiation and verifies their states.
3422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc(
3432b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("hello", init));
3442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> callee_dc(
3452b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      callee_->CreateDataChannel("hello", init));
3462b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3472b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1);
3482b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
3492b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3502b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]);
3512b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
3522b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3532b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1);
3542b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
3552b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org}
3562b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3572b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// Verifies that DataChannel IDs are even/odd based on the DTLS roles.
3582b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) {
3592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
3602b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3612b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CreatePcs();
3622b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3632b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  webrtc::DataChannelInit init;
3642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
3652b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> callee_dc_1(
3672b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
3682b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3692b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  Negotiate();
3702b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForConnection();
3712b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3722b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(1U, caller_dc_1->id() % 2);
3732b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(0U, callee_dc_1->id() % 2);
3742b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
3762b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3772a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> callee_dc_2(
3782b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
3792b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3802b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(1U, caller_dc_2->id() % 2);
3812b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(0U, callee_dc_2->id() % 2);
3822b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org}
3832b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3842b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// Verifies that the message is received by the right remote DataChannel when
3852b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org// there are multiple DataChannels.
3862b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest,
3872b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org       MessageTransferBetweenTwoPairsOfDataChannels) {
3882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
3892b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3902b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  CreatePcs();
3912b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3922b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  webrtc::DataChannelInit init;
3932b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
3952b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
3972b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
3982b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
3992b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  Negotiate();
4002b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForConnection();
4012b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc_1, callee_signaled_data_channels_, 0);
4022b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc_2, callee_signaled_data_channels_, 1);
4032b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc_1_observer(
4052b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[0]));
4062b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc_2_observer(
4082b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[1]));
4092b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4102b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  const std::string message_1 = "hello 1";
4112b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  const std::string message_2 = "hello 2";
4122b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4132b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  caller_dc_1->Send(webrtc::DataBuffer(message_1));
4142b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
4152b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4162b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  caller_dc_2->Send(webrtc::DataBuffer(message_2));
4172b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
4182b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org
4192b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(1U, dc_1_observer->received_message_count());
4202b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org  EXPECT_EQ(1U, dc_2_observer->received_message_count());
4212b70e77dba449835b2ebc97bbed56b069af711b1jiayl@webrtc.org}
422658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org#endif // if !defined(THREAD_SANITIZER)
423