blob: 773ba0198e5822ccf6c10bbe9b7dc437ef34138f [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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:36 +00009 */
10
kwibergd1fe2812016-04-27 06:47:29 -070011#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012#include <string>
kwiberg0eb15ed2015-12-17 03:04:15 -080013#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070014#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
Karl Wiberg1b0eae32017-10-17 14:48:54 +020016#include "api/audio_codecs/builtin_audio_decoder_factory.h"
17#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/mediastreaminterface.h"
Anders Carlsson67537952018-05-03 11:28:29 +020019#include "api/video_codecs/builtin_video_decoder_factory.h"
20#include "api/video_codecs/builtin_video_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "media/base/fakevideocapturer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "p2p/base/fakeportallocator.h"
23#include "pc/peerconnectionfactory.h"
henrika919dc2e2017-10-12 14:24:55 +020024#include "pc/test/fakeaudiocapturemodule.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/gunit.h"
Patrik Höglund563934e2017-09-15 09:04:28 +020026
ossu7bb87ee2017-01-23 04:56:25 -080027#ifdef WEBRTC_ANDROID
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "pc/test/androidtestinitializer.h"
ossu7bb87ee2017-01-23 04:56:25 -080029#endif
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "pc/test/fakertccertificategenerator.h"
31#include "pc/test/fakevideotrackrenderer.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +000033using webrtc::DataChannelInterface;
Henrik Boström5e56c592015-08-11 10:33:13 +020034using webrtc::FakeVideoTrackRenderer;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035using webrtc::MediaStreamInterface;
36using webrtc::PeerConnectionFactoryInterface;
37using webrtc::PeerConnectionInterface;
38using webrtc::PeerConnectionObserver;
perkja3ede6c2016-03-08 01:27:48 +010039using webrtc::VideoTrackSourceInterface;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040using webrtc::VideoTrackInterface;
41
42namespace {
43
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
45static const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234";
46static const char kTurnIceServerWithTransport[] =
47 "turn:test@hello.com?transport=tcp";
Yves Gerey665174f2018-06-19 15:03:05 +020048static const char kSecureTurnIceServer[] = "turns:test@hello.com?transport=tcp";
wu@webrtc.org78187522013-10-07 23:32:02 +000049static const char kSecureTurnIceServerWithoutTransportParam[] =
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000050 "turns:test_no_transport@hello.com:443";
51static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
wu@webrtc.org78187522013-10-07 23:32:02 +000052 "turns:test_no_transport@hello.com";
Yves Gerey665174f2018-06-19 15:03:05 +020053static const char kTurnIceServerWithNoUsernameInUri[] = "turn:test.com:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054static const char kTurnPassword[] = "turnpassword";
wu@webrtc.org91053e72013-08-10 07:18:04 +000055static const int kDefaultStunPort = 3478;
56static const int kDefaultStunTlsPort = 5349;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057static const char kTurnUsername[] = "test";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000058static 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:52 +000063static const char kTurnIceServerWithIPv6Address[] =
64 "turn:test@[2401:fa00:4::]:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
66class NullPeerConnectionObserver : public PeerConnectionObserver {
67 public:
Henrik Kjellander3fe372d2016-05-12 08:10:52 +020068 virtual ~NullPeerConnectionObserver() = default;
nisse63b14b72017-01-31 03:34:01 -080069 void OnSignalingChange(
70 PeerConnectionInterface::SignalingState new_state) override {}
71 void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {}
72 void OnRemoveStream(
73 rtc::scoped_refptr<MediaStreamInterface> stream) override {}
74 void OnDataChannel(
75 rtc::scoped_refptr<DataChannelInterface> data_channel) override {}
76 void OnRenegotiationNeeded() override {}
77 void OnIceConnectionChange(
78 PeerConnectionInterface::IceConnectionState new_state) override {}
79 void OnIceGatheringChange(
80 PeerConnectionInterface::IceGatheringState new_state) override {}
Yves Gerey665174f2018-06-19 15:03:05 +020081 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
82 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083};
84
85} // namespace
86
87class PeerConnectionFactoryTest : public testing::Test {
88 void SetUp() {
phoglund37ebcf02016-01-08 05:04:57 -080089#ifdef WEBRTC_ANDROID
90 webrtc::InitializeAndroidObjects();
91#endif
henrika919dc2e2017-10-12 14:24:55 +020092 // Use fake audio device module since we're only testing the interface
93 // level, and using a real one could make tests flaky e.g. when run in
94 // parallel.
danilchape9021a32016-05-17 01:52:02 -070095 factory_ = webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +020096 rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
97 rtc::scoped_refptr<webrtc::AudioDeviceModule>(
98 FakeAudioCaptureModule::Create()),
Karl Wiberg1b0eae32017-10-17 14:48:54 +020099 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200100 webrtc::CreateBuiltinAudioDecoderFactory(),
101 webrtc::CreateBuiltinVideoEncoderFactory(),
102 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
103 nullptr /* audio_processing */);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
105 ASSERT_TRUE(factory_.get() != NULL);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800106 port_allocator_.reset(
107 new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
108 raw_port_allocator_ = port_allocator_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
110
111 protected:
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800112 void VerifyStunServers(cricket::ServerAddresses stun_servers) {
113 EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114 }
115
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800116 void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
117 EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
118 for (size_t i = 0; i < turn_servers.size(); ++i) {
119 ASSERT_EQ(1u, turn_servers[i].ports.size());
120 EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
121 EXPECT_EQ(
122 turn_servers[i].ports[0].address.ToString(),
123 raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
124 EXPECT_EQ(turn_servers[i].ports[0].proto,
125 raw_port_allocator_->turn_servers()[i].ports[0].proto);
126 EXPECT_EQ(turn_servers[i].credentials.username,
127 raw_port_allocator_->turn_servers()[i].credentials.username);
128 EXPECT_EQ(turn_servers[i].credentials.password,
129 raw_port_allocator_->turn_servers()[i].credentials.password);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
131 }
132
Florent Castelli72b751a2018-06-28 14:09:33 +0200133 void VerifyAudioCodecCapability(const webrtc::RtpCodecCapability& codec) {
134 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_AUDIO);
135 EXPECT_FALSE(codec.name.empty());
136 EXPECT_GT(codec.clock_rate, 0);
137 EXPECT_GT(codec.num_channels, 0);
138 }
139
140 void VerifyVideoCodecCapability(const webrtc::RtpCodecCapability& codec) {
141 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_VIDEO);
142 EXPECT_FALSE(codec.name.empty());
143 EXPECT_GT(codec.clock_rate, 0);
144 }
145
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000146 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147 NullPeerConnectionObserver observer_;
kwibergd1fe2812016-04-27 06:47:29 -0700148 std::unique_ptr<cricket::FakePortAllocator> port_allocator_;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800149 // Since the PC owns the port allocator after it's been initialized,
150 // this should only be used when known to be safe.
151 cricket::FakePortAllocator* raw_port_allocator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152};
153
154// Verify creation of PeerConnection using internal ADM, video factory and
155// internal libjingle threads.
henrika919dc2e2017-10-12 14:24:55 +0200156// TODO(henrika): disabling this test since relying on real audio can result in
157// flaky tests and focus on details that are out of scope for you might expect
158// for a PeerConnectionFactory unit test.
159// See https://bugs.chromium.org/p/webrtc/issues/detail?id=7806 for details.
160TEST(PeerConnectionFactoryTestInternal, DISABLED_CreatePCUsingInternalModules) {
phoglund37ebcf02016-01-08 05:04:57 -0800161#ifdef WEBRTC_ANDROID
162 webrtc::InitializeAndroidObjects();
163#endif
164
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000165 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200166 webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200167 nullptr /* network_thread */, nullptr /* worker_thread */,
168 nullptr /* signaling_thread */, nullptr /* default_adm */,
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200169 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200170 webrtc::CreateBuiltinAudioDecoderFactory(),
171 webrtc::CreateBuiltinVideoEncoderFactory(),
172 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
173 nullptr /* audio_processing */));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174
175 NullPeerConnectionObserver observer;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800176 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000177
Henrik Boströmd79599d2016-06-01 13:58:50 +0200178 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
179 new FakeRTCCertificateGenerator());
180 rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
181 config, nullptr, nullptr, std::move(cert_generator), &observer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000182
Henrik Boström5e56c592015-08-11 10:33:13 +0200183 EXPECT_TRUE(pc.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184}
185
Florent Castelli72b751a2018-06-28 14:09:33 +0200186TEST_F(PeerConnectionFactoryTest, CheckRtpSenderAudioCapabilities) {
187 webrtc::RtpCapabilities audio_capabilities =
188 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO);
189 EXPECT_FALSE(audio_capabilities.codecs.empty());
190 for (const auto& codec : audio_capabilities.codecs) {
191 VerifyAudioCodecCapability(codec);
192 }
193 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
194 for (const auto& header_extension : audio_capabilities.header_extensions) {
195 EXPECT_FALSE(header_extension.uri.empty());
196 }
197}
198
199TEST_F(PeerConnectionFactoryTest, CheckRtpSenderVideoCapabilities) {
200 webrtc::RtpCapabilities video_capabilities =
201 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_VIDEO);
202 EXPECT_FALSE(video_capabilities.codecs.empty());
203 for (const auto& codec : video_capabilities.codecs) {
204 VerifyVideoCodecCapability(codec);
205 }
206 EXPECT_FALSE(video_capabilities.header_extensions.empty());
207 for (const auto& header_extension : video_capabilities.header_extensions) {
208 EXPECT_FALSE(header_extension.uri.empty());
209 }
210}
211
212TEST_F(PeerConnectionFactoryTest, CheckRtpSenderDataCapabilities) {
213 webrtc::RtpCapabilities data_capabilities =
214 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_DATA);
215 EXPECT_TRUE(data_capabilities.codecs.empty());
216 EXPECT_TRUE(data_capabilities.header_extensions.empty());
217}
218
219TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverAudioCapabilities) {
220 webrtc::RtpCapabilities audio_capabilities =
221 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO);
222 EXPECT_FALSE(audio_capabilities.codecs.empty());
223 for (const auto& codec : audio_capabilities.codecs) {
224 VerifyAudioCodecCapability(codec);
225 }
226 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
227 for (const auto& header_extension : audio_capabilities.header_extensions) {
228 EXPECT_FALSE(header_extension.uri.empty());
229 }
230}
231
232TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverVideoCapabilities) {
233 webrtc::RtpCapabilities video_capabilities =
234 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO);
235 EXPECT_FALSE(video_capabilities.codecs.empty());
236 for (const auto& codec : video_capabilities.codecs) {
237 VerifyVideoCodecCapability(codec);
238 }
239 EXPECT_FALSE(video_capabilities.header_extensions.empty());
240 for (const auto& header_extension : video_capabilities.header_extensions) {
241 EXPECT_FALSE(header_extension.uri.empty());
242 }
243}
244
245TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverDataCapabilities) {
246 webrtc::RtpCapabilities data_capabilities =
247 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_DATA);
248 EXPECT_TRUE(data_capabilities.codecs.empty());
249 EXPECT_TRUE(data_capabilities.header_extensions.empty());
250}
251
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252// This test verifies creation of PeerConnection with valid STUN and TURN
253// configuration. Also verifies the URL's parsed correctly as expected.
254TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000255 PeerConnectionInterface::RTCConfiguration config;
256 webrtc::PeerConnectionInterface::IceServer ice_server;
257 ice_server.uri = kStunIceServer;
258 config.servers.push_back(ice_server);
259 ice_server.uri = kTurnIceServer;
260 ice_server.password = kTurnPassword;
261 config.servers.push_back(ice_server);
262 ice_server.uri = kTurnIceServerWithTransport;
263 ice_server.password = kTurnPassword;
264 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200265 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
266 new FakeRTCCertificateGenerator());
267 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
268 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
269 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800270 ASSERT_TRUE(pc.get() != NULL);
271 cricket::ServerAddresses stun_servers;
272 rtc::SocketAddress stun1("stun.l.google.com", 19302);
273 stun_servers.insert(stun1);
274 VerifyStunServers(stun_servers);
275 std::vector<cricket::RelayServerConfig> turn_servers;
276 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800277 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800278 turn_servers.push_back(turn1);
279 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800280 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800281 turn_servers.push_back(turn2);
282 VerifyTurnServers(turn_servers);
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000283}
284
285// This test verifies creation of PeerConnection with valid STUN and TURN
Joachim Bauch7c4e7452015-05-28 23:06:30 +0200286// configuration. Also verifies the list of URL's parsed correctly as expected.
287TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
288 PeerConnectionInterface::RTCConfiguration config;
289 webrtc::PeerConnectionInterface::IceServer ice_server;
290 ice_server.urls.push_back(kStunIceServer);
291 ice_server.urls.push_back(kTurnIceServer);
292 ice_server.urls.push_back(kTurnIceServerWithTransport);
293 ice_server.password = kTurnPassword;
294 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200295 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
296 new FakeRTCCertificateGenerator());
297 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
298 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
299 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800300 ASSERT_TRUE(pc.get() != NULL);
301 cricket::ServerAddresses stun_servers;
302 rtc::SocketAddress stun1("stun.l.google.com", 19302);
303 stun_servers.insert(stun1);
304 VerifyStunServers(stun_servers);
305 std::vector<cricket::RelayServerConfig> turn_servers;
306 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800307 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800308 turn_servers.push_back(turn1);
309 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800310 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800311 turn_servers.push_back(turn2);
312 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000313}
314
315TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000316 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000317 webrtc::PeerConnectionInterface::IceServer ice_server;
318 ice_server.uri = kStunIceServer;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000319 config.servers.push_back(ice_server);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320 ice_server.uri = kTurnIceServerWithNoUsernameInUri;
321 ice_server.username = kTurnUsername;
322 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000323 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200324 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
325 new FakeRTCCertificateGenerator());
326 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
327 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
328 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800329 ASSERT_TRUE(pc.get() != NULL);
330 std::vector<cricket::RelayServerConfig> turn_servers;
331 cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800332 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800333 turn_servers.push_back(turn);
334 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335}
336
337// This test verifies the PeerConnection created properly with TURN url which
338// has transport parameter in it.
339TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000340 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 webrtc::PeerConnectionInterface::IceServer ice_server;
342 ice_server.uri = kTurnIceServerWithTransport;
343 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000344 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200345 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
346 new FakeRTCCertificateGenerator());
347 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
348 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
349 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800350 ASSERT_TRUE(pc.get() != NULL);
351 std::vector<cricket::RelayServerConfig> turn_servers;
352 cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800353 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800354 turn_servers.push_back(turn);
355 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356}
357
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000359 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 webrtc::PeerConnectionInterface::IceServer ice_server;
361 ice_server.uri = kSecureTurnIceServer;
362 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000363 config.servers.push_back(ice_server);
wu@webrtc.org78187522013-10-07 23:32:02 +0000364 ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
365 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000366 config.servers.push_back(ice_server);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000367 ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
368 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000369 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200370 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
371 new FakeRTCCertificateGenerator());
372 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
373 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
374 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800375 ASSERT_TRUE(pc.get() != NULL);
376 std::vector<cricket::RelayServerConfig> turn_servers;
377 cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800378 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800379 turn_servers.push_back(turn1);
wu@webrtc.org78187522013-10-07 23:32:02 +0000380 // TURNS with transport param should be default to tcp.
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800381 cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport",
hnsl277b2502016-12-13 05:17:23 -0800382 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800383 turn_servers.push_back(turn2);
384 cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
385 "test_no_transport", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800386 cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800387 turn_servers.push_back(turn3);
388 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389}
390
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000391TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000392 PeerConnectionInterface::RTCConfiguration config;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000393 webrtc::PeerConnectionInterface::IceServer ice_server;
394 ice_server.uri = kStunIceServerWithIPv4Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000395 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000396 ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000397 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000398 ice_server.uri = kStunIceServerWithIPv6Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000399 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000400 ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000401 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000402 ice_server.uri = kTurnIceServerWithIPv6Address;
403 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000404 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200405 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
406 new FakeRTCCertificateGenerator());
407 rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
408 config, nullptr, std::move(port_allocator_), std::move(cert_generator),
409 &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800410 ASSERT_TRUE(pc.get() != NULL);
411 cricket::ServerAddresses stun_servers;
412 rtc::SocketAddress stun1("1.2.3.4", 1234);
413 stun_servers.insert(stun1);
414 rtc::SocketAddress stun2("1.2.3.4", 3478);
415 stun_servers.insert(stun2); // Default port
416 rtc::SocketAddress stun3("2401:fa00:4::", 1234);
417 stun_servers.insert(stun3);
418 rtc::SocketAddress stun4("2401:fa00:4::", 3478);
419 stun_servers.insert(stun4); // Default port
420 VerifyStunServers(stun_servers);
buildbot@webrtc.orgf875f152014-04-14 16:06:21 +0000421
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800422 std::vector<cricket::RelayServerConfig> turn_servers;
423 cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800424 cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800425 turn_servers.push_back(turn1);
426 VerifyTurnServers(turn_servers);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000427}
428
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429// This test verifies the captured stream is rendered locally using a
430// local video track.
431TEST_F(PeerConnectionFactoryTest, LocalRendering) {
Tommi1829af62018-02-06 09:29:17 +0100432 cricket::FakeVideoCapturerWithTaskQueue* capturer =
433 new cricket::FakeVideoCapturerWithTaskQueue();
deadbeef112b2e92017-02-10 20:13:37 -0800434 // The source takes ownership of |capturer|, but we keep a raw pointer to
435 // inject fake frames.
perkja3ede6c2016-03-08 01:27:48 +0100436 rtc::scoped_refptr<VideoTrackSourceInterface> source(
deadbeef112b2e92017-02-10 20:13:37 -0800437 factory_->CreateVideoSource(
438 std::unique_ptr<cricket::VideoCapturer>(capturer), NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 ASSERT_TRUE(source.get() != NULL);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000440 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 factory_->CreateVideoTrack("testlabel", source));
442 ASSERT_TRUE(track.get() != NULL);
443 FakeVideoTrackRenderer local_renderer(track);
444
445 EXPECT_EQ(0, local_renderer.num_rendered_frames());
446 EXPECT_TRUE(capturer->CaptureFrame());
447 EXPECT_EQ(1, local_renderer.num_rendered_frames());
nisse81354f52016-01-19 00:23:24 -0800448 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
450 track->set_enabled(false);
451 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 00:23:24 -0800452 EXPECT_EQ(2, local_renderer.num_rendered_frames());
453 EXPECT_TRUE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454
455 track->set_enabled(true);
456 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 00:23:24 -0800457 EXPECT_EQ(3, local_renderer.num_rendered_frames());
458 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459}