blob: dd392c5ad2509e5c83771f416c1dd2167ad1cc86 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "pc/peer_connection_factory.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
kwibergd1fe2812016-04-27 06:47:29 -070015#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016#include <string>
kwiberg0eb15ed2015-12-17 03:04:15 -080017#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070018#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "api/audio/audio_mixer.h"
21#include "api/audio_codecs/audio_decoder_factory.h"
22#include "api/audio_codecs/audio_encoder_factory.h"
Karl Wiberg1b0eae32017-10-17 14:48:54 +020023#include "api/audio_codecs/builtin_audio_decoder_factory.h"
24#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Mirko Bonadei2ff3f492018-11-22 09:00:13 +010025#include "api/create_peerconnection_factory.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "api/data_channel_interface.h"
Yves Gerey3e707812018-11-28 16:47:49 +010027#include "api/jsep.h"
Steve Anton10542f22019-01-11 09:11:00 -080028#include "api/media_stream_interface.h"
Anders Carlsson67537952018-05-03 11:28:29 +020029#include "api/video_codecs/builtin_video_decoder_factory.h"
30#include "api/video_codecs/builtin_video_encoder_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010031#include "api/video_codecs/video_decoder_factory.h"
32#include "api/video_codecs/video_encoder_factory.h"
Niels Möller3eaf9f12019-01-17 16:31:36 +010033#include "media/base/fake_frame_source.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "modules/audio_device/include/audio_device.h"
35#include "modules/audio_processing/include/audio_processing.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "p2p/base/fake_port_allocator.h"
Yves Gerey3e707812018-11-28 16:47:49 +010037#include "p2p/base/port.h"
Steve Anton10542f22019-01-11 09:11:00 -080038#include "p2p/base/port_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080039#include "pc/test/fake_audio_capture_module.h"
Niels Möller3eaf9f12019-01-17 16:31:36 +010040#include "pc/test/fake_video_track_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "rtc_base/socket_address.h"
Yves Gerey3e707812018-11-28 16:47:49 +010042#include "test/gtest.h"
Patrik Höglund563934e2017-09-15 09:04:28 +020043
ossu7bb87ee2017-01-23 04:56:25 -080044#ifdef WEBRTC_ANDROID
Steve Anton10542f22019-01-11 09:11:00 -080045#include "pc/test/android_test_initializer.h"
ossu7bb87ee2017-01-23 04:56:25 -080046#endif
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/test/fake_rtc_certificate_generator.h"
48#include "pc/test/fake_video_track_renderer.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +000050using webrtc::DataChannelInterface;
Henrik Boström5e56c592015-08-11 10:33:13 +020051using webrtc::FakeVideoTrackRenderer;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052using webrtc::MediaStreamInterface;
53using webrtc::PeerConnectionFactoryInterface;
54using webrtc::PeerConnectionInterface;
55using webrtc::PeerConnectionObserver;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056using webrtc::VideoTrackInterface;
Jonas Olssona4d87372019-07-05 19:08:33 +020057using webrtc::VideoTrackSourceInterface;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058
59namespace {
60
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
Niels Möllerdb4def92019-03-18 16:53:59 +010062static const char kTurnIceServer[] = "turn:test.com:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063static const char kTurnIceServerWithTransport[] =
Niels Möllerdb4def92019-03-18 16:53:59 +010064 "turn:hello.com?transport=tcp";
65static const char kSecureTurnIceServer[] = "turns:hello.com?transport=tcp";
wu@webrtc.org78187522013-10-07 23:32:02 +000066static const char kSecureTurnIceServerWithoutTransportParam[] =
Niels Möllerdb4def92019-03-18 16:53:59 +010067 "turns:hello.com:443";
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000068static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
Niels Möllerdb4def92019-03-18 16:53:59 +010069 "turns:hello.com";
Yves Gerey665174f2018-06-19 15:03:05 +020070static const char kTurnIceServerWithNoUsernameInUri[] = "turn:test.com:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071static const char kTurnPassword[] = "turnpassword";
wu@webrtc.org91053e72013-08-10 07:18:04 +000072static const int kDefaultStunPort = 3478;
73static const int kDefaultStunTlsPort = 5349;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074static const char kTurnUsername[] = "test";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000075static const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234";
76static const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4";
77static const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234";
78static const char kStunIceServerWithIPv6AddressWithoutPort[] =
79 "stun:[2401:fa00:4::]";
Niels Möllerdb4def92019-03-18 16:53:59 +010080static const char kTurnIceServerWithIPv6Address[] = "turn:[2401:fa00:4::]:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081
82class NullPeerConnectionObserver : public PeerConnectionObserver {
83 public:
Henrik Kjellander3fe372d2016-05-12 08:10:52 +020084 virtual ~NullPeerConnectionObserver() = default;
nisse63b14b72017-01-31 03:34:01 -080085 void OnSignalingChange(
86 PeerConnectionInterface::SignalingState new_state) override {}
87 void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {}
88 void OnRemoveStream(
89 rtc::scoped_refptr<MediaStreamInterface> stream) override {}
90 void OnDataChannel(
91 rtc::scoped_refptr<DataChannelInterface> data_channel) override {}
92 void OnRenegotiationNeeded() override {}
93 void OnIceConnectionChange(
94 PeerConnectionInterface::IceConnectionState new_state) override {}
95 void OnIceGatheringChange(
96 PeerConnectionInterface::IceGatheringState new_state) override {}
Yves Gerey665174f2018-06-19 15:03:05 +020097 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
98 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099};
100
101} // namespace
102
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200103class PeerConnectionFactoryTest : public ::testing::Test {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 void SetUp() {
phoglund37ebcf02016-01-08 05:04:57 -0800105#ifdef WEBRTC_ANDROID
106 webrtc::InitializeAndroidObjects();
107#endif
henrika919dc2e2017-10-12 14:24:55 +0200108 // Use fake audio device module since we're only testing the interface
109 // level, and using a real one could make tests flaky e.g. when run in
110 // parallel.
danilchape9021a32016-05-17 01:52:02 -0700111 factory_ = webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200112 rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
113 rtc::scoped_refptr<webrtc::AudioDeviceModule>(
114 FakeAudioCaptureModule::Create()),
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200115 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200116 webrtc::CreateBuiltinAudioDecoderFactory(),
117 webrtc::CreateBuiltinVideoEncoderFactory(),
118 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
119 nullptr /* audio_processing */);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120
121 ASSERT_TRUE(factory_.get() != NULL);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800122 port_allocator_.reset(
123 new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
124 raw_port_allocator_ = port_allocator_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
126
127 protected:
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800128 void VerifyStunServers(cricket::ServerAddresses stun_servers) {
129 EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
131
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800132 void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
133 EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
134 for (size_t i = 0; i < turn_servers.size(); ++i) {
135 ASSERT_EQ(1u, turn_servers[i].ports.size());
136 EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
137 EXPECT_EQ(
138 turn_servers[i].ports[0].address.ToString(),
139 raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
140 EXPECT_EQ(turn_servers[i].ports[0].proto,
141 raw_port_allocator_->turn_servers()[i].ports[0].proto);
142 EXPECT_EQ(turn_servers[i].credentials.username,
143 raw_port_allocator_->turn_servers()[i].credentials.username);
144 EXPECT_EQ(turn_servers[i].credentials.password,
145 raw_port_allocator_->turn_servers()[i].credentials.password);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 }
147 }
148
Florent Castelli72b751a2018-06-28 14:09:33 +0200149 void VerifyAudioCodecCapability(const webrtc::RtpCodecCapability& codec) {
150 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_AUDIO);
151 EXPECT_FALSE(codec.name.empty());
152 EXPECT_GT(codec.clock_rate, 0);
153 EXPECT_GT(codec.num_channels, 0);
154 }
155
156 void VerifyVideoCodecCapability(const webrtc::RtpCodecCapability& codec) {
157 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_VIDEO);
158 EXPECT_FALSE(codec.name.empty());
159 EXPECT_GT(codec.clock_rate, 0);
160 }
161
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000162 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 NullPeerConnectionObserver observer_;
kwibergd1fe2812016-04-27 06:47:29 -0700164 std::unique_ptr<cricket::FakePortAllocator> port_allocator_;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800165 // Since the PC owns the port allocator after it's been initialized,
166 // this should only be used when known to be safe.
167 cricket::FakePortAllocator* raw_port_allocator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168};
169
170// Verify creation of PeerConnection using internal ADM, video factory and
171// internal libjingle threads.
henrika919dc2e2017-10-12 14:24:55 +0200172// TODO(henrika): disabling this test since relying on real audio can result in
173// flaky tests and focus on details that are out of scope for you might expect
174// for a PeerConnectionFactory unit test.
175// See https://bugs.chromium.org/p/webrtc/issues/detail?id=7806 for details.
176TEST(PeerConnectionFactoryTestInternal, DISABLED_CreatePCUsingInternalModules) {
phoglund37ebcf02016-01-08 05:04:57 -0800177#ifdef WEBRTC_ANDROID
178 webrtc::InitializeAndroidObjects();
179#endif
180
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000181 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200182 webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200183 nullptr /* network_thread */, nullptr /* worker_thread */,
184 nullptr /* signaling_thread */, nullptr /* default_adm */,
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200185 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200186 webrtc::CreateBuiltinAudioDecoderFactory(),
187 webrtc::CreateBuiltinVideoEncoderFactory(),
188 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
189 nullptr /* audio_processing */));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000190
191 NullPeerConnectionObserver observer;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800192 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193
Henrik Boströmd79599d2016-06-01 13:58:50 +0200194 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
195 new FakeRTCCertificateGenerator());
196 rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
Niels Möllerf06f9232018-08-07 12:32:18 +0200197 config, nullptr, std::move(cert_generator), &observer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198
Henrik Boström5e56c592015-08-11 10:33:13 +0200199 EXPECT_TRUE(pc.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200}
201
Florent Castelli72b751a2018-06-28 14:09:33 +0200202TEST_F(PeerConnectionFactoryTest, CheckRtpSenderAudioCapabilities) {
203 webrtc::RtpCapabilities audio_capabilities =
204 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO);
205 EXPECT_FALSE(audio_capabilities.codecs.empty());
206 for (const auto& codec : audio_capabilities.codecs) {
207 VerifyAudioCodecCapability(codec);
208 }
209 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
210 for (const auto& header_extension : audio_capabilities.header_extensions) {
211 EXPECT_FALSE(header_extension.uri.empty());
212 }
213}
214
215TEST_F(PeerConnectionFactoryTest, CheckRtpSenderVideoCapabilities) {
216 webrtc::RtpCapabilities video_capabilities =
217 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_VIDEO);
218 EXPECT_FALSE(video_capabilities.codecs.empty());
219 for (const auto& codec : video_capabilities.codecs) {
220 VerifyVideoCodecCapability(codec);
221 }
222 EXPECT_FALSE(video_capabilities.header_extensions.empty());
223 for (const auto& header_extension : video_capabilities.header_extensions) {
224 EXPECT_FALSE(header_extension.uri.empty());
225 }
226}
227
228TEST_F(PeerConnectionFactoryTest, CheckRtpSenderDataCapabilities) {
229 webrtc::RtpCapabilities data_capabilities =
230 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_DATA);
231 EXPECT_TRUE(data_capabilities.codecs.empty());
232 EXPECT_TRUE(data_capabilities.header_extensions.empty());
233}
234
235TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverAudioCapabilities) {
236 webrtc::RtpCapabilities audio_capabilities =
237 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO);
238 EXPECT_FALSE(audio_capabilities.codecs.empty());
239 for (const auto& codec : audio_capabilities.codecs) {
240 VerifyAudioCodecCapability(codec);
241 }
242 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
243 for (const auto& header_extension : audio_capabilities.header_extensions) {
244 EXPECT_FALSE(header_extension.uri.empty());
245 }
246}
247
248TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverVideoCapabilities) {
249 webrtc::RtpCapabilities video_capabilities =
250 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO);
251 EXPECT_FALSE(video_capabilities.codecs.empty());
252 for (const auto& codec : video_capabilities.codecs) {
253 VerifyVideoCodecCapability(codec);
254 }
255 EXPECT_FALSE(video_capabilities.header_extensions.empty());
256 for (const auto& header_extension : video_capabilities.header_extensions) {
257 EXPECT_FALSE(header_extension.uri.empty());
258 }
259}
260
261TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverDataCapabilities) {
262 webrtc::RtpCapabilities data_capabilities =
263 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_DATA);
264 EXPECT_TRUE(data_capabilities.codecs.empty());
265 EXPECT_TRUE(data_capabilities.header_extensions.empty());
266}
267
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000268// This test verifies creation of PeerConnection with valid STUN and TURN
269// configuration. Also verifies the URL's parsed correctly as expected.
270TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000271 PeerConnectionInterface::RTCConfiguration config;
272 webrtc::PeerConnectionInterface::IceServer ice_server;
273 ice_server.uri = kStunIceServer;
274 config.servers.push_back(ice_server);
275 ice_server.uri = kTurnIceServer;
Niels Möllerdb4def92019-03-18 16:53:59 +0100276 ice_server.username = kTurnUsername;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000277 ice_server.password = kTurnPassword;
278 config.servers.push_back(ice_server);
279 ice_server.uri = kTurnIceServerWithTransport;
Niels Möllerdb4def92019-03-18 16:53:59 +0100280 ice_server.username = kTurnUsername;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000281 ice_server.password = kTurnPassword;
282 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200283 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
284 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200285 rtc::scoped_refptr<PeerConnectionInterface> pc(
286 factory_->CreatePeerConnection(config, std::move(port_allocator_),
287 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800288 ASSERT_TRUE(pc.get() != NULL);
289 cricket::ServerAddresses stun_servers;
290 rtc::SocketAddress stun1("stun.l.google.com", 19302);
291 stun_servers.insert(stun1);
292 VerifyStunServers(stun_servers);
293 std::vector<cricket::RelayServerConfig> turn_servers;
Niels Möllerdb4def92019-03-18 16:53:59 +0100294 cricket::RelayServerConfig turn1("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800295 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800296 turn_servers.push_back(turn1);
Niels Möllerdb4def92019-03-18 16:53:59 +0100297 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800298 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800299 turn_servers.push_back(turn2);
300 VerifyTurnServers(turn_servers);
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000301}
302
303// This test verifies creation of PeerConnection with valid STUN and TURN
Joachim Bauch7c4e7452015-05-28 23:06:30 +0200304// configuration. Also verifies the list of URL's parsed correctly as expected.
305TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
306 PeerConnectionInterface::RTCConfiguration config;
307 webrtc::PeerConnectionInterface::IceServer ice_server;
308 ice_server.urls.push_back(kStunIceServer);
309 ice_server.urls.push_back(kTurnIceServer);
310 ice_server.urls.push_back(kTurnIceServerWithTransport);
Niels Möllerdb4def92019-03-18 16:53:59 +0100311 ice_server.username = kTurnUsername;
Joachim Bauch7c4e7452015-05-28 23:06:30 +0200312 ice_server.password = kTurnPassword;
313 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200314 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
315 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200316 rtc::scoped_refptr<PeerConnectionInterface> pc(
317 factory_->CreatePeerConnection(config, std::move(port_allocator_),
318 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800319 ASSERT_TRUE(pc.get() != NULL);
320 cricket::ServerAddresses stun_servers;
321 rtc::SocketAddress stun1("stun.l.google.com", 19302);
322 stun_servers.insert(stun1);
323 VerifyStunServers(stun_servers);
324 std::vector<cricket::RelayServerConfig> turn_servers;
Niels Möllerdb4def92019-03-18 16:53:59 +0100325 cricket::RelayServerConfig turn1("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800326 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800327 turn_servers.push_back(turn1);
Niels Möllerdb4def92019-03-18 16:53:59 +0100328 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800329 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800330 turn_servers.push_back(turn2);
331 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332}
333
334TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000335 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336 webrtc::PeerConnectionInterface::IceServer ice_server;
337 ice_server.uri = kStunIceServer;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000338 config.servers.push_back(ice_server);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 ice_server.uri = kTurnIceServerWithNoUsernameInUri;
340 ice_server.username = kTurnUsername;
341 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000342 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200343 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
344 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200345 rtc::scoped_refptr<PeerConnectionInterface> pc(
346 factory_->CreatePeerConnection(config, std::move(port_allocator_),
347 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800348 ASSERT_TRUE(pc.get() != NULL);
349 std::vector<cricket::RelayServerConfig> turn_servers;
350 cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800351 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800352 turn_servers.push_back(turn);
353 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354}
355
356// This test verifies the PeerConnection created properly with TURN url which
357// has transport parameter in it.
358TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
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 = kTurnIceServerWithTransport;
Niels Möllerdb4def92019-03-18 16:53:59 +0100362 ice_server.username = kTurnUsername;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000364 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200365 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
366 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200367 rtc::scoped_refptr<PeerConnectionInterface> pc(
368 factory_->CreatePeerConnection(config, std::move(port_allocator_),
369 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800370 ASSERT_TRUE(pc.get() != NULL);
371 std::vector<cricket::RelayServerConfig> turn_servers;
Niels Möllerdb4def92019-03-18 16:53:59 +0100372 cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800373 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800374 turn_servers.push_back(turn);
375 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376}
377
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000379 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 webrtc::PeerConnectionInterface::IceServer ice_server;
381 ice_server.uri = kSecureTurnIceServer;
Niels Möllerdb4def92019-03-18 16:53:59 +0100382 ice_server.username = kTurnUsername;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000384 config.servers.push_back(ice_server);
wu@webrtc.org78187522013-10-07 23:32:02 +0000385 ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
Niels Möllerdb4def92019-03-18 16:53:59 +0100386 ice_server.username = kTurnUsername;
wu@webrtc.org78187522013-10-07 23:32:02 +0000387 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000388 config.servers.push_back(ice_server);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000389 ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
Niels Möllerdb4def92019-03-18 16:53:59 +0100390 ice_server.username = kTurnUsername;
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000391 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000392 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200393 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
394 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200395 rtc::scoped_refptr<PeerConnectionInterface> pc(
396 factory_->CreatePeerConnection(config, std::move(port_allocator_),
397 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800398 ASSERT_TRUE(pc.get() != NULL);
399 std::vector<cricket::RelayServerConfig> turn_servers;
Niels Möllerdb4def92019-03-18 16:53:59 +0100400 cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort,
401 kTurnUsername, kTurnPassword,
402 cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800403 turn_servers.push_back(turn1);
wu@webrtc.org78187522013-10-07 23:32:02 +0000404 // TURNS with transport param should be default to tcp.
Niels Möllerdb4def92019-03-18 16:53:59 +0100405 cricket::RelayServerConfig turn2("hello.com", 443, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800406 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800407 turn_servers.push_back(turn2);
408 cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
Niels Möllerdb4def92019-03-18 16:53:59 +0100409 kTurnUsername, kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800410 cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800411 turn_servers.push_back(turn3);
412 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413}
414
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000415TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000416 PeerConnectionInterface::RTCConfiguration config;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000417 webrtc::PeerConnectionInterface::IceServer ice_server;
418 ice_server.uri = kStunIceServerWithIPv4Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000419 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000420 ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000421 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000422 ice_server.uri = kStunIceServerWithIPv6Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000423 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000424 ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000425 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000426 ice_server.uri = kTurnIceServerWithIPv6Address;
Niels Möllerdb4def92019-03-18 16:53:59 +0100427 ice_server.username = kTurnUsername;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000428 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000429 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200430 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
431 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200432 rtc::scoped_refptr<PeerConnectionInterface> pc(
433 factory_->CreatePeerConnection(config, std::move(port_allocator_),
434 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800435 ASSERT_TRUE(pc.get() != NULL);
436 cricket::ServerAddresses stun_servers;
437 rtc::SocketAddress stun1("1.2.3.4", 1234);
438 stun_servers.insert(stun1);
439 rtc::SocketAddress stun2("1.2.3.4", 3478);
440 stun_servers.insert(stun2); // Default port
441 rtc::SocketAddress stun3("2401:fa00:4::", 1234);
442 stun_servers.insert(stun3);
443 rtc::SocketAddress stun4("2401:fa00:4::", 3478);
444 stun_servers.insert(stun4); // Default port
445 VerifyStunServers(stun_servers);
buildbot@webrtc.orgf875f152014-04-14 16:06:21 +0000446
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800447 std::vector<cricket::RelayServerConfig> turn_servers;
Niels Möllerdb4def92019-03-18 16:53:59 +0100448 cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, kTurnUsername,
449 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800450 turn_servers.push_back(turn1);
451 VerifyTurnServers(turn_servers);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000452}
453
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454// This test verifies the captured stream is rendered locally using a
455// local video track.
456TEST_F(PeerConnectionFactoryTest, LocalRendering) {
Niels Möller3eaf9f12019-01-17 16:31:36 +0100457 rtc::scoped_refptr<webrtc::FakeVideoTrackSource> source =
458 webrtc::FakeVideoTrackSource::Create(/*is_screencast=*/false);
459
460 cricket::FakeFrameSource frame_source(1280, 720,
461 rtc::kNumMicrosecsPerSec / 30);
462
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 ASSERT_TRUE(source.get() != NULL);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000464 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 factory_->CreateVideoTrack("testlabel", source));
466 ASSERT_TRUE(track.get() != NULL);
467 FakeVideoTrackRenderer local_renderer(track);
468
469 EXPECT_EQ(0, local_renderer.num_rendered_frames());
Niels Möller3eaf9f12019-01-17 16:31:36 +0100470 source->InjectFrame(frame_source.GetFrame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 EXPECT_EQ(1, local_renderer.num_rendered_frames());
nisse81354f52016-01-19 00:23:24 -0800472 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473
474 track->set_enabled(false);
Niels Möller3eaf9f12019-01-17 16:31:36 +0100475 source->InjectFrame(frame_source.GetFrame());
nisse81354f52016-01-19 00:23:24 -0800476 EXPECT_EQ(2, local_renderer.num_rendered_frames());
477 EXPECT_TRUE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478
479 track->set_enabled(true);
Niels Möller3eaf9f12019-01-17 16:31:36 +0100480 source->InjectFrame(frame_source.GetFrame());
nisse81354f52016-01-19 00:23:24 -0800481 EXPECT_EQ(3, local_renderer.num_rendered_frames());
482 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483}