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"
29c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h"
303db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/gunit.h"
313db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/logging.h"
323db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/ssladapter.h"
333db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/sslstreamadapter.h"
343db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/stringencode.h"
353db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org#include "talk/base/stringutils.h"
363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
37c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org#define MAYBE_SKIP_TEST(feature)                    \
38c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  if (!(feature())) {                               \
39c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    LOG(LS_INFO) << "Feature disabled... skipping"; \
40c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    return;                                         \
41c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
42c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
43c52cd4636b0f9633649ede99e28a6ab518870728jiayl@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";
53c52cd4636b0f9633649ede99e28a6ab518870728jiayl@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;
713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  talk_base::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) {
783db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  talk_base::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:
129c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  typedef std::vector<talk_base::scoped_refptr<DataChannelInterface> >
130c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      DataChannelList;
131c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
1323db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  PeerConnectionEndToEndTest()
1333db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      : caller_(new talk_base::RefCountedObject<PeerConnectionTestWrapper>(
1343db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                    "caller")),
1353db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org        callee_(new talk_base::RefCountedObject<PeerConnectionTestWrapper>(
1363db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org                    "callee")) {
1373db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    talk_base::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());
148c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
149c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    caller_->SignalOnDataChannel.connect(
150c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org        this, &PeerConnectionEndToEndTest::OnCallerAddedDataChanel);
151c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    callee_->SignalOnDataChannel.connect(
152c52cd4636b0f9633649ede99e28a6ab518870728jiayl@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
178c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void WaitForConnection() {
179c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    caller_->WaitForConnection();
180c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    callee_->WaitForConnection();
181c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
182c52cd4636b0f9633649ede99e28a6ab518870728jiayl@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
214c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void OnCallerAddedDataChanel(DataChannelInterface* dc) {
215c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    caller_signaled_data_channels_.push_back(dc);
216c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
217c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
218c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void OnCalleeAddedDataChannel(DataChannelInterface* dc) {
219c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    callee_signaled_data_channels_.push_back(dc);
220c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
221c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
222c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  // Tests that |dc1| and |dc2| can send to and receive from each other.
223c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void TestDataChannelSendAndReceive(
224c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      DataChannelInterface* dc1, DataChannelInterface* dc2) {
225c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    talk_base::scoped_ptr<webrtc::MockDataChannelObserver> dc1_observer(
226c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org        new webrtc::MockDataChannelObserver(dc1));
227c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
228c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    talk_base::scoped_ptr<webrtc::MockDataChannelObserver> dc2_observer(
229c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org        new webrtc::MockDataChannelObserver(dc2));
230c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
231c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    static const std::string kDummyData = "abcdefg";
232c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    webrtc::DataBuffer buffer(kDummyData);
233c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_TRUE(dc1->Send(buffer));
234c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(kDummyData, dc2_observer->last_message(), kMaxWait);
235c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
236c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_TRUE(dc2->Send(buffer));
237c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(kDummyData, dc1_observer->last_message(), kMaxWait);
238c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
239c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ(1U, dc1_observer->received_message_count());
240c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ(1U, dc2_observer->received_message_count());
241c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
242c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
243c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void WaitForDataChannelsToOpen(DataChannelInterface* local_dc,
244c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                                 const DataChannelList& remote_dc_list,
245c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                                 size_t remote_dc_index) {
246c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kOpen, local_dc->state(), kMaxWait);
247c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
248c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_TRUE_WAIT(remote_dc_list.size() > remote_dc_index, kMaxWait);
249c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kOpen,
250c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                   remote_dc_list[remote_dc_index]->state(),
251c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                   kMaxWait);
252c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ(local_dc->id(), remote_dc_list[remote_dc_index]->id());
253c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
254c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
255c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  void CloseDataChannels(DataChannelInterface* local_dc,
256c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                         const DataChannelList& remote_dc_list,
257c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                         size_t remote_dc_index) {
258c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    local_dc->Close();
259c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kClosed, local_dc->state(), kMaxWait);
260c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org    EXPECT_EQ_WAIT(DataChannelInterface::kClosed,
261c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                   remote_dc_list[remote_dc_index]->state(),
262c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org                   kMaxWait);
263c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  }
264c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
2653db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  ~PeerConnectionEndToEndTest() {
2663db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    talk_base::CleanupSSL();
2673db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
2683db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org
2693db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org protected:
2703db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  talk_base::scoped_refptr<PeerConnectionTestWrapper> caller_;
2713db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  talk_base::scoped_refptr<PeerConnectionTestWrapper> callee_;
272c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  DataChannelList caller_signaled_data_channels_;
273c52cd4636b0f9633649ede99e28a6ab518870728jiayl@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
300c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// Verifies that a DataChannel created before the negotiation can transition to
301c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// "OPEN" and transfer data.
302c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) {
303c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp);
304c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
305c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CreatePcs();
306c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
307c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  webrtc::DataChannelInit init;
308c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc(
309c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
310c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> callee_dc(
311c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
312c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
313c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  Negotiate();
314c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForConnection();
315c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
316c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0);
317c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
318c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
319c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[0]);
320c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
321c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
322c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0);
323c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
324c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org}
325c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
326c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// Verifies that a DataChannel created after the negotiation can transition to
327c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// "OPEN" and transfer data.
328c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) {
329c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp);
330c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
331c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CreatePcs();
332c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
333c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  webrtc::DataChannelInit init;
334c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
335c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  // This DataChannel is for creating the data content in the negotiation.
336c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> dummy(
337c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
338c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  Negotiate();
339c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForConnection();
340c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
341c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  // Creates new DataChannels after the negotiation and verifies their states.
342c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc(
343c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("hello", init));
344c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> callee_dc(
345c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      callee_->CreateDataChannel("hello", init));
346c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
347c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1);
348c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
349c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
350c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]);
351c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
352c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
353c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1);
354c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
355c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org}
356c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
357c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// Verifies that DataChannel IDs are even/odd based on the DTLS roles.
358c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) {
359c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp);
360c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
361c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CreatePcs();
362c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
363c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  webrtc::DataChannelInit init;
364c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc_1(
365c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
366c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> callee_dc_1(
367c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
368c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
369c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  Negotiate();
370c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForConnection();
371c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
372c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(1U, caller_dc_1->id() % 2);
373c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(0U, callee_dc_1->id() % 2);
374c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
375c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc_2(
376c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
377c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> callee_dc_2(
378c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      callee_->CreateDataChannel("data", init));
379c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
380c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(1U, caller_dc_2->id() % 2);
381c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(0U, callee_dc_2->id() % 2);
382c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org}
383c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
384c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// Verifies that the message is received by the right remote DataChannel when
385c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org// there are multiple DataChannels.
386c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.orgTEST_F(PeerConnectionEndToEndTest,
387c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org       MessageTransferBetweenTwoPairsOfDataChannels) {
388c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp);
389c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
390c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  CreatePcs();
391c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
392c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  webrtc::DataChannelInit init;
393c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
394c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc_1(
395c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
396c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_refptr<DataChannelInterface> caller_dc_2(
397c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      caller_->CreateDataChannel("data", init));
398c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
399c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  Negotiate();
400c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForConnection();
401c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc_1, callee_signaled_data_channels_, 0);
402c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  WaitForDataChannelsToOpen(caller_dc_2, callee_signaled_data_channels_, 1);
403c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
404c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_ptr<webrtc::MockDataChannelObserver> dc_1_observer(
405c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[0]));
406c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
407c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  talk_base::scoped_ptr<webrtc::MockDataChannelObserver> dc_2_observer(
408c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[1]));
409c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
410c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  const std::string message_1 = "hello 1";
411c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  const std::string message_2 = "hello 2";
412c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
413c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  caller_dc_1->Send(webrtc::DataBuffer(message_1));
414c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
415c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
416c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  caller_dc_2->Send(webrtc::DataBuffer(message_2));
417c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
418c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org
419c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(1U, dc_1_observer->received_message_count());
420c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org  EXPECT_EQ(1U, dc_2_observer->received_message_count());
421c52cd4636b0f9633649ede99e28a6ab518870728jiayl@webrtc.org}
422658f43950900bf88b33f7e9f95fe8fdc4d2cda91wu@webrtc.org#endif // if !defined(THREAD_SANITIZER)
423