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