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