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