blob: b874f95a793001fc860b38929d8e7835706f0b05 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellanderb24317b2016-02-10 15:54:434 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:369 */
10
11#include <string>
kwiberg0eb15ed2015-12-17 11:04:1512#include <utility>
henrike@webrtc.org28e20752013-07-10 00:45:3613
Henrik Kjellander15583c12016-02-10 09:53:1214#include "webrtc/api/mediastreaminterface.h"
15#include "webrtc/api/peerconnectionfactory.h"
phoglund37ebcf02016-01-08 13:04:5716#ifdef WEBRTC_ANDROID
Henrik Kjellander15583c12016-02-10 09:53:1217#include "webrtc/api/test/androidtestinitializer.h"
phoglund37ebcf02016-01-08 13:04:5718#endif
Henrik Kjellander15583c12016-02-10 09:53:1219#include "webrtc/api/test/fakedtlsidentitystore.h"
20#include "webrtc/api/test/fakevideotrackrenderer.h"
21#include "webrtc/api/videosourceinterface.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:0822#include "webrtc/base/gunit.h"
23#include "webrtc/base/scoped_ptr.h"
24#include "webrtc/base/thread.h"
kjellandera96e2d72016-02-05 07:52:2825#include "webrtc/media/base/fakevideocapturer.h"
kjellander@webrtc.org5ad12972016-02-12 05:39:4026#include "webrtc/media/engine/webrtccommon.h"
27#include "webrtc/media/engine/webrtcvoe.h"
Taylor Brandstetter0c7e9f52015-12-29 22:14:5228#include "webrtc/p2p/client/fakeportallocator.h"
henrike@webrtc.org28e20752013-07-10 00:45:3629
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:2930using webrtc::DataChannelInterface;
Henrik Boström5e56c592015-08-11 08:33:1331using webrtc::DtlsIdentityStoreInterface;
32using webrtc::FakeVideoTrackRenderer;
henrike@webrtc.org28e20752013-07-10 00:45:3633using webrtc::MediaStreamInterface;
34using webrtc::PeerConnectionFactoryInterface;
35using webrtc::PeerConnectionInterface;
36using webrtc::PeerConnectionObserver;
henrike@webrtc.org28e20752013-07-10 00:45:3637using webrtc::VideoSourceInterface;
38using webrtc::VideoTrackInterface;
39
40namespace {
41
henrike@webrtc.org28e20752013-07-10 00:45:3642static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
43static const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234";
44static const char kTurnIceServerWithTransport[] =
45 "turn:test@hello.com?transport=tcp";
46static const char kSecureTurnIceServer[] =
47 "turns:test@hello.com?transport=tcp";
wu@webrtc.org78187522013-10-07 23:32:0248static const char kSecureTurnIceServerWithoutTransportParam[] =
sergeyu@chromium.org5bc25c42013-12-05 00:24:0649 "turns:test_no_transport@hello.com:443";
50static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
wu@webrtc.org78187522013-10-07 23:32:0251 "turns:test_no_transport@hello.com";
henrike@webrtc.org28e20752013-07-10 00:45:3652static const char kTurnIceServerWithNoUsernameInUri[] =
53 "turn:test.com:1234";
54static const char kTurnPassword[] = "turnpassword";
wu@webrtc.org91053e72013-08-10 07:18:0455static const int kDefaultStunPort = 3478;
56static const int kDefaultStunTlsPort = 5349;
henrike@webrtc.org28e20752013-07-10 00:45:3657static const char kTurnUsername[] = "test";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:5258static const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234";
59static const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4";
60static const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234";
61static const char kStunIceServerWithIPv6AddressWithoutPort[] =
62 "stun:[2401:fa00:4::]";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:5263static const char kTurnIceServerWithIPv6Address[] =
64 "turn:test@[2401:fa00:4::]:1234";
henrike@webrtc.org28e20752013-07-10 00:45:3665
66class NullPeerConnectionObserver : public PeerConnectionObserver {
67 public:
henrike@webrtc.org28e20752013-07-10 00:45:3668 virtual void OnMessage(const std::string& msg) {}
69 virtual void OnSignalingMessage(const std::string& msg) {}
70 virtual void OnSignalingChange(
71 PeerConnectionInterface::SignalingState new_state) {}
72 virtual void OnAddStream(MediaStreamInterface* stream) {}
73 virtual void OnRemoveStream(MediaStreamInterface* stream) {}
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:2974 virtual void OnDataChannel(DataChannelInterface* data_channel) {}
henrike@webrtc.org28e20752013-07-10 00:45:3675 virtual void OnRenegotiationNeeded() {}
76 virtual void OnIceConnectionChange(
77 PeerConnectionInterface::IceConnectionState new_state) {}
78 virtual void OnIceGatheringChange(
79 PeerConnectionInterface::IceGatheringState new_state) {}
80 virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {}
81};
82
83} // namespace
84
85class PeerConnectionFactoryTest : public testing::Test {
86 void SetUp() {
phoglund37ebcf02016-01-08 13:04:5787#ifdef WEBRTC_ANDROID
88 webrtc::InitializeAndroidObjects();
89#endif
buildbot@webrtc.orgd4e598d2014-07-29 17:36:5290 factory_ = webrtc::CreatePeerConnectionFactory(rtc::Thread::Current(),
91 rtc::Thread::Current(),
henrike@webrtc.org28e20752013-07-10 00:45:3692 NULL,
93 NULL,
94 NULL);
95
96 ASSERT_TRUE(factory_.get() != NULL);
Taylor Brandstetter0c7e9f52015-12-29 22:14:5297 port_allocator_.reset(
98 new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
99 raw_port_allocator_ = port_allocator_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36100 }
101
102 protected:
Taylor Brandstetter0c7e9f52015-12-29 22:14:52103 void VerifyStunServers(cricket::ServerAddresses stun_servers) {
104 EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
henrike@webrtc.org28e20752013-07-10 00:45:36105 }
106
Taylor Brandstetter0c7e9f52015-12-29 22:14:52107 void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
108 EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
109 for (size_t i = 0; i < turn_servers.size(); ++i) {
110 ASSERT_EQ(1u, turn_servers[i].ports.size());
111 EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
112 EXPECT_EQ(
113 turn_servers[i].ports[0].address.ToString(),
114 raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
115 EXPECT_EQ(turn_servers[i].ports[0].proto,
116 raw_port_allocator_->turn_servers()[i].ports[0].proto);
117 EXPECT_EQ(turn_servers[i].credentials.username,
118 raw_port_allocator_->turn_servers()[i].credentials.username);
119 EXPECT_EQ(turn_servers[i].credentials.password,
120 raw_port_allocator_->turn_servers()[i].credentials.password);
henrike@webrtc.org28e20752013-07-10 00:45:36121 }
122 }
123
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52124 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
henrike@webrtc.org28e20752013-07-10 00:45:36125 NullPeerConnectionObserver observer_;
Taylor Brandstetter0c7e9f52015-12-29 22:14:52126 rtc::scoped_ptr<cricket::FakePortAllocator> port_allocator_;
127 // Since the PC owns the port allocator after it's been initialized,
128 // this should only be used when known to be safe.
129 cricket::FakePortAllocator* raw_port_allocator_;
henrike@webrtc.org28e20752013-07-10 00:45:36130};
131
132// Verify creation of PeerConnection using internal ADM, video factory and
133// internal libjingle threads.
134TEST(PeerConnectionFactoryTestInternal, CreatePCUsingInternalModules) {
phoglund37ebcf02016-01-08 13:04:57135#ifdef WEBRTC_ANDROID
136 webrtc::InitializeAndroidObjects();
137#endif
138
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52139 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
henrike@webrtc.org28e20752013-07-10 00:45:36140 webrtc::CreatePeerConnectionFactory());
141
142 NullPeerConnectionObserver observer;
Taylor Brandstetter0c7e9f52015-12-29 22:14:52143 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36144
Henrik Boström5e56c592015-08-11 08:33:13145 rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store(
146 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15147 rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52148 config, nullptr, nullptr, std::move(dtls_identity_store), &observer));
henrike@webrtc.org28e20752013-07-10 00:45:36149
Henrik Boström5e56c592015-08-11 08:33:13150 EXPECT_TRUE(pc.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36151}
152
153// This test verifies creation of PeerConnection with valid STUN and TURN
154// configuration. Also verifies the URL's parsed correctly as expected.
155TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
buildbot@webrtc.org41451d42014-05-03 05:39:45156 PeerConnectionInterface::RTCConfiguration config;
157 webrtc::PeerConnectionInterface::IceServer ice_server;
158 ice_server.uri = kStunIceServer;
159 config.servers.push_back(ice_server);
160 ice_server.uri = kTurnIceServer;
161 ice_server.password = kTurnPassword;
162 config.servers.push_back(ice_server);
163 ice_server.uri = kTurnIceServerWithTransport;
164 ice_server.password = kTurnPassword;
165 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13166 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
167 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15168 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52169 config, nullptr, std::move(port_allocator_),
170 std::move(dtls_identity_store), &observer_));
171 ASSERT_TRUE(pc.get() != NULL);
172 cricket::ServerAddresses stun_servers;
173 rtc::SocketAddress stun1("stun.l.google.com", 19302);
174 stun_servers.insert(stun1);
175 VerifyStunServers(stun_servers);
176 std::vector<cricket::RelayServerConfig> turn_servers;
177 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
178 kTurnPassword, cricket::PROTO_UDP, false);
179 turn_servers.push_back(turn1);
180 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
181 kTurnPassword, cricket::PROTO_TCP, false);
182 turn_servers.push_back(turn2);
183 VerifyTurnServers(turn_servers);
buildbot@webrtc.org41451d42014-05-03 05:39:45184}
185
186// This test verifies creation of PeerConnection with valid STUN and TURN
Joachim Bauch7c4e7452015-05-28 21:06:30187// configuration. Also verifies the list of URL's parsed correctly as expected.
188TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
189 PeerConnectionInterface::RTCConfiguration config;
190 webrtc::PeerConnectionInterface::IceServer ice_server;
191 ice_server.urls.push_back(kStunIceServer);
192 ice_server.urls.push_back(kTurnIceServer);
193 ice_server.urls.push_back(kTurnIceServerWithTransport);
194 ice_server.password = kTurnPassword;
195 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13196 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
197 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15198 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52199 config, nullptr, std::move(port_allocator_),
kwiberg0eb15ed2015-12-17 11:04:15200 std::move(dtls_identity_store), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 22:14:52201 ASSERT_TRUE(pc.get() != NULL);
202 cricket::ServerAddresses stun_servers;
203 rtc::SocketAddress stun1("stun.l.google.com", 19302);
204 stun_servers.insert(stun1);
205 VerifyStunServers(stun_servers);
206 std::vector<cricket::RelayServerConfig> turn_servers;
207 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
208 kTurnPassword, cricket::PROTO_UDP, false);
209 turn_servers.push_back(turn1);
210 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
211 kTurnPassword, cricket::PROTO_TCP, false);
212 turn_servers.push_back(turn2);
213 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36214}
215
216TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
buildbot@webrtc.org41451d42014-05-03 05:39:45217 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36218 webrtc::PeerConnectionInterface::IceServer ice_server;
219 ice_server.uri = kStunIceServer;
buildbot@webrtc.org41451d42014-05-03 05:39:45220 config.servers.push_back(ice_server);
henrike@webrtc.org28e20752013-07-10 00:45:36221 ice_server.uri = kTurnIceServerWithNoUsernameInUri;
222 ice_server.username = kTurnUsername;
223 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45224 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13225 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
226 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15227 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52228 config, nullptr, std::move(port_allocator_),
229 std::move(dtls_identity_store), &observer_));
230 ASSERT_TRUE(pc.get() != NULL);
231 std::vector<cricket::RelayServerConfig> turn_servers;
232 cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
233 kTurnPassword, cricket::PROTO_UDP, false);
234 turn_servers.push_back(turn);
235 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36236}
237
238// This test verifies the PeerConnection created properly with TURN url which
239// has transport parameter in it.
240TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
buildbot@webrtc.org41451d42014-05-03 05:39:45241 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36242 webrtc::PeerConnectionInterface::IceServer ice_server;
243 ice_server.uri = kTurnIceServerWithTransport;
244 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45245 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13246 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
247 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15248 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52249 config, nullptr, std::move(port_allocator_),
250 std::move(dtls_identity_store), &observer_));
251 ASSERT_TRUE(pc.get() != NULL);
252 std::vector<cricket::RelayServerConfig> turn_servers;
253 cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test",
254 kTurnPassword, cricket::PROTO_TCP, false);
255 turn_servers.push_back(turn);
256 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36257}
258
henrike@webrtc.org28e20752013-07-10 00:45:36259TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
buildbot@webrtc.org41451d42014-05-03 05:39:45260 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36261 webrtc::PeerConnectionInterface::IceServer ice_server;
262 ice_server.uri = kSecureTurnIceServer;
263 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45264 config.servers.push_back(ice_server);
wu@webrtc.org78187522013-10-07 23:32:02265 ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
266 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45267 config.servers.push_back(ice_server);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06268 ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
269 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45270 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13271 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
272 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15273 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52274 config, nullptr, std::move(port_allocator_),
275 std::move(dtls_identity_store), &observer_));
276 ASSERT_TRUE(pc.get() != NULL);
277 std::vector<cricket::RelayServerConfig> turn_servers;
278 cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test",
279 kTurnPassword, cricket::PROTO_TCP, true);
280 turn_servers.push_back(turn1);
wu@webrtc.org78187522013-10-07 23:32:02281 // TURNS with transport param should be default to tcp.
Taylor Brandstetter0c7e9f52015-12-29 22:14:52282 cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport",
283 kTurnPassword, cricket::PROTO_TCP, true);
284 turn_servers.push_back(turn2);
285 cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
286 "test_no_transport", kTurnPassword,
287 cricket::PROTO_TCP, true);
288 turn_servers.push_back(turn3);
289 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36290}
291
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52292TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
buildbot@webrtc.org41451d42014-05-03 05:39:45293 PeerConnectionInterface::RTCConfiguration config;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52294 webrtc::PeerConnectionInterface::IceServer ice_server;
295 ice_server.uri = kStunIceServerWithIPv4Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45296 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52297 ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45298 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52299 ice_server.uri = kStunIceServerWithIPv6Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45300 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52301 ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45302 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52303 ice_server.uri = kTurnIceServerWithIPv6Address;
304 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45305 config.servers.push_back(ice_server);
Henrik Boström5e56c592015-08-11 08:33:13306 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store(
307 new FakeDtlsIdentityStore());
kwiberg0eb15ed2015-12-17 11:04:15308 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 22:14:52309 config, nullptr, std::move(port_allocator_),
310 std::move(dtls_identity_store), &observer_));
311 ASSERT_TRUE(pc.get() != NULL);
312 cricket::ServerAddresses stun_servers;
313 rtc::SocketAddress stun1("1.2.3.4", 1234);
314 stun_servers.insert(stun1);
315 rtc::SocketAddress stun2("1.2.3.4", 3478);
316 stun_servers.insert(stun2); // Default port
317 rtc::SocketAddress stun3("2401:fa00:4::", 1234);
318 stun_servers.insert(stun3);
319 rtc::SocketAddress stun4("2401:fa00:4::", 3478);
320 stun_servers.insert(stun4); // Default port
321 VerifyStunServers(stun_servers);
buildbot@webrtc.orgf875f152014-04-14 16:06:21322
Taylor Brandstetter0c7e9f52015-12-29 22:14:52323 std::vector<cricket::RelayServerConfig> turn_servers;
324 cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword,
325 cricket::PROTO_UDP, false);
326 turn_servers.push_back(turn1);
327 VerifyTurnServers(turn_servers);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52328}
329
henrike@webrtc.org28e20752013-07-10 00:45:36330// This test verifies the captured stream is rendered locally using a
331// local video track.
332TEST_F(PeerConnectionFactoryTest, LocalRendering) {
333 cricket::FakeVideoCapturer* capturer = new cricket::FakeVideoCapturer();
334 // The source take ownership of |capturer|.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52335 rtc::scoped_refptr<VideoSourceInterface> source(
henrike@webrtc.org28e20752013-07-10 00:45:36336 factory_->CreateVideoSource(capturer, NULL));
337 ASSERT_TRUE(source.get() != NULL);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52338 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36339 factory_->CreateVideoTrack("testlabel", source));
340 ASSERT_TRUE(track.get() != NULL);
341 FakeVideoTrackRenderer local_renderer(track);
342
343 EXPECT_EQ(0, local_renderer.num_rendered_frames());
344 EXPECT_TRUE(capturer->CaptureFrame());
345 EXPECT_EQ(1, local_renderer.num_rendered_frames());
nisse81354f52016-01-19 08:23:24346 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36347
348 track->set_enabled(false);
349 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 08:23:24350 EXPECT_EQ(2, local_renderer.num_rendered_frames());
351 EXPECT_TRUE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36352
353 track->set_enabled(true);
354 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 08:23:24355 EXPECT_EQ(3, local_renderer.num_rendered_frames());
356 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36357}