blob: 98c79c30c2d3b822cdad693de24bf8471f8030a3 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
Fredrik Solenberg709ed672015-09-15 12:26:33 +020028#include "talk/app/webrtc/mediacontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029#include "talk/media/base/fakecapturemanager.h"
30#include "talk/media/base/fakemediaengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/testutils.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000032#include "talk/media/devices/fakedevicemanager.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020033#include "talk/media/webrtc/fakewebrtccall.h"
torbjornga81a42f2015-09-23 02:16:58 -070034#include "webrtc/p2p/base/fakesession.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/session/media/channelmanager.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000036#include "webrtc/base/gunit.h"
37#include "webrtc/base/logging.h"
38#include "webrtc/base/thread.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039
40namespace cricket {
41
42static const AudioCodec kAudioCodecs[] = {
43 AudioCodec(97, "voice", 1, 2, 3, 0),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044 AudioCodec(111, "OPUS", 48000, 32000, 2, 0),
45};
46
47static const VideoCodec kVideoCodecs[] = {
48 VideoCodec(99, "H264", 100, 200, 300, 0),
49 VideoCodec(100, "VP8", 100, 200, 300, 0),
50 VideoCodec(96, "rtx", 100, 200, 300, 0),
51};
52
Fredrik Solenberg709ed672015-09-15 12:26:33 +020053class FakeMediaController : public webrtc::MediaControllerInterface {
54 public:
55 explicit FakeMediaController(webrtc::Call* call) : call_(call) {
henrikg91d6ede2015-09-17 00:24:34 -070056 RTC_DCHECK(nullptr != call);
Fredrik Solenberg709ed672015-09-15 12:26:33 +020057 }
58 ~FakeMediaController() override {}
59 webrtc::Call* call_w() override { return call_; }
60 private:
61 webrtc::Call* call_;
62};
63
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064class ChannelManagerTest : public testing::Test {
65 protected:
torbjornga81a42f2015-09-23 02:16:58 -070066 ChannelManagerTest() : fake_call_(webrtc::Call::Config()),
67 fake_mc_(&fake_call_), fme_(NULL), fdm_(NULL), fcm_(NULL), cm_(NULL) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068
69 virtual void SetUp() {
70 fme_ = new cricket::FakeMediaEngine();
71 fme_->SetAudioCodecs(MAKE_VECTOR(kAudioCodecs));
72 fme_->SetVideoCodecs(MAKE_VECTOR(kVideoCodecs));
73 fdme_ = new cricket::FakeDataEngine();
74 fdm_ = new cricket::FakeDeviceManager();
75 fcm_ = new cricket::FakeCaptureManager();
76 cm_ = new cricket::ChannelManager(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000077 fme_, fdme_, fdm_, fcm_, rtc::Thread::Current());
torbjornga81a42f2015-09-23 02:16:58 -070078 session_ = new cricket::FakeSession(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079
80 std::vector<std::string> in_device_list, out_device_list, vid_device_list;
81 in_device_list.push_back("audio-in1");
82 in_device_list.push_back("audio-in2");
83 out_device_list.push_back("audio-out1");
84 out_device_list.push_back("audio-out2");
85 vid_device_list.push_back("video-in1");
86 vid_device_list.push_back("video-in2");
87 fdm_->SetAudioInputDevices(in_device_list);
88 fdm_->SetAudioOutputDevices(out_device_list);
89 fdm_->SetVideoCaptureDevices(vid_device_list);
90 }
91
92 virtual void TearDown() {
torbjornga81a42f2015-09-23 02:16:58 -070093 delete session_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 delete cm_;
95 cm_ = NULL;
96 fdm_ = NULL;
97 fcm_ = NULL;
98 fdme_ = NULL;
99 fme_ = NULL;
100 }
101
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000102 rtc::Thread worker_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200103 cricket::FakeCall fake_call_;
104 cricket::FakeMediaController fake_mc_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105 cricket::FakeMediaEngine* fme_;
106 cricket::FakeDataEngine* fdme_;
107 cricket::FakeDeviceManager* fdm_;
108 cricket::FakeCaptureManager* fcm_;
109 cricket::ChannelManager* cm_;
torbjornga81a42f2015-09-23 02:16:58 -0700110 cricket::FakeSession* session_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111};
112
113// Test that we startup/shutdown properly.
114TEST_F(ChannelManagerTest, StartupShutdown) {
115 EXPECT_FALSE(cm_->initialized());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000116 EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117 EXPECT_TRUE(cm_->Init());
118 EXPECT_TRUE(cm_->initialized());
119 cm_->Terminate();
120 EXPECT_FALSE(cm_->initialized());
121}
122
123// Test that we startup/shutdown properly with a worker thread.
124TEST_F(ChannelManagerTest, StartupShutdownOnThread) {
125 worker_.Start();
126 EXPECT_FALSE(cm_->initialized());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000127 EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 EXPECT_TRUE(cm_->set_worker_thread(&worker_));
129 EXPECT_EQ(&worker_, cm_->worker_thread());
130 EXPECT_TRUE(cm_->Init());
131 EXPECT_TRUE(cm_->initialized());
132 // Setting the worker thread while initialized should fail.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000133 EXPECT_FALSE(cm_->set_worker_thread(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 cm_->Terminate();
135 EXPECT_FALSE(cm_->initialized());
136}
137
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138// Test that we can create and destroy a voice and video channel.
139TEST_F(ChannelManagerTest, CreateDestroyChannels) {
140 EXPECT_TRUE(cm_->Init());
torbjornga81a42f2015-09-23 02:16:58 -0700141 cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
142 &fake_mc_, session_, cricket::CN_AUDIO, false, AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200143 EXPECT_TRUE(voice_channel != nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700144 cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
145 &fake_mc_, session_, cricket::CN_VIDEO, false, VideoOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200146 EXPECT_TRUE(video_channel != nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700147 cricket::DataChannel* data_channel =
148 cm_->CreateDataChannel(session_, cricket::CN_DATA,
149 false, cricket::DCT_RTP);
Jelena Marusicc28a8962015-05-29 15:05:44 +0200150 EXPECT_TRUE(data_channel != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151 cm_->DestroyVideoChannel(video_channel);
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200152 cm_->DestroyVoiceChannel(voice_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 cm_->DestroyDataChannel(data_channel);
154 cm_->Terminate();
155}
156
157// Test that we can create and destroy a voice and video channel with a worker.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000158TEST_F(ChannelManagerTest, CreateDestroyChannelsOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 worker_.Start();
160 EXPECT_TRUE(cm_->set_worker_thread(&worker_));
161 EXPECT_TRUE(cm_->Init());
torbjornga81a42f2015-09-23 02:16:58 -0700162 delete session_;
163 session_ = new cricket::FakeSession(&worker_, true);
164 cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
165 &fake_mc_, session_, cricket::CN_AUDIO, false, AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200166 EXPECT_TRUE(voice_channel != nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700167 cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
168 &fake_mc_, session_, cricket::CN_VIDEO, false, VideoOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200169 EXPECT_TRUE(video_channel != nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700170 cricket::DataChannel* data_channel =
171 cm_->CreateDataChannel(session_, cricket::CN_DATA,
172 false, cricket::DCT_RTP);
Jelena Marusicc28a8962015-05-29 15:05:44 +0200173 EXPECT_TRUE(data_channel != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174 cm_->DestroyVideoChannel(video_channel);
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200175 cm_->DestroyVoiceChannel(voice_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 cm_->DestroyDataChannel(data_channel);
177 cm_->Terminate();
178}
179
180// Test that we fail to create a voice/video channel if the session is unable
181// to create a cricket::TransportChannel
182TEST_F(ChannelManagerTest, NoTransportChannelTest) {
183 EXPECT_TRUE(cm_->Init());
torbjornga81a42f2015-09-23 02:16:58 -0700184 session_->set_fail_channel_creation(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 // The test is useless unless the session does not fail creating
186 // cricket::TransportChannel.
torbjornga81a42f2015-09-23 02:16:58 -0700187 ASSERT_TRUE(session_->CreateChannel(
Jelena Marusicc28a8962015-05-29 15:05:44 +0200188 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP) == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189
torbjornga81a42f2015-09-23 02:16:58 -0700190 cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
191 &fake_mc_, session_, cricket::CN_AUDIO, false, AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200192 EXPECT_TRUE(voice_channel == nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700193 cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
194 &fake_mc_, session_, cricket::CN_VIDEO, false, VideoOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200195 EXPECT_TRUE(video_channel == nullptr);
torbjornga81a42f2015-09-23 02:16:58 -0700196 cricket::DataChannel* data_channel =
197 cm_->CreateDataChannel(session_, cricket::CN_DATA,
198 false, cricket::DCT_RTP);
Jelena Marusicc28a8962015-05-29 15:05:44 +0200199 EXPECT_TRUE(data_channel == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 cm_->Terminate();
201}
202
203// Test that SetDefaultVideoCodec passes through the right values.
204TEST_F(ChannelManagerTest, SetDefaultVideoEncoderConfig) {
205 cricket::VideoCodec codec(96, "G264", 1280, 720, 60, 0);
206 cricket::VideoEncoderConfig config(codec, 1, 2);
207 EXPECT_TRUE(cm_->Init());
208 EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
209 EXPECT_EQ(config, fme_->default_video_encoder_config());
210}
211
sergeyu@chromium.orga59696b2013-09-13 23:48:58 +0000212struct GetCapturerFrameSize : public sigslot::has_slots<> {
213 void OnVideoFrame(VideoCapturer* capturer, const VideoFrame* frame) {
214 width = frame->GetWidth();
215 height = frame->GetHeight();
216 }
217 GetCapturerFrameSize(VideoCapturer* capturer) : width(0), height(0) {
218 capturer->SignalVideoFrame.connect(this,
219 &GetCapturerFrameSize::OnVideoFrame);
220 static_cast<FakeVideoCapturer*>(capturer)->CaptureFrame();
221 }
222 size_t width;
223 size_t height;
224};
225
226TEST_F(ChannelManagerTest, DefaultCapturerAspectRatio) {
227 VideoCodec codec(100, "VP8", 640, 360, 30, 0);
228 VideoFormat format(640, 360, 33, FOURCC_ANY);
229 VideoEncoderConfig config(codec, 1, 2);
230 EXPECT_TRUE(cm_->Init());
231 // A capturer created before the default encoder config is set will have no
magjed@webrtc.org35c1ace2014-11-13 16:21:49 +0000232 // set aspect ratio, so it'll be 4:3 (based on the fake video capture impl).
sergeyu@chromium.orga59696b2013-09-13 23:48:58 +0000233 VideoCapturer* capturer = cm_->CreateVideoCapturer();
234 ASSERT_TRUE(capturer != NULL);
235 EXPECT_EQ(CS_RUNNING, capturer->Start(format));
236 GetCapturerFrameSize size(capturer);
237 EXPECT_EQ(640u, size.width);
magjed@webrtc.org35c1ace2014-11-13 16:21:49 +0000238 EXPECT_EQ(480u, size.height);
sergeyu@chromium.orga59696b2013-09-13 23:48:58 +0000239 delete capturer;
240 // Try again, but with the encoder config set to 16:9.
241 EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
242 capturer = cm_->CreateVideoCapturer();
243 ASSERT_TRUE(capturer != NULL);
244 EXPECT_EQ(CS_RUNNING, capturer->Start(format));
245 GetCapturerFrameSize cropped_size(capturer);
246 EXPECT_EQ(640u, cropped_size.width);
247 EXPECT_EQ(360u, cropped_size.height);
248 delete capturer;
249}
250
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000251// Test that SetDefaultVideoCodec passes through the right values.
252TEST_F(ChannelManagerTest, SetDefaultVideoCodecBeforeInit) {
253 cricket::VideoCodec codec(96, "G264", 1280, 720, 60, 0);
254 cricket::VideoEncoderConfig config(codec, 1, 2);
255 EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
256 EXPECT_TRUE(cm_->Init());
257 EXPECT_EQ(config, fme_->default_video_encoder_config());
258}
259
260TEST_F(ChannelManagerTest, SetAudioOptionsBeforeInit) {
261 // Test that values that we set before Init are applied.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000262 AudioOptions options;
263 options.auto_gain_control.Set(true);
264 options.echo_cancellation.Set(false);
265 EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
266 std::string audio_in, audio_out;
267 AudioOptions set_options;
268 // Check options before Init.
269 EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, &set_options));
270 EXPECT_EQ("audio-in1", audio_in);
271 EXPECT_EQ("audio-out1", audio_out);
272 EXPECT_EQ(options, set_options);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000273 EXPECT_TRUE(cm_->Init());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000274 // Check options after Init.
275 EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, &set_options));
276 EXPECT_EQ("audio-in1", audio_in);
277 EXPECT_EQ("audio-out1", audio_out);
278 EXPECT_EQ(options, set_options);
279 // At this point, the media engine should also be initialized.
280 EXPECT_EQ(options, fme_->audio_options());
henrike@webrtc.org0481f152014-08-19 14:56:59 +0000281 EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000282 fme_->audio_delay_offset());
283}
284
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000285TEST_F(ChannelManagerTest, GetAudioOptionsWithNullParameters) {
286 std::string audio_in, audio_out;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000287 AudioOptions options;
288 options.echo_cancellation.Set(true);
289 EXPECT_TRUE(cm_->SetAudioOptions("audio-in2", "audio-out2", options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000290 EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, NULL, NULL));
291 EXPECT_EQ("audio-in2", audio_in);
292 EXPECT_TRUE(cm_->GetAudioOptions(NULL, &audio_out, NULL));
293 EXPECT_EQ("audio-out2", audio_out);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000294 AudioOptions out_options;
295 EXPECT_TRUE(cm_->GetAudioOptions(NULL, NULL, &out_options));
296 bool echo_cancellation = false;
297 EXPECT_TRUE(out_options.echo_cancellation.Get(&echo_cancellation));
298 EXPECT_TRUE(echo_cancellation);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000299}
300
301TEST_F(ChannelManagerTest, SetAudioOptions) {
302 // Test initial state.
303 EXPECT_TRUE(cm_->Init());
304 EXPECT_EQ(std::string(cricket::DeviceManagerInterface::kDefaultDeviceName),
305 fme_->audio_in_device());
306 EXPECT_EQ(std::string(cricket::DeviceManagerInterface::kDefaultDeviceName),
307 fme_->audio_out_device());
henrike@webrtc.org0481f152014-08-19 14:56:59 +0000308 EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000309 fme_->audio_delay_offset());
310 // Test setting specific values.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000311 AudioOptions options;
312 options.auto_gain_control.Set(true);
313 EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000314 EXPECT_EQ("audio-in1", fme_->audio_in_device());
315 EXPECT_EQ("audio-out1", fme_->audio_out_device());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000316 bool auto_gain_control = false;
317 EXPECT_TRUE(
318 fme_->audio_options().auto_gain_control.Get(&auto_gain_control));
319 EXPECT_TRUE(auto_gain_control);
henrike@webrtc.org0481f152014-08-19 14:56:59 +0000320 EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000321 fme_->audio_delay_offset());
322 // Test setting bad values.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000323 EXPECT_FALSE(cm_->SetAudioOptions("audio-in9", "audio-out2", options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000324}
325
326TEST_F(ChannelManagerTest, SetCaptureDeviceBeforeInit) {
327 // Test that values that we set before Init are applied.
328 EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
329 EXPECT_TRUE(cm_->Init());
330 EXPECT_EQ("video-in2", cm_->video_device_name());
331}
332
333TEST_F(ChannelManagerTest, GetCaptureDeviceBeforeInit) {
334 std::string video_in;
335 // Test that GetCaptureDevice works before Init.
336 EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
337 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
338 EXPECT_EQ("video-in1", video_in);
339 // Test that options set before Init can be gotten after Init.
340 EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
341 EXPECT_TRUE(cm_->Init());
342 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
343 EXPECT_EQ("video-in2", video_in);
344}
345
346TEST_F(ChannelManagerTest, SetCaptureDevice) {
347 // Test setting defaults.
348 EXPECT_TRUE(cm_->Init());
349 EXPECT_TRUE(cm_->SetCaptureDevice("")); // will use DeviceManager default
350 EXPECT_EQ("video-in1", cm_->video_device_name());
351 // Test setting specific values.
352 EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
353 EXPECT_EQ("video-in2", cm_->video_device_name());
354 // TODO(juberti): Add test for invalid value here.
355}
356
357// Test unplugging and plugging back the preferred devices. When the preferred
358// device is unplugged, we fall back to the default device. When the preferred
359// device is plugged back, we use it.
360TEST_F(ChannelManagerTest, SetAudioOptionsUnplugPlug) {
361 // Set preferences "audio-in1" and "audio-out1" before init.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000362 AudioOptions options;
363 EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 // Unplug device "audio-in1" and "audio-out1".
365 std::vector<std::string> in_device_list, out_device_list;
366 in_device_list.push_back("audio-in2");
367 out_device_list.push_back("audio-out2");
368 fdm_->SetAudioInputDevices(in_device_list);
369 fdm_->SetAudioOutputDevices(out_device_list);
370 // Init should fall back to default devices.
371 EXPECT_TRUE(cm_->Init());
372 // The media engine should use the default.
373 EXPECT_EQ("", fme_->audio_in_device());
374 EXPECT_EQ("", fme_->audio_out_device());
375 // The channel manager keeps the preferences "audio-in1" and "audio-out1".
376 std::string audio_in, audio_out;
377 EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, NULL));
378 EXPECT_EQ("audio-in1", audio_in);
379 EXPECT_EQ("audio-out1", audio_out);
380 cm_->Terminate();
381
382 // Plug devices "audio-in2" and "audio-out2" back.
383 in_device_list.push_back("audio-in1");
384 out_device_list.push_back("audio-out1");
385 fdm_->SetAudioInputDevices(in_device_list);
386 fdm_->SetAudioOutputDevices(out_device_list);
387 // Init again. The preferences, "audio-in2" and "audio-out2", are used.
388 EXPECT_TRUE(cm_->Init());
389 EXPECT_EQ("audio-in1", fme_->audio_in_device());
390 EXPECT_EQ("audio-out1", fme_->audio_out_device());
391 EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, NULL));
392 EXPECT_EQ("audio-in1", audio_in);
393 EXPECT_EQ("audio-out1", audio_out);
394}
395
396// We have one camera. Unplug it, fall back to no camera.
397TEST_F(ChannelManagerTest, SetCaptureDeviceUnplugPlugOneCamera) {
398 // Set preferences "video-in1" before init.
399 std::vector<std::string> vid_device_list;
400 vid_device_list.push_back("video-in1");
401 fdm_->SetVideoCaptureDevices(vid_device_list);
402 EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
403
404 // Unplug "video-in1".
405 vid_device_list.clear();
406 fdm_->SetVideoCaptureDevices(vid_device_list);
407
408 // Init should fall back to avatar.
409 EXPECT_TRUE(cm_->Init());
410 // The media engine should use no camera.
411 EXPECT_EQ("", cm_->video_device_name());
412 // The channel manager keeps the user preference "video-in".
413 std::string video_in;
414 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
415 EXPECT_EQ("video-in1", video_in);
416 cm_->Terminate();
417
418 // Plug device "video-in1" back.
419 vid_device_list.push_back("video-in1");
420 fdm_->SetVideoCaptureDevices(vid_device_list);
421 // Init again. The user preferred device, "video-in1", is used.
422 EXPECT_TRUE(cm_->Init());
423 EXPECT_EQ("video-in1", cm_->video_device_name());
424 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
425 EXPECT_EQ("video-in1", video_in);
426}
427
428// We have multiple cameras. Unplug the preferred, fall back to another camera.
429TEST_F(ChannelManagerTest, SetCaptureDeviceUnplugPlugTwoDevices) {
430 // Set video device to "video-in1" before init.
431 EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
432 // Unplug device "video-in1".
433 std::vector<std::string> vid_device_list;
434 vid_device_list.push_back("video-in2");
435 fdm_->SetVideoCaptureDevices(vid_device_list);
436 // Init should fall back to default device "video-in2".
437 EXPECT_TRUE(cm_->Init());
438 // The media engine should use the default device "video-in2".
439 EXPECT_EQ("video-in2", cm_->video_device_name());
440 // The channel manager keeps the user preference "video-in".
441 std::string video_in;
442 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
443 EXPECT_EQ("video-in1", video_in);
444 cm_->Terminate();
445
446 // Plug device "video-in1" back.
447 vid_device_list.push_back("video-in1");
448 fdm_->SetVideoCaptureDevices(vid_device_list);
449 // Init again. The user preferred device, "video-in1", is used.
450 EXPECT_TRUE(cm_->Init());
451 EXPECT_EQ("video-in1", cm_->video_device_name());
452 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
453 EXPECT_EQ("video-in1", video_in);
454}
455
456TEST_F(ChannelManagerTest, GetCaptureDevice) {
457 std::string video_in;
458 // Test setting/getting defaults.
459 EXPECT_TRUE(cm_->Init());
460 EXPECT_TRUE(cm_->SetCaptureDevice(""));
461 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
462 EXPECT_EQ("video-in1", video_in);
463 // Test setting/getting specific values.
464 EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
465 EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
466 EXPECT_EQ("video-in2", video_in);
467}
468
469TEST_F(ChannelManagerTest, GetSetOutputVolumeBeforeInit) {
470 int level;
471 // Before init, SetOutputVolume() remembers the volume but does not change the
472 // volume of the engine. GetOutputVolume() should fail.
473 EXPECT_EQ(-1, fme_->output_volume());
474 EXPECT_FALSE(cm_->GetOutputVolume(&level));
475 EXPECT_FALSE(cm_->SetOutputVolume(-1)); // Invalid volume.
476 EXPECT_TRUE(cm_->SetOutputVolume(99));
477 EXPECT_EQ(-1, fme_->output_volume());
478
479 // Init() will apply the remembered volume.
480 EXPECT_TRUE(cm_->Init());
481 EXPECT_TRUE(cm_->GetOutputVolume(&level));
482 EXPECT_EQ(99, level);
483 EXPECT_EQ(level, fme_->output_volume());
484
485 EXPECT_TRUE(cm_->SetOutputVolume(60));
486 EXPECT_TRUE(cm_->GetOutputVolume(&level));
487 EXPECT_EQ(60, level);
488 EXPECT_EQ(level, fme_->output_volume());
489}
490
491TEST_F(ChannelManagerTest, GetSetOutputVolume) {
492 int level;
493 EXPECT_TRUE(cm_->Init());
494 EXPECT_TRUE(cm_->GetOutputVolume(&level));
495 EXPECT_EQ(level, fme_->output_volume());
496
497 EXPECT_FALSE(cm_->SetOutputVolume(-1)); // Invalid volume.
498 EXPECT_TRUE(cm_->SetOutputVolume(60));
499 EXPECT_EQ(60, fme_->output_volume());
500 EXPECT_TRUE(cm_->GetOutputVolume(&level));
501 EXPECT_EQ(60, level);
502}
503
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504// Test that logging options set before Init are applied properly,
505// and retained even after Init.
506TEST_F(ChannelManagerTest, SetLoggingBeforeInit) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000507 cm_->SetVoiceLogging(rtc::LS_INFO, "test-voice");
508 cm_->SetVideoLogging(rtc::LS_VERBOSE, "test-video");
509 EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000511 EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
513 EXPECT_TRUE(cm_->Init());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000514 EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000515 EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000516 EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517 EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
518}
519
520// Test that logging options set after Init are applied properly.
521TEST_F(ChannelManagerTest, SetLogging) {
522 EXPECT_TRUE(cm_->Init());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000523 cm_->SetVoiceLogging(rtc::LS_INFO, "test-voice");
524 cm_->SetVideoLogging(rtc::LS_VERBOSE, "test-video");
525 EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000527 EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
529}
530
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531TEST_F(ChannelManagerTest, SetVideoRtxEnabled) {
532 std::vector<VideoCodec> codecs;
533 const VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
534
535 // By default RTX is disabled.
536 cm_->GetSupportedVideoCodecs(&codecs);
537 EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
538
539 // Enable and check.
540 EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
541 cm_->GetSupportedVideoCodecs(&codecs);
542 EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
543
544 // Disable and check.
545 EXPECT_TRUE(cm_->SetVideoRtxEnabled(false));
546 cm_->GetSupportedVideoCodecs(&codecs);
547 EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
548
549 // Cannot toggle rtx after initialization.
550 EXPECT_TRUE(cm_->Init());
551 EXPECT_FALSE(cm_->SetVideoRtxEnabled(true));
552 EXPECT_FALSE(cm_->SetVideoRtxEnabled(false));
553
554 // Can set again after terminate.
555 cm_->Terminate();
556 EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
557 cm_->GetSupportedVideoCodecs(&codecs);
558 EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
559}
560
561} // namespace cricket