blob: c03056c637abfcc47a25e740f58e1cb6cd822076 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2008 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -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.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
deadbeef112b2e92017-02-10 20:13:37 -080011#include <memory>
12
skvlad11a9cbf2016-10-07 11:53:05 -070013#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
kjellandera96e2d72016-02-04 23:52:28 -080014#include "webrtc/media/base/fakemediaengine.h"
15#include "webrtc/media/base/fakevideocapturer.h"
16#include "webrtc/media/base/testutils.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010017#include "webrtc/media/engine/fakewebrtccall.h"
deadbeefcbecd352015-09-23 11:50:27 -070018#include "webrtc/p2p/base/faketransportcontroller.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010019#include "webrtc/pc/channelmanager.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020020#include "webrtc/rtc_base/gunit.h"
21#include "webrtc/rtc_base/logging.h"
22#include "webrtc/rtc_base/thread.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023
deadbeef1a2183d2017-02-10 23:44:49 -080024namespace {
deadbeef7af91dd2016-12-13 11:29:11 -080025const bool kDefaultSrtpRequired = true;
26}
27
28namespace cricket {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
30static const AudioCodec kAudioCodecs[] = {
deadbeef67cf2c12016-04-13 10:07:16 -070031 AudioCodec(97, "voice", 1, 2, 3), AudioCodec(111, "OPUS", 48000, 32000, 2),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032};
33
34static const VideoCodec kVideoCodecs[] = {
perkj26752742016-10-24 01:21:16 -070035 VideoCodec(99, "H264"), VideoCodec(100, "VP8"), VideoCodec(96, "rtx"),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036};
37
38class ChannelManagerTest : public testing::Test {
39 protected:
deadbeefcbecd352015-09-23 11:50:27 -070040 ChannelManagerTest()
charujaina117b042017-07-13 07:06:39 -070041 : fme_(new cricket::FakeMediaEngine()),
stefanc1aeaf02015-10-15 07:26:07 -070042 fdme_(new cricket::FakeDataEngine()),
deadbeef112b2e92017-02-10 20:13:37 -080043 cm_(new cricket::ChannelManager(
44 std::unique_ptr<MediaEngineInterface>(fme_),
45 std::unique_ptr<DataEngineInterface>(fdme_),
46 rtc::Thread::Current())),
skvlad11a9cbf2016-10-07 11:53:05 -070047 fake_call_(webrtc::Call::Config(&event_log_)),
stefanc1aeaf02015-10-15 07:26:07 -070048 transport_controller_(
deadbeef112b2e92017-02-10 20:13:37 -080049 new cricket::FakeTransportController(ICEROLE_CONTROLLING)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050 fme_->SetAudioCodecs(MAKE_VECTOR(kAudioCodecs));
51 fme_->SetVideoCodecs(MAKE_VECTOR(kVideoCodecs));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052 }
53
skvlad11a9cbf2016-10-07 11:53:05 -070054 webrtc::RtcEventLogNullImpl event_log_;
charujaina117b042017-07-13 07:06:39 -070055 rtc::Thread network_;
56 rtc::Thread worker_;
deadbeef112b2e92017-02-10 20:13:37 -080057 // |fme_| and |fdme_| are actually owned by |cm_|.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 cricket::FakeMediaEngine* fme_;
59 cricket::FakeDataEngine* fdme_;
deadbeef112b2e92017-02-10 20:13:37 -080060 std::unique_ptr<cricket::ChannelManager> cm_;
stefanc1aeaf02015-10-15 07:26:07 -070061 cricket::FakeCall fake_call_;
deadbeef112b2e92017-02-10 20:13:37 -080062 std::unique_ptr<cricket::FakeTransportController> transport_controller_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063};
64
65// Test that we startup/shutdown properly.
66TEST_F(ChannelManagerTest, StartupShutdown) {
67 EXPECT_FALSE(cm_->initialized());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000068 EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 EXPECT_TRUE(cm_->Init());
70 EXPECT_TRUE(cm_->initialized());
71 cm_->Terminate();
72 EXPECT_FALSE(cm_->initialized());
73}
74
75// Test that we startup/shutdown properly with a worker thread.
76TEST_F(ChannelManagerTest, StartupShutdownOnThread) {
charujaina117b042017-07-13 07:06:39 -070077 network_.Start();
78 worker_.Start();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 EXPECT_FALSE(cm_->initialized());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000080 EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
charujaina117b042017-07-13 07:06:39 -070081 EXPECT_TRUE(cm_->set_network_thread(&network_));
82 EXPECT_EQ(&network_, cm_->network_thread());
83 EXPECT_TRUE(cm_->set_worker_thread(&worker_));
84 EXPECT_EQ(&worker_, cm_->worker_thread());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 EXPECT_TRUE(cm_->Init());
86 EXPECT_TRUE(cm_->initialized());
Danil Chapovalov33b01f22016-05-11 19:55:27 +020087 // Setting the network or worker thread while initialized should fail.
88 EXPECT_FALSE(cm_->set_network_thread(rtc::Thread::Current()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000089 EXPECT_FALSE(cm_->set_worker_thread(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090 cm_->Terminate();
91 EXPECT_FALSE(cm_->initialized());
92}
93
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094// Test that we can create and destroy a voice and video channel.
95TEST_F(ChannelManagerTest, CreateDestroyChannels) {
96 EXPECT_TRUE(cm_->Init());
zhihuangb2cdd932017-01-19 16:54:25 -080097 cricket::DtlsTransportInternal* rtp_transport =
98 transport_controller_->CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080099 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
skvlad6c87a672016-05-17 17:49:52 -0700100 cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700101 &fake_call_, cricket::MediaConfig(),
102 rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800103 rtc::Thread::Current(), cricket::CN_AUDIO, kDefaultSrtpRequired,
104 AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200105 EXPECT_TRUE(voice_channel != nullptr);
skvlad6c87a672016-05-17 17:49:52 -0700106 cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700107 &fake_call_, cricket::MediaConfig(),
108 rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800109 rtc::Thread::Current(), cricket::CN_VIDEO, kDefaultSrtpRequired,
110 VideoOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200111 EXPECT_TRUE(video_channel != nullptr);
deadbeef953c2ce2017-01-09 14:53:41 -0800112 cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700113 cricket::MediaConfig(), rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800114 rtc::Thread::Current(), cricket::CN_DATA, kDefaultSrtpRequired);
deadbeef953c2ce2017-01-09 14:53:41 -0800115 EXPECT_TRUE(rtp_data_channel != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 cm_->DestroyVideoChannel(video_channel);
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200117 cm_->DestroyVoiceChannel(voice_channel);
deadbeef953c2ce2017-01-09 14:53:41 -0800118 cm_->DestroyRtpDataChannel(rtp_data_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 cm_->Terminate();
120}
121
122// Test that we can create and destroy a voice and video channel with a worker.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000123TEST_F(ChannelManagerTest, CreateDestroyChannelsOnThread) {
charujaina117b042017-07-13 07:06:39 -0700124 network_.Start();
125 worker_.Start();
126 EXPECT_TRUE(cm_->set_worker_thread(&worker_));
127 EXPECT_TRUE(cm_->set_network_thread(&network_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 EXPECT_TRUE(cm_->Init());
charujaina117b042017-07-13 07:06:39 -0700129 transport_controller_.reset(
130 new cricket::FakeTransportController(&network_, ICEROLE_CONTROLLING));
zhihuangb2cdd932017-01-19 16:54:25 -0800131 cricket::DtlsTransportInternal* rtp_transport =
132 transport_controller_->CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -0800133 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
skvlad6c87a672016-05-17 17:49:52 -0700134 cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700135 &fake_call_, cricket::MediaConfig(),
136 rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800137 rtc::Thread::Current(), cricket::CN_AUDIO, kDefaultSrtpRequired,
138 AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200139 EXPECT_TRUE(voice_channel != nullptr);
skvlad6c87a672016-05-17 17:49:52 -0700140 cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700141 &fake_call_, cricket::MediaConfig(),
142 rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800143 rtc::Thread::Current(), cricket::CN_VIDEO, kDefaultSrtpRequired,
144 VideoOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200145 EXPECT_TRUE(video_channel != nullptr);
deadbeef953c2ce2017-01-09 14:53:41 -0800146 cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700147 cricket::MediaConfig(), rtp_transport, nullptr /*rtcp_transport*/,
deadbeef1a2183d2017-02-10 23:44:49 -0800148 rtc::Thread::Current(), cricket::CN_DATA, kDefaultSrtpRequired);
deadbeef953c2ce2017-01-09 14:53:41 -0800149 EXPECT_TRUE(rtp_data_channel != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 cm_->DestroyVideoChannel(video_channel);
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200151 cm_->DestroyVoiceChannel(voice_channel);
deadbeef953c2ce2017-01-09 14:53:41 -0800152 cm_->DestroyRtpDataChannel(rtp_data_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 cm_->Terminate();
154}
155
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156TEST_F(ChannelManagerTest, SetVideoRtxEnabled) {
157 std::vector<VideoCodec> codecs;
perkj26752742016-10-24 01:21:16 -0700158 const VideoCodec rtx_codec(96, "rtx");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159
160 // By default RTX is disabled.
magjed3cf8ece2016-11-10 03:36:53 -0800161 cm_->GetSupportedVideoCodecs(&codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
163
164 // Enable and check.
165 EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
magjed3cf8ece2016-11-10 03:36:53 -0800166 cm_->GetSupportedVideoCodecs(&codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
168
169 // Disable and check.
170 EXPECT_TRUE(cm_->SetVideoRtxEnabled(false));
magjed3cf8ece2016-11-10 03:36:53 -0800171 cm_->GetSupportedVideoCodecs(&codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
173
174 // Cannot toggle rtx after initialization.
175 EXPECT_TRUE(cm_->Init());
176 EXPECT_FALSE(cm_->SetVideoRtxEnabled(true));
177 EXPECT_FALSE(cm_->SetVideoRtxEnabled(false));
178
179 // Can set again after terminate.
180 cm_->Terminate();
181 EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
magjed3cf8ece2016-11-10 03:36:53 -0800182 cm_->GetSupportedVideoCodecs(&codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
184}
185
186} // namespace cricket