blob: 24441432d7a38b88409713406aa39fa13a5520af [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 Bonadei2ff3f492018-11-22 09:00:13 +010018#include "api/create_peerconnection_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/mediastreaminterface.h"
Anders Carlsson67537952018-05-03 11:28:29 +020020#include "api/video_codecs/builtin_video_decoder_factory.h"
21#include "api/video_codecs/builtin_video_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "media/base/fakevideocapturer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "p2p/base/fakeportallocator.h"
24#include "pc/peerconnectionfactory.h"
henrika919dc2e2017-10-12 14:24:55 +020025#include "pc/test/fakeaudiocapturemodule.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "rtc_base/gunit.h"
Patrik Höglund563934e2017-09-15 09:04:28 +020027
ossu7bb87ee2017-01-23 04:56:25 -080028#ifdef WEBRTC_ANDROID
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "pc/test/androidtestinitializer.h"
ossu7bb87ee2017-01-23 04:56:25 -080030#endif
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "pc/test/fakertccertificategenerator.h"
32#include "pc/test/fakevideotrackrenderer.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +000034using webrtc::DataChannelInterface;
Henrik Boström5e56c592015-08-11 10:33:13 +020035using webrtc::FakeVideoTrackRenderer;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036using webrtc::MediaStreamInterface;
37using webrtc::PeerConnectionFactoryInterface;
38using webrtc::PeerConnectionInterface;
39using webrtc::PeerConnectionObserver;
perkja3ede6c2016-03-08 01:27:48 +010040using webrtc::VideoTrackSourceInterface;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041using webrtc::VideoTrackInterface;
42
43namespace {
44
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
46static const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234";
47static const char kTurnIceServerWithTransport[] =
48 "turn:test@hello.com?transport=tcp";
Yves Gerey665174f2018-06-19 15:03:05 +020049static const char kSecureTurnIceServer[] = "turns:test@hello.com?transport=tcp";
wu@webrtc.org78187522013-10-07 23:32:02 +000050static const char kSecureTurnIceServerWithoutTransportParam[] =
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000051 "turns:test_no_transport@hello.com:443";
52static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
wu@webrtc.org78187522013-10-07 23:32:02 +000053 "turns:test_no_transport@hello.com";
Yves Gerey665174f2018-06-19 15:03:05 +020054static const char kTurnIceServerWithNoUsernameInUri[] = "turn:test.com:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055static const char kTurnPassword[] = "turnpassword";
wu@webrtc.org91053e72013-08-10 07:18:04 +000056static const int kDefaultStunPort = 3478;
57static const int kDefaultStunTlsPort = 5349;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058static const char kTurnUsername[] = "test";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000059static const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234";
60static const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4";
61static const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234";
62static const char kStunIceServerWithIPv6AddressWithoutPort[] =
63 "stun:[2401:fa00:4::]";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000064static const char kTurnIceServerWithIPv6Address[] =
65 "turn:test@[2401:fa00:4::]:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
67class NullPeerConnectionObserver : public PeerConnectionObserver {
68 public:
Henrik Kjellander3fe372d2016-05-12 08:10:52 +020069 virtual ~NullPeerConnectionObserver() = default;
nisse63b14b72017-01-31 03:34:01 -080070 void OnSignalingChange(
71 PeerConnectionInterface::SignalingState new_state) override {}
72 void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {}
73 void OnRemoveStream(
74 rtc::scoped_refptr<MediaStreamInterface> stream) override {}
75 void OnDataChannel(
76 rtc::scoped_refptr<DataChannelInterface> data_channel) override {}
77 void OnRenegotiationNeeded() override {}
78 void OnIceConnectionChange(
79 PeerConnectionInterface::IceConnectionState new_state) override {}
80 void OnIceGatheringChange(
81 PeerConnectionInterface::IceGatheringState new_state) override {}
Yves Gerey665174f2018-06-19 15:03:05 +020082 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
83 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084};
85
86} // namespace
87
88class PeerConnectionFactoryTest : public testing::Test {
89 void SetUp() {
phoglund37ebcf02016-01-08 05:04:57 -080090#ifdef WEBRTC_ANDROID
91 webrtc::InitializeAndroidObjects();
92#endif
henrika919dc2e2017-10-12 14:24:55 +020093 // Use fake audio device module since we're only testing the interface
94 // level, and using a real one could make tests flaky e.g. when run in
95 // parallel.
danilchape9021a32016-05-17 01:52:02 -070096 factory_ = webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +020097 rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
98 rtc::scoped_refptr<webrtc::AudioDeviceModule>(
99 FakeAudioCaptureModule::Create()),
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200100 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200101 webrtc::CreateBuiltinAudioDecoderFactory(),
102 webrtc::CreateBuiltinVideoEncoderFactory(),
103 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
104 nullptr /* audio_processing */);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105
106 ASSERT_TRUE(factory_.get() != NULL);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800107 port_allocator_.reset(
108 new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
109 raw_port_allocator_ = port_allocator_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110 }
111
112 protected:
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800113 void VerifyStunServers(cricket::ServerAddresses stun_servers) {
114 EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 }
116
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800117 void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
118 EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
119 for (size_t i = 0; i < turn_servers.size(); ++i) {
120 ASSERT_EQ(1u, turn_servers[i].ports.size());
121 EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
122 EXPECT_EQ(
123 turn_servers[i].ports[0].address.ToString(),
124 raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
125 EXPECT_EQ(turn_servers[i].ports[0].proto,
126 raw_port_allocator_->turn_servers()[i].ports[0].proto);
127 EXPECT_EQ(turn_servers[i].credentials.username,
128 raw_port_allocator_->turn_servers()[i].credentials.username);
129 EXPECT_EQ(turn_servers[i].credentials.password,
130 raw_port_allocator_->turn_servers()[i].credentials.password);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 }
132 }
133
Florent Castelli72b751a2018-06-28 14:09:33 +0200134 void VerifyAudioCodecCapability(const webrtc::RtpCodecCapability& codec) {
135 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_AUDIO);
136 EXPECT_FALSE(codec.name.empty());
137 EXPECT_GT(codec.clock_rate, 0);
138 EXPECT_GT(codec.num_channels, 0);
139 }
140
141 void VerifyVideoCodecCapability(const webrtc::RtpCodecCapability& codec) {
142 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_VIDEO);
143 EXPECT_FALSE(codec.name.empty());
144 EXPECT_GT(codec.clock_rate, 0);
145 }
146
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000147 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000148 NullPeerConnectionObserver observer_;
kwibergd1fe2812016-04-27 06:47:29 -0700149 std::unique_ptr<cricket::FakePortAllocator> port_allocator_;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800150 // Since the PC owns the port allocator after it's been initialized,
151 // this should only be used when known to be safe.
152 cricket::FakePortAllocator* raw_port_allocator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153};
154
155// Verify creation of PeerConnection using internal ADM, video factory and
156// internal libjingle threads.
henrika919dc2e2017-10-12 14:24:55 +0200157// TODO(henrika): disabling this test since relying on real audio can result in
158// flaky tests and focus on details that are out of scope for you might expect
159// for a PeerConnectionFactory unit test.
160// See https://bugs.chromium.org/p/webrtc/issues/detail?id=7806 for details.
161TEST(PeerConnectionFactoryTestInternal, DISABLED_CreatePCUsingInternalModules) {
phoglund37ebcf02016-01-08 05:04:57 -0800162#ifdef WEBRTC_ANDROID
163 webrtc::InitializeAndroidObjects();
164#endif
165
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000166 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200167 webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200168 nullptr /* network_thread */, nullptr /* worker_thread */,
169 nullptr /* signaling_thread */, nullptr /* default_adm */,
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200170 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200171 webrtc::CreateBuiltinAudioDecoderFactory(),
172 webrtc::CreateBuiltinVideoEncoderFactory(),
173 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
174 nullptr /* audio_processing */));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000175
176 NullPeerConnectionObserver observer;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800177 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178
Henrik Boströmd79599d2016-06-01 13:58:50 +0200179 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
180 new FakeRTCCertificateGenerator());
181 rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
Niels Möllerf06f9232018-08-07 12:32:18 +0200182 config, nullptr, std::move(cert_generator), &observer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183
Henrik Boström5e56c592015-08-11 10:33:13 +0200184 EXPECT_TRUE(pc.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185}
186
Florent Castelli72b751a2018-06-28 14:09:33 +0200187TEST_F(PeerConnectionFactoryTest, CheckRtpSenderAudioCapabilities) {
188 webrtc::RtpCapabilities audio_capabilities =
189 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO);
190 EXPECT_FALSE(audio_capabilities.codecs.empty());
191 for (const auto& codec : audio_capabilities.codecs) {
192 VerifyAudioCodecCapability(codec);
193 }
194 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
195 for (const auto& header_extension : audio_capabilities.header_extensions) {
196 EXPECT_FALSE(header_extension.uri.empty());
197 }
198}
199
200TEST_F(PeerConnectionFactoryTest, CheckRtpSenderVideoCapabilities) {
201 webrtc::RtpCapabilities video_capabilities =
202 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_VIDEO);
203 EXPECT_FALSE(video_capabilities.codecs.empty());
204 for (const auto& codec : video_capabilities.codecs) {
205 VerifyVideoCodecCapability(codec);
206 }
207 EXPECT_FALSE(video_capabilities.header_extensions.empty());
208 for (const auto& header_extension : video_capabilities.header_extensions) {
209 EXPECT_FALSE(header_extension.uri.empty());
210 }
211}
212
213TEST_F(PeerConnectionFactoryTest, CheckRtpSenderDataCapabilities) {
214 webrtc::RtpCapabilities data_capabilities =
215 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_DATA);
216 EXPECT_TRUE(data_capabilities.codecs.empty());
217 EXPECT_TRUE(data_capabilities.header_extensions.empty());
218}
219
220TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverAudioCapabilities) {
221 webrtc::RtpCapabilities audio_capabilities =
222 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO);
223 EXPECT_FALSE(audio_capabilities.codecs.empty());
224 for (const auto& codec : audio_capabilities.codecs) {
225 VerifyAudioCodecCapability(codec);
226 }
227 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
228 for (const auto& header_extension : audio_capabilities.header_extensions) {
229 EXPECT_FALSE(header_extension.uri.empty());
230 }
231}
232
233TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverVideoCapabilities) {
234 webrtc::RtpCapabilities video_capabilities =
235 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO);
236 EXPECT_FALSE(video_capabilities.codecs.empty());
237 for (const auto& codec : video_capabilities.codecs) {
238 VerifyVideoCodecCapability(codec);
239 }
240 EXPECT_FALSE(video_capabilities.header_extensions.empty());
241 for (const auto& header_extension : video_capabilities.header_extensions) {
242 EXPECT_FALSE(header_extension.uri.empty());
243 }
244}
245
246TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverDataCapabilities) {
247 webrtc::RtpCapabilities data_capabilities =
248 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_DATA);
249 EXPECT_TRUE(data_capabilities.codecs.empty());
250 EXPECT_TRUE(data_capabilities.header_extensions.empty());
251}
252
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000253// This test verifies creation of PeerConnection with valid STUN and TURN
254// configuration. Also verifies the URL's parsed correctly as expected.
255TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000256 PeerConnectionInterface::RTCConfiguration config;
257 webrtc::PeerConnectionInterface::IceServer ice_server;
258 ice_server.uri = kStunIceServer;
259 config.servers.push_back(ice_server);
260 ice_server.uri = kTurnIceServer;
261 ice_server.password = kTurnPassword;
262 config.servers.push_back(ice_server);
263 ice_server.uri = kTurnIceServerWithTransport;
264 ice_server.password = kTurnPassword;
265 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200266 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
267 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200268 rtc::scoped_refptr<PeerConnectionInterface> pc(
269 factory_->CreatePeerConnection(config, std::move(port_allocator_),
270 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800271 ASSERT_TRUE(pc.get() != NULL);
272 cricket::ServerAddresses stun_servers;
273 rtc::SocketAddress stun1("stun.l.google.com", 19302);
274 stun_servers.insert(stun1);
275 VerifyStunServers(stun_servers);
276 std::vector<cricket::RelayServerConfig> turn_servers;
277 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800278 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800279 turn_servers.push_back(turn1);
280 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800281 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800282 turn_servers.push_back(turn2);
283 VerifyTurnServers(turn_servers);
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000284}
285
286// This test verifies creation of PeerConnection with valid STUN and TURN
Joachim Bauch7c4e7452015-05-28 23:06:30 +0200287// configuration. Also verifies the list of URL's parsed correctly as expected.
288TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
289 PeerConnectionInterface::RTCConfiguration config;
290 webrtc::PeerConnectionInterface::IceServer ice_server;
291 ice_server.urls.push_back(kStunIceServer);
292 ice_server.urls.push_back(kTurnIceServer);
293 ice_server.urls.push_back(kTurnIceServerWithTransport);
294 ice_server.password = kTurnPassword;
295 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200296 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
297 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200298 rtc::scoped_refptr<PeerConnectionInterface> pc(
299 factory_->CreatePeerConnection(config, std::move(port_allocator_),
300 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800301 ASSERT_TRUE(pc.get() != NULL);
302 cricket::ServerAddresses stun_servers;
303 rtc::SocketAddress stun1("stun.l.google.com", 19302);
304 stun_servers.insert(stun1);
305 VerifyStunServers(stun_servers);
306 std::vector<cricket::RelayServerConfig> turn_servers;
307 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800308 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800309 turn_servers.push_back(turn1);
310 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800311 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800312 turn_servers.push_back(turn2);
313 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000314}
315
316TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000317 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000318 webrtc::PeerConnectionInterface::IceServer ice_server;
319 ice_server.uri = kStunIceServer;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000320 config.servers.push_back(ice_server);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000321 ice_server.uri = kTurnIceServerWithNoUsernameInUri;
322 ice_server.username = kTurnUsername;
323 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000324 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200325 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
326 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200327 rtc::scoped_refptr<PeerConnectionInterface> pc(
328 factory_->CreatePeerConnection(config, std::move(port_allocator_),
329 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800330 ASSERT_TRUE(pc.get() != NULL);
331 std::vector<cricket::RelayServerConfig> turn_servers;
332 cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800333 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800334 turn_servers.push_back(turn);
335 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336}
337
338// This test verifies the PeerConnection created properly with TURN url which
339// has transport parameter in it.
340TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000341 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 webrtc::PeerConnectionInterface::IceServer ice_server;
343 ice_server.uri = kTurnIceServerWithTransport;
344 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000345 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200346 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
347 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200348 rtc::scoped_refptr<PeerConnectionInterface> pc(
349 factory_->CreatePeerConnection(config, std::move(port_allocator_),
350 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800351 ASSERT_TRUE(pc.get() != NULL);
352 std::vector<cricket::RelayServerConfig> turn_servers;
353 cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800354 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800355 turn_servers.push_back(turn);
356 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357}
358
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000360 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 webrtc::PeerConnectionInterface::IceServer ice_server;
362 ice_server.uri = kSecureTurnIceServer;
363 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000364 config.servers.push_back(ice_server);
wu@webrtc.org78187522013-10-07 23:32:02 +0000365 ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
366 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000367 config.servers.push_back(ice_server);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000368 ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
369 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000370 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200371 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
372 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200373 rtc::scoped_refptr<PeerConnectionInterface> pc(
374 factory_->CreatePeerConnection(config, std::move(port_allocator_),
375 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800376 ASSERT_TRUE(pc.get() != NULL);
377 std::vector<cricket::RelayServerConfig> turn_servers;
378 cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800379 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800380 turn_servers.push_back(turn1);
wu@webrtc.org78187522013-10-07 23:32:02 +0000381 // TURNS with transport param should be default to tcp.
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800382 cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport",
hnsl277b2502016-12-13 05:17:23 -0800383 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800384 turn_servers.push_back(turn2);
385 cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
386 "test_no_transport", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800387 cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800388 turn_servers.push_back(turn3);
389 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390}
391
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000392TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000393 PeerConnectionInterface::RTCConfiguration config;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000394 webrtc::PeerConnectionInterface::IceServer ice_server;
395 ice_server.uri = kStunIceServerWithIPv4Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000396 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000397 ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000398 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000399 ice_server.uri = kStunIceServerWithIPv6Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000400 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000401 ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000402 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000403 ice_server.uri = kTurnIceServerWithIPv6Address;
404 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000405 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200406 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
407 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200408 rtc::scoped_refptr<PeerConnectionInterface> pc(
409 factory_->CreatePeerConnection(config, std::move(port_allocator_),
410 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800411 ASSERT_TRUE(pc.get() != NULL);
412 cricket::ServerAddresses stun_servers;
413 rtc::SocketAddress stun1("1.2.3.4", 1234);
414 stun_servers.insert(stun1);
415 rtc::SocketAddress stun2("1.2.3.4", 3478);
416 stun_servers.insert(stun2); // Default port
417 rtc::SocketAddress stun3("2401:fa00:4::", 1234);
418 stun_servers.insert(stun3);
419 rtc::SocketAddress stun4("2401:fa00:4::", 3478);
420 stun_servers.insert(stun4); // Default port
421 VerifyStunServers(stun_servers);
buildbot@webrtc.orgf875f152014-04-14 16:06:21 +0000422
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800423 std::vector<cricket::RelayServerConfig> turn_servers;
424 cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800425 cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800426 turn_servers.push_back(turn1);
427 VerifyTurnServers(turn_servers);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000428}
429
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430// This test verifies the captured stream is rendered locally using a
431// local video track.
432TEST_F(PeerConnectionFactoryTest, LocalRendering) {
Tommi1829af62018-02-06 09:29:17 +0100433 cricket::FakeVideoCapturerWithTaskQueue* capturer =
434 new cricket::FakeVideoCapturerWithTaskQueue();
deadbeef112b2e92017-02-10 20:13:37 -0800435 // The source takes ownership of |capturer|, but we keep a raw pointer to
436 // inject fake frames.
perkja3ede6c2016-03-08 01:27:48 +0100437 rtc::scoped_refptr<VideoTrackSourceInterface> source(
deadbeef112b2e92017-02-10 20:13:37 -0800438 factory_->CreateVideoSource(
439 std::unique_ptr<cricket::VideoCapturer>(capturer), NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 ASSERT_TRUE(source.get() != NULL);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000441 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 factory_->CreateVideoTrack("testlabel", source));
443 ASSERT_TRUE(track.get() != NULL);
444 FakeVideoTrackRenderer local_renderer(track);
445
446 EXPECT_EQ(0, local_renderer.num_rendered_frames());
447 EXPECT_TRUE(capturer->CaptureFrame());
448 EXPECT_EQ(1, local_renderer.num_rendered_frames());
nisse81354f52016-01-19 00:23:24 -0800449 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450
451 track->set_enabled(false);
452 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 00:23:24 -0800453 EXPECT_EQ(2, local_renderer.num_rendered_frames());
454 EXPECT_TRUE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455
456 track->set_enabled(true);
457 EXPECT_TRUE(capturer->CaptureFrame());
nisse81354f52016-01-19 00:23:24 -0800458 EXPECT_EQ(3, local_renderer.num_rendered_frames());
459 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460}