128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2012 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1933584f942c6e1723918d9d2b76f429ab8396751efischman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2033584f942c6e1723918d9d2b76f429ab8396751efischman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string> 290eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg#include <utility> 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnectionfactory.h" 3337ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#ifdef WEBRTC_ANDROID 3437ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#include "talk/app/webrtc/test/androidtestinitializer.h" 3537ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#endif 365e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström#include "talk/app/webrtc/test/fakedtlsidentitystore.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/fakevideotrackrenderer.h" 38a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/app/webrtc/videosourceinterface.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakevideocapturer.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtccommon.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcvoe.h" 42a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 43a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 44a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/thread.h" 450c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter#include "webrtc/p2p/client/fakeportallocator.h" 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.orgusing webrtc::DataChannelInterface; 485e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boströmusing webrtc::DtlsIdentityStoreInterface; 495e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boströmusing webrtc::FakeVideoTrackRenderer; 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaStreamInterface; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionFactoryInterface; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionInterface; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionObserver; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoSourceInterface; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoTrackInterface; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunIceServer[] = "stun:stun.l.google.com:19302"; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234"; 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnIceServerWithTransport[] = 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org "turn:test@hello.com?transport=tcp"; 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kSecureTurnIceServer[] = 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org "turns:test@hello.com?transport=tcp"; 6578187525665490922748d79377bcb351579e03c0wu@webrtc.orgstatic const char kSecureTurnIceServerWithoutTransportParam[] = 665bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org "turns:test_no_transport@hello.com:443"; 675bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.orgstatic const char kSecureTurnIceServerWithoutTransportAndPortParam[] = 6878187525665490922748d79377bcb351579e03c0wu@webrtc.org "turns:test_no_transport@hello.com"; 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnIceServerWithNoUsernameInUri[] = 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org "turn:test.com:1234"; 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnPassword[] = "turnpassword"; 7291053e7c5a743f4a92f5079844b0747c927f3bbdwu@webrtc.orgstatic const int kDefaultStunPort = 3478; 7391053e7c5a743f4a92f5079844b0747c927f3bbdwu@webrtc.orgstatic const int kDefaultStunTlsPort = 5349; 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnUsername[] = "test"; 75a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgstatic const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234"; 76a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgstatic const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4"; 77a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgstatic const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234"; 78a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgstatic const char kStunIceServerWithIPv6AddressWithoutPort[] = 79a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org "stun:[2401:fa00:4::]"; 80a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgstatic const char kTurnIceServerWithIPv6Address[] = 81a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org "turn:test@[2401:fa00:4::]:1234"; 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass NullPeerConnectionObserver : public PeerConnectionObserver { 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnMessage(const std::string& msg) {} 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnSignalingMessage(const std::string& msg) {} 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnSignalingChange( 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::SignalingState new_state) {} 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnAddStream(MediaStreamInterface* stream) {} 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRemoveStream(MediaStreamInterface* stream) {} 91c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org virtual void OnDataChannel(DataChannelInterface* data_channel) {} 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRenegotiationNeeded() {} 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceConnectionChange( 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceConnectionState new_state) {} 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceGatheringChange( 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceGatheringState new_state) {} 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {} 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass PeerConnectionFactoryTest : public testing::Test { 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetUp() { 10437ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#ifdef WEBRTC_ANDROID 10537ebcf0ce5ad1685bcf659ea75960beb96019647phoglund webrtc::InitializeAndroidObjects(); 10637ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#endif 107d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org factory_ = webrtc::CreatePeerConnectionFactory(rtc::Thread::Current(), 108d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NULL, 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NULL, 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NULL); 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(factory_.get() != NULL); 1140c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_.reset( 1150c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr)); 1160c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter raw_port_allocator_ = port_allocator_.get(); 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 1200c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter void VerifyStunServers(cricket::ServerAddresses stun_servers) { 1210c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers()); 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1240c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) { 1250c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size()); 1260c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter for (size_t i = 0; i < turn_servers.size(); ++i) { 1270c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_EQ(1u, turn_servers[i].ports.size()); 1280c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size()); 1290c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ( 1300c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers[i].ports[0].address.ToString(), 1310c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter raw_port_allocator_->turn_servers()[i].ports[0].address.ToString()); 1320c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(turn_servers[i].ports[0].proto, 1330c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter raw_port_allocator_->turn_servers()[i].ports[0].proto); 1340c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(turn_servers[i].credentials.username, 1350c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter raw_port_allocator_->turn_servers()[i].credentials.username); 1360c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(turn_servers[i].credentials.password, 1370c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter raw_port_allocator_->turn_servers()[i].credentials.password); 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 141d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_; 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NullPeerConnectionObserver observer_; 1430c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::scoped_ptr<cricket::FakePortAllocator> port_allocator_; 1440c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter // Since the PC owns the port allocator after it's been initialized, 1450c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter // this should only be used when known to be safe. 1460c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::FakePortAllocator* raw_port_allocator_; 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Verify creation of PeerConnection using internal ADM, video factory and 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// internal libjingle threads. 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(PeerConnectionFactoryTestInternal, CreatePCUsingInternalModules) { 15237ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#ifdef WEBRTC_ANDROID 15337ebcf0ce5ad1685bcf659ea75960beb96019647phoglund webrtc::InitializeAndroidObjects(); 15437ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#endif 15537ebcf0ce5ad1685bcf659ea75960beb96019647phoglund 156d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 15728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreatePeerConnectionFactory()); 15828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NullPeerConnectionObserver observer; 1600c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter webrtc::PeerConnectionInterface::RTCConfiguration config; 16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1625e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store( 1635e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 1640eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection( 1650c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, nullptr, std::move(dtls_identity_store), &observer)); 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1675e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström EXPECT_TRUE(pc.get() != nullptr); 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies creation of PeerConnection with valid STUN and TURN 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// configuration. Also verifies the URL's parsed correctly as expected. 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) { 17341451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org PeerConnectionInterface::RTCConfiguration config; 17441451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org webrtc::PeerConnectionInterface::IceServer ice_server; 17541451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org ice_server.uri = kStunIceServer; 17641451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 17741451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org ice_server.uri = kTurnIceServer; 17841451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org ice_server.password = kTurnPassword; 17941451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 18041451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org ice_server.uri = kTurnIceServerWithTransport; 18141451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org ice_server.password = kTurnPassword; 1827c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch config.servers.push_back(ice_server); 1835e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 1845e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 1850eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 1860c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 1870c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::move(dtls_identity_store), &observer_)); 1880c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 1890c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::ServerAddresses stun_servers; 1900c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun1("stun.l.google.com", 19302); 1910c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun1); 1920c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyStunServers(stun_servers); 1930c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 1940c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com", 1950c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_UDP, false); 1960c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn1); 1970c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test", 1980c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_TCP, false); 1990c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn2); 2000c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 2017c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch} 2027c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch 2037c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch// This test verifies creation of PeerConnection with valid STUN and TURN 2047c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch// configuration. Also verifies the list of URL's parsed correctly as expected. 2057c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim BauchTEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) { 2067c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch PeerConnectionInterface::RTCConfiguration config; 2077c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch webrtc::PeerConnectionInterface::IceServer ice_server; 2087c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch ice_server.urls.push_back(kStunIceServer); 2097c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch ice_server.urls.push_back(kTurnIceServer); 2107c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch ice_server.urls.push_back(kTurnIceServerWithTransport); 2117c4e7458b5ce99c13a75d5be7d718ef94e2f8f9fJoachim Bauch ice_server.password = kTurnPassword; 21241451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 2135e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 2145e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 2150eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 2160c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 2170eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg std::move(dtls_identity_store), &observer_)); 2180c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 2190c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::ServerAddresses stun_servers; 2200c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun1("stun.l.google.com", 19302); 2210c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun1); 2220c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyStunServers(stun_servers); 2230c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 2240c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com", 2250c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_UDP, false); 2260c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn1); 2270c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test", 2280c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_TCP, false); 2290c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn2); 2300c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) { 23441451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org PeerConnectionInterface::RTCConfiguration config; 23528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::PeerConnectionInterface::IceServer ice_server; 23628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.uri = kStunIceServer; 23741451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 23828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.uri = kTurnIceServerWithNoUsernameInUri; 23928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.username = kTurnUsername; 24028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.password = kTurnPassword; 24141451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 2425e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 2435e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 2440eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 2450c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 2460c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::move(dtls_identity_store), &observer_)); 2470c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 2480c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 2490c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername, 2500c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_UDP, false); 2510c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn); 2520c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 25528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies the PeerConnection created properly with TURN url which 25628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// has transport parameter in it. 25728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) { 25841451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org PeerConnectionInterface::RTCConfiguration config; 25928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::PeerConnectionInterface::IceServer ice_server; 26028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.uri = kTurnIceServerWithTransport; 26128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.password = kTurnPassword; 26241451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 2635e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 2645e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 2650eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 2660c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 2670c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::move(dtls_identity_store), &observer_)); 2680c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 2690c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 2700c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test", 2710c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_TCP, false); 2720c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn); 2730c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 27428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 27528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 27628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) { 27741451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org PeerConnectionInterface::RTCConfiguration config; 27828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::PeerConnectionInterface::IceServer ice_server; 27928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.uri = kSecureTurnIceServer; 28028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_server.password = kTurnPassword; 28141451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 28278187525665490922748d79377bcb351579e03c0wu@webrtc.org ice_server.uri = kSecureTurnIceServerWithoutTransportParam; 28378187525665490922748d79377bcb351579e03c0wu@webrtc.org ice_server.password = kTurnPassword; 28441451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 2855bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam; 2865bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org ice_server.password = kTurnPassword; 28741451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 2885e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 2895e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 2900eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 2910c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 2920c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::move(dtls_identity_store), &observer_)); 2930c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 2940c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 2950c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test", 2960c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_TCP, true); 2970c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn1); 29878187525665490922748d79377bcb351579e03c0wu@webrtc.org // TURNS with transport param should be default to tcp. 2990c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport", 3000c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter kTurnPassword, cricket::PROTO_TCP, true); 3010c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn2); 3020c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort, 3030c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter "test_no_transport", kTurnPassword, 3040c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::PROTO_TCP, true); 3050c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn3); 3060c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 307a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org} 308a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org 309a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgTEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) { 31041451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org PeerConnectionInterface::RTCConfiguration config; 311a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org webrtc::PeerConnectionInterface::IceServer ice_server; 312a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.uri = kStunIceServerWithIPv4Address; 31341451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 314a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort; 31541451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 316a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.uri = kStunIceServerWithIPv6Address; 31741451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 318a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort; 31941451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 320a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.uri = kTurnIceServerWithIPv6Address; 321a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org ice_server.password = kTurnPassword; 32241451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org config.servers.push_back(ice_server); 3235e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store( 3245e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström new FakeDtlsIdentityStore()); 3250eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection( 3260c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, nullptr, std::move(port_allocator_), 3270c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::move(dtls_identity_store), &observer_)); 3280c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter ASSERT_TRUE(pc.get() != NULL); 3290c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::ServerAddresses stun_servers; 3300c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun1("1.2.3.4", 1234); 3310c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun1); 3320c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun2("1.2.3.4", 3478); 3330c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun2); // Default port 3340c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun3("2401:fa00:4::", 1234); 3350c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun3); 3360c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::SocketAddress stun4("2401:fa00:4::", 3478); 3370c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter stun_servers.insert(stun4); // Default port 3380c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyStunServers(stun_servers); 339f875f15afb5013e45b1af295b15ef4853c46a53bbuildbot@webrtc.org 3400c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter std::vector<cricket::RelayServerConfig> turn_servers; 3410c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword, 3420c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::PROTO_UDP, false); 3430c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter turn_servers.push_back(turn1); 3440c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter VerifyTurnServers(turn_servers); 34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies the captured stream is rendered locally using a 34828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// local video track. 34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionFactoryTest, LocalRendering) { 35028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeVideoCapturer* capturer = new cricket::FakeVideoCapturer(); 35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The source take ownership of |capturer|. 352d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<VideoSourceInterface> source( 35328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org factory_->CreateVideoSource(capturer, NULL)); 35428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(source.get() != NULL); 355d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<VideoTrackInterface> track( 35628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org factory_->CreateVideoTrack("testlabel", source)); 35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(track.get() != NULL); 35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeVideoTrackRenderer local_renderer(track); 35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 36028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0, local_renderer.num_rendered_frames()); 36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(capturer->CaptureFrame()); 36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1, local_renderer.num_rendered_frames()); 36328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 36428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track->set_enabled(false); 36528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(capturer->CaptureFrame()); 36628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1, local_renderer.num_rendered_frames()); 36728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 36828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track->set_enabled(true); 36928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(capturer->CaptureFrame()); 37028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(2, local_renderer.num_rendered_frames()); 37128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 372d83f4eff84d872da3e38e1a61d669fc407ce7adfjiayl@webrtc.org 373