blob: 1c3eff7a733249314cdcf3b4775bb7a82dfda270 [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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
kwibergd1fe2812016-04-27 06:47:29 -070012#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013#include <string>
kwiberg0eb15ed2015-12-17 03:04:15 -080014#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070015#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "api/audio/audio_mixer.h"
18#include "api/audio_codecs/audio_decoder_factory.h"
19#include "api/audio_codecs/audio_encoder_factory.h"
Karl Wiberg1b0eae32017-10-17 14:48:54 +020020#include "api/audio_codecs/builtin_audio_decoder_factory.h"
21#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Mirko Bonadei2ff3f492018-11-22 09:00:13 +010022#include "api/create_peerconnection_factory.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/data_channel_interface.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "api/jsep.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "api/media_stream_interface.h"
Anders Carlsson67537952018-05-03 11:28:29 +020026#include "api/video_codecs/builtin_video_decoder_factory.h"
27#include "api/video_codecs/builtin_video_encoder_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010028#include "api/video_codecs/video_decoder_factory.h"
29#include "api/video_codecs/video_encoder_factory.h"
Niels Möller3eaf9f12019-01-17 16:31:36 +010030#include "media/base/fake_frame_source.h"
Yves Gerey3e707812018-11-28 16:47:49 +010031#include "modules/audio_device/include/audio_device.h"
32#include "modules/audio_processing/include/audio_processing.h"
Steve Anton10542f22019-01-11 09:11:00 -080033#include "p2p/base/fake_port_allocator.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "p2p/base/port.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "p2p/base/port_interface.h"
36#include "pc/peer_connection_factory.h"
37#include "pc/test/fake_audio_capture_module.h"
Niels Möller3eaf9f12019-01-17 16:31:36 +010038#include "pc/test/fake_video_track_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080039#include "rtc_base/socket_address.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "test/gtest.h"
Patrik Höglund563934e2017-09-15 09:04:28 +020041
ossu7bb87ee2017-01-23 04:56:25 -080042#ifdef WEBRTC_ANDROID
Steve Anton10542f22019-01-11 09:11:00 -080043#include "pc/test/android_test_initializer.h"
ossu7bb87ee2017-01-23 04:56:25 -080044#endif
Steve Anton10542f22019-01-11 09:11:00 -080045#include "pc/test/fake_rtc_certificate_generator.h"
46#include "pc/test/fake_video_track_renderer.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +000048using webrtc::DataChannelInterface;
Henrik Boström5e56c592015-08-11 10:33:13 +020049using webrtc::FakeVideoTrackRenderer;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050using webrtc::MediaStreamInterface;
51using webrtc::PeerConnectionFactoryInterface;
52using webrtc::PeerConnectionInterface;
53using webrtc::PeerConnectionObserver;
perkja3ede6c2016-03-08 01:27:48 +010054using webrtc::VideoTrackSourceInterface;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055using webrtc::VideoTrackInterface;
56
57namespace {
58
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
60static const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234";
61static const char kTurnIceServerWithTransport[] =
62 "turn:test@hello.com?transport=tcp";
Yves Gerey665174f2018-06-19 15:03:05 +020063static const char kSecureTurnIceServer[] = "turns:test@hello.com?transport=tcp";
wu@webrtc.org78187522013-10-07 23:32:02 +000064static const char kSecureTurnIceServerWithoutTransportParam[] =
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000065 "turns:test_no_transport@hello.com:443";
66static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
wu@webrtc.org78187522013-10-07 23:32:02 +000067 "turns:test_no_transport@hello.com";
Yves Gerey665174f2018-06-19 15:03:05 +020068static const char kTurnIceServerWithNoUsernameInUri[] = "turn:test.com:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069static const char kTurnPassword[] = "turnpassword";
wu@webrtc.org91053e72013-08-10 07:18:04 +000070static const int kDefaultStunPort = 3478;
71static const int kDefaultStunTlsPort = 5349;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072static const char kTurnUsername[] = "test";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000073static const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234";
74static const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4";
75static const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234";
76static const char kStunIceServerWithIPv6AddressWithoutPort[] =
77 "stun:[2401:fa00:4::]";
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +000078static const char kTurnIceServerWithIPv6Address[] =
79 "turn:test@[2401:fa00:4::]:1234";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080
81class NullPeerConnectionObserver : public PeerConnectionObserver {
82 public:
Henrik Kjellander3fe372d2016-05-12 08:10:52 +020083 virtual ~NullPeerConnectionObserver() = default;
nisse63b14b72017-01-31 03:34:01 -080084 void OnSignalingChange(
85 PeerConnectionInterface::SignalingState new_state) override {}
86 void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {}
87 void OnRemoveStream(
88 rtc::scoped_refptr<MediaStreamInterface> stream) override {}
89 void OnDataChannel(
90 rtc::scoped_refptr<DataChannelInterface> data_channel) override {}
91 void OnRenegotiationNeeded() override {}
92 void OnIceConnectionChange(
93 PeerConnectionInterface::IceConnectionState new_state) override {}
94 void OnIceGatheringChange(
95 PeerConnectionInterface::IceGatheringState new_state) override {}
Yves Gerey665174f2018-06-19 15:03:05 +020096 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
97 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098};
99
100} // namespace
101
102class PeerConnectionFactoryTest : public testing::Test {
103 void SetUp() {
phoglund37ebcf02016-01-08 05:04:57 -0800104#ifdef WEBRTC_ANDROID
105 webrtc::InitializeAndroidObjects();
106#endif
henrika919dc2e2017-10-12 14:24:55 +0200107 // Use fake audio device module since we're only testing the interface
108 // level, and using a real one could make tests flaky e.g. when run in
109 // parallel.
danilchape9021a32016-05-17 01:52:02 -0700110 factory_ = webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200111 rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
112 rtc::scoped_refptr<webrtc::AudioDeviceModule>(
113 FakeAudioCaptureModule::Create()),
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200114 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200115 webrtc::CreateBuiltinAudioDecoderFactory(),
116 webrtc::CreateBuiltinVideoEncoderFactory(),
117 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
118 nullptr /* audio_processing */);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119
120 ASSERT_TRUE(factory_.get() != NULL);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800121 port_allocator_.reset(
122 new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
123 raw_port_allocator_ = port_allocator_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
125
126 protected:
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800127 void VerifyStunServers(cricket::ServerAddresses stun_servers) {
128 EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
130
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800131 void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
132 EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
133 for (size_t i = 0; i < turn_servers.size(); ++i) {
134 ASSERT_EQ(1u, turn_servers[i].ports.size());
135 EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
136 EXPECT_EQ(
137 turn_servers[i].ports[0].address.ToString(),
138 raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
139 EXPECT_EQ(turn_servers[i].ports[0].proto,
140 raw_port_allocator_->turn_servers()[i].ports[0].proto);
141 EXPECT_EQ(turn_servers[i].credentials.username,
142 raw_port_allocator_->turn_servers()[i].credentials.username);
143 EXPECT_EQ(turn_servers[i].credentials.password,
144 raw_port_allocator_->turn_servers()[i].credentials.password);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
146 }
147
Florent Castelli72b751a2018-06-28 14:09:33 +0200148 void VerifyAudioCodecCapability(const webrtc::RtpCodecCapability& codec) {
149 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_AUDIO);
150 EXPECT_FALSE(codec.name.empty());
151 EXPECT_GT(codec.clock_rate, 0);
152 EXPECT_GT(codec.num_channels, 0);
153 }
154
155 void VerifyVideoCodecCapability(const webrtc::RtpCodecCapability& codec) {
156 EXPECT_EQ(codec.kind, cricket::MEDIA_TYPE_VIDEO);
157 EXPECT_FALSE(codec.name.empty());
158 EXPECT_GT(codec.clock_rate, 0);
159 }
160
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000161 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 NullPeerConnectionObserver observer_;
kwibergd1fe2812016-04-27 06:47:29 -0700163 std::unique_ptr<cricket::FakePortAllocator> port_allocator_;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800164 // Since the PC owns the port allocator after it's been initialized,
165 // this should only be used when known to be safe.
166 cricket::FakePortAllocator* raw_port_allocator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167};
168
169// Verify creation of PeerConnection using internal ADM, video factory and
170// internal libjingle threads.
henrika919dc2e2017-10-12 14:24:55 +0200171// TODO(henrika): disabling this test since relying on real audio can result in
172// flaky tests and focus on details that are out of scope for you might expect
173// for a PeerConnectionFactory unit test.
174// See https://bugs.chromium.org/p/webrtc/issues/detail?id=7806 for details.
175TEST(PeerConnectionFactoryTestInternal, DISABLED_CreatePCUsingInternalModules) {
phoglund37ebcf02016-01-08 05:04:57 -0800176#ifdef WEBRTC_ANDROID
177 webrtc::InitializeAndroidObjects();
178#endif
179
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000180 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200181 webrtc::CreatePeerConnectionFactory(
Anders Carlsson67537952018-05-03 11:28:29 +0200182 nullptr /* network_thread */, nullptr /* worker_thread */,
183 nullptr /* signaling_thread */, nullptr /* default_adm */,
Karl Wiberg1b0eae32017-10-17 14:48:54 +0200184 webrtc::CreateBuiltinAudioEncoderFactory(),
Anders Carlsson67537952018-05-03 11:28:29 +0200185 webrtc::CreateBuiltinAudioDecoderFactory(),
186 webrtc::CreateBuiltinVideoEncoderFactory(),
187 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
188 nullptr /* audio_processing */));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189
190 NullPeerConnectionObserver observer;
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800191 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192
Henrik Boströmd79599d2016-06-01 13:58:50 +0200193 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
194 new FakeRTCCertificateGenerator());
195 rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
Niels Möllerf06f9232018-08-07 12:32:18 +0200196 config, nullptr, std::move(cert_generator), &observer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197
Henrik Boström5e56c592015-08-11 10:33:13 +0200198 EXPECT_TRUE(pc.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199}
200
Florent Castelli72b751a2018-06-28 14:09:33 +0200201TEST_F(PeerConnectionFactoryTest, CheckRtpSenderAudioCapabilities) {
202 webrtc::RtpCapabilities audio_capabilities =
203 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO);
204 EXPECT_FALSE(audio_capabilities.codecs.empty());
205 for (const auto& codec : audio_capabilities.codecs) {
206 VerifyAudioCodecCapability(codec);
207 }
208 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
209 for (const auto& header_extension : audio_capabilities.header_extensions) {
210 EXPECT_FALSE(header_extension.uri.empty());
211 }
212}
213
214TEST_F(PeerConnectionFactoryTest, CheckRtpSenderVideoCapabilities) {
215 webrtc::RtpCapabilities video_capabilities =
216 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_VIDEO);
217 EXPECT_FALSE(video_capabilities.codecs.empty());
218 for (const auto& codec : video_capabilities.codecs) {
219 VerifyVideoCodecCapability(codec);
220 }
221 EXPECT_FALSE(video_capabilities.header_extensions.empty());
222 for (const auto& header_extension : video_capabilities.header_extensions) {
223 EXPECT_FALSE(header_extension.uri.empty());
224 }
225}
226
227TEST_F(PeerConnectionFactoryTest, CheckRtpSenderDataCapabilities) {
228 webrtc::RtpCapabilities data_capabilities =
229 factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_DATA);
230 EXPECT_TRUE(data_capabilities.codecs.empty());
231 EXPECT_TRUE(data_capabilities.header_extensions.empty());
232}
233
234TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverAudioCapabilities) {
235 webrtc::RtpCapabilities audio_capabilities =
236 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO);
237 EXPECT_FALSE(audio_capabilities.codecs.empty());
238 for (const auto& codec : audio_capabilities.codecs) {
239 VerifyAudioCodecCapability(codec);
240 }
241 EXPECT_FALSE(audio_capabilities.header_extensions.empty());
242 for (const auto& header_extension : audio_capabilities.header_extensions) {
243 EXPECT_FALSE(header_extension.uri.empty());
244 }
245}
246
247TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverVideoCapabilities) {
248 webrtc::RtpCapabilities video_capabilities =
249 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO);
250 EXPECT_FALSE(video_capabilities.codecs.empty());
251 for (const auto& codec : video_capabilities.codecs) {
252 VerifyVideoCodecCapability(codec);
253 }
254 EXPECT_FALSE(video_capabilities.header_extensions.empty());
255 for (const auto& header_extension : video_capabilities.header_extensions) {
256 EXPECT_FALSE(header_extension.uri.empty());
257 }
258}
259
260TEST_F(PeerConnectionFactoryTest, CheckRtpReceiverDataCapabilities) {
261 webrtc::RtpCapabilities data_capabilities =
262 factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_DATA);
263 EXPECT_TRUE(data_capabilities.codecs.empty());
264 EXPECT_TRUE(data_capabilities.header_extensions.empty());
265}
266
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000267// This test verifies creation of PeerConnection with valid STUN and TURN
268// configuration. Also verifies the URL's parsed correctly as expected.
269TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000270 PeerConnectionInterface::RTCConfiguration config;
271 webrtc::PeerConnectionInterface::IceServer ice_server;
272 ice_server.uri = kStunIceServer;
273 config.servers.push_back(ice_server);
274 ice_server.uri = kTurnIceServer;
275 ice_server.password = kTurnPassword;
276 config.servers.push_back(ice_server);
277 ice_server.uri = kTurnIceServerWithTransport;
278 ice_server.password = kTurnPassword;
279 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200280 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
281 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200282 rtc::scoped_refptr<PeerConnectionInterface> pc(
283 factory_->CreatePeerConnection(config, std::move(port_allocator_),
284 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800285 ASSERT_TRUE(pc.get() != NULL);
286 cricket::ServerAddresses stun_servers;
287 rtc::SocketAddress stun1("stun.l.google.com", 19302);
288 stun_servers.insert(stun1);
289 VerifyStunServers(stun_servers);
290 std::vector<cricket::RelayServerConfig> turn_servers;
291 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800292 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800293 turn_servers.push_back(turn1);
294 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800295 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800296 turn_servers.push_back(turn2);
297 VerifyTurnServers(turn_servers);
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000298}
299
300// This test verifies creation of PeerConnection with valid STUN and TURN
Joachim Bauch7c4e7452015-05-28 23:06:30 +0200301// configuration. Also verifies the list of URL's parsed correctly as expected.
302TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
303 PeerConnectionInterface::RTCConfiguration config;
304 webrtc::PeerConnectionInterface::IceServer ice_server;
305 ice_server.urls.push_back(kStunIceServer);
306 ice_server.urls.push_back(kTurnIceServer);
307 ice_server.urls.push_back(kTurnIceServerWithTransport);
308 ice_server.password = kTurnPassword;
309 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200310 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
311 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200312 rtc::scoped_refptr<PeerConnectionInterface> pc(
313 factory_->CreatePeerConnection(config, std::move(port_allocator_),
314 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800315 ASSERT_TRUE(pc.get() != NULL);
316 cricket::ServerAddresses stun_servers;
317 rtc::SocketAddress stun1("stun.l.google.com", 19302);
318 stun_servers.insert(stun1);
319 VerifyStunServers(stun_servers);
320 std::vector<cricket::RelayServerConfig> turn_servers;
321 cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
hnsl277b2502016-12-13 05:17:23 -0800322 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800323 turn_servers.push_back(turn1);
324 cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800325 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800326 turn_servers.push_back(turn2);
327 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000328}
329
330TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000331 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 webrtc::PeerConnectionInterface::IceServer ice_server;
333 ice_server.uri = kStunIceServer;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000334 config.servers.push_back(ice_server);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 ice_server.uri = kTurnIceServerWithNoUsernameInUri;
336 ice_server.username = kTurnUsername;
337 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000338 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200339 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
340 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200341 rtc::scoped_refptr<PeerConnectionInterface> pc(
342 factory_->CreatePeerConnection(config, std::move(port_allocator_),
343 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800344 ASSERT_TRUE(pc.get() != NULL);
345 std::vector<cricket::RelayServerConfig> turn_servers;
346 cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
hnsl277b2502016-12-13 05:17:23 -0800347 kTurnPassword, cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800348 turn_servers.push_back(turn);
349 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350}
351
352// This test verifies the PeerConnection created properly with TURN url which
353// has transport parameter in it.
354TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000355 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356 webrtc::PeerConnectionInterface::IceServer ice_server;
357 ice_server.uri = kTurnIceServerWithTransport;
358 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000359 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200360 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
361 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200362 rtc::scoped_refptr<PeerConnectionInterface> pc(
363 factory_->CreatePeerConnection(config, std::move(port_allocator_),
364 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800365 ASSERT_TRUE(pc.get() != NULL);
366 std::vector<cricket::RelayServerConfig> turn_servers;
367 cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800368 kTurnPassword, cricket::PROTO_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800369 turn_servers.push_back(turn);
370 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371}
372
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000374 PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 webrtc::PeerConnectionInterface::IceServer ice_server;
376 ice_server.uri = kSecureTurnIceServer;
377 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000378 config.servers.push_back(ice_server);
wu@webrtc.org78187522013-10-07 23:32:02 +0000379 ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
380 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000381 config.servers.push_back(ice_server);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000382 ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
383 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000384 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200385 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
386 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200387 rtc::scoped_refptr<PeerConnectionInterface> pc(
388 factory_->CreatePeerConnection(config, std::move(port_allocator_),
389 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800390 ASSERT_TRUE(pc.get() != NULL);
391 std::vector<cricket::RelayServerConfig> turn_servers;
392 cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test",
hnsl277b2502016-12-13 05:17:23 -0800393 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800394 turn_servers.push_back(turn1);
wu@webrtc.org78187522013-10-07 23:32:02 +0000395 // TURNS with transport param should be default to tcp.
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800396 cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport",
hnsl277b2502016-12-13 05:17:23 -0800397 kTurnPassword, cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800398 turn_servers.push_back(turn2);
399 cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
400 "test_no_transport", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800401 cricket::PROTO_TLS);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800402 turn_servers.push_back(turn3);
403 VerifyTurnServers(turn_servers);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404}
405
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000406TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000407 PeerConnectionInterface::RTCConfiguration config;
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000408 webrtc::PeerConnectionInterface::IceServer ice_server;
409 ice_server.uri = kStunIceServerWithIPv4Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000410 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000411 ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000412 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000413 ice_server.uri = kStunIceServerWithIPv6Address;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000414 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000415 ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000416 config.servers.push_back(ice_server);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000417 ice_server.uri = kTurnIceServerWithIPv6Address;
418 ice_server.password = kTurnPassword;
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000419 config.servers.push_back(ice_server);
Henrik Boströmd79599d2016-06-01 13:58:50 +0200420 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
421 new FakeRTCCertificateGenerator());
Niels Möllerf06f9232018-08-07 12:32:18 +0200422 rtc::scoped_refptr<PeerConnectionInterface> pc(
423 factory_->CreatePeerConnection(config, std::move(port_allocator_),
424 std::move(cert_generator), &observer_));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800425 ASSERT_TRUE(pc.get() != NULL);
426 cricket::ServerAddresses stun_servers;
427 rtc::SocketAddress stun1("1.2.3.4", 1234);
428 stun_servers.insert(stun1);
429 rtc::SocketAddress stun2("1.2.3.4", 3478);
430 stun_servers.insert(stun2); // Default port
431 rtc::SocketAddress stun3("2401:fa00:4::", 1234);
432 stun_servers.insert(stun3);
433 rtc::SocketAddress stun4("2401:fa00:4::", 3478);
434 stun_servers.insert(stun4); // Default port
435 VerifyStunServers(stun_servers);
buildbot@webrtc.orgf875f152014-04-14 16:06:21 +0000436
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800437 std::vector<cricket::RelayServerConfig> turn_servers;
438 cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword,
hnsl277b2502016-12-13 05:17:23 -0800439 cricket::PROTO_UDP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800440 turn_servers.push_back(turn1);
441 VerifyTurnServers(turn_servers);
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000442}
443
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444// This test verifies the captured stream is rendered locally using a
445// local video track.
446TEST_F(PeerConnectionFactoryTest, LocalRendering) {
Niels Möller3eaf9f12019-01-17 16:31:36 +0100447 rtc::scoped_refptr<webrtc::FakeVideoTrackSource> source =
448 webrtc::FakeVideoTrackSource::Create(/*is_screencast=*/false);
449
450 cricket::FakeFrameSource frame_source(1280, 720,
451 rtc::kNumMicrosecsPerSec / 30);
452
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 ASSERT_TRUE(source.get() != NULL);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000454 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 factory_->CreateVideoTrack("testlabel", source));
456 ASSERT_TRUE(track.get() != NULL);
457 FakeVideoTrackRenderer local_renderer(track);
458
459 EXPECT_EQ(0, local_renderer.num_rendered_frames());
Niels Möller3eaf9f12019-01-17 16:31:36 +0100460 source->InjectFrame(frame_source.GetFrame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 EXPECT_EQ(1, local_renderer.num_rendered_frames());
nisse81354f52016-01-19 00:23:24 -0800462 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463
464 track->set_enabled(false);
Niels Möller3eaf9f12019-01-17 16:31:36 +0100465 source->InjectFrame(frame_source.GetFrame());
nisse81354f52016-01-19 00:23:24 -0800466 EXPECT_EQ(2, local_renderer.num_rendered_frames());
467 EXPECT_TRUE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468
469 track->set_enabled(true);
Niels Möller3eaf9f12019-01-17 16:31:36 +0100470 source->InjectFrame(frame_source.GetFrame());
nisse81354f52016-01-19 00:23:24 -0800471 EXPECT_EQ(3, local_renderer.num_rendered_frames());
472 EXPECT_FALSE(local_renderer.black_frame());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473}