Home | History | Annotate | Download | only in media
      1 // libjingle
      2 // Copyright 2008 Google Inc.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //  1. Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //  2. Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //  3. The name of the author may not be used to endorse or promote products
     13 //     derived from this software without specific prior written permission.
     14 //
     15 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     16 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     17 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     18 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     19 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     21 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     22 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     23 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     24 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25 
     26 #include "talk/media/base/fakecapturemanager.h"
     27 #include "talk/media/base/fakemediaengine.h"
     28 #include "talk/media/base/fakemediaprocessor.h"
     29 #include "talk/media/base/nullvideorenderer.h"
     30 #include "talk/media/base/testutils.h"
     31 #include "talk/media/devices/fakedevicemanager.h"
     32 #include "talk/p2p/base/fakesession.h"
     33 #include "talk/session/media/channelmanager.h"
     34 #include "webrtc/base/gunit.h"
     35 #include "webrtc/base/logging.h"
     36 #include "webrtc/base/thread.h"
     37 
     38 namespace cricket {
     39 
     40 static const AudioCodec kAudioCodecs[] = {
     41   AudioCodec(97, "voice", 1, 2, 3, 0),
     42   AudioCodec(110, "CELT", 32000, 48000, 2, 0),
     43   AudioCodec(111, "OPUS", 48000, 32000, 2, 0),
     44 };
     45 
     46 static const VideoCodec kVideoCodecs[] = {
     47   VideoCodec(99, "H264", 100, 200, 300, 0),
     48   VideoCodec(100, "VP8", 100, 200, 300, 0),
     49   VideoCodec(96, "rtx", 100, 200, 300, 0),
     50 };
     51 
     52 class ChannelManagerTest : public testing::Test {
     53  protected:
     54   ChannelManagerTest() : fme_(NULL), fdm_(NULL), fcm_(NULL), cm_(NULL) {
     55   }
     56 
     57   virtual void SetUp() {
     58     fme_ = new cricket::FakeMediaEngine();
     59     fme_->SetAudioCodecs(MAKE_VECTOR(kAudioCodecs));
     60     fme_->SetVideoCodecs(MAKE_VECTOR(kVideoCodecs));
     61     fdme_ = new cricket::FakeDataEngine();
     62     fdm_ = new cricket::FakeDeviceManager();
     63     fcm_ = new cricket::FakeCaptureManager();
     64     cm_ = new cricket::ChannelManager(
     65         fme_, fdme_, fdm_, fcm_, rtc::Thread::Current());
     66     session_ = new cricket::FakeSession(true);
     67 
     68     std::vector<std::string> in_device_list, out_device_list, vid_device_list;
     69     in_device_list.push_back("audio-in1");
     70     in_device_list.push_back("audio-in2");
     71     out_device_list.push_back("audio-out1");
     72     out_device_list.push_back("audio-out2");
     73     vid_device_list.push_back("video-in1");
     74     vid_device_list.push_back("video-in2");
     75     fdm_->SetAudioInputDevices(in_device_list);
     76     fdm_->SetAudioOutputDevices(out_device_list);
     77     fdm_->SetVideoCaptureDevices(vid_device_list);
     78   }
     79 
     80   virtual void TearDown() {
     81     delete session_;
     82     delete cm_;
     83     cm_ = NULL;
     84     fdm_ = NULL;
     85     fcm_ = NULL;
     86     fdme_ = NULL;
     87     fme_ = NULL;
     88   }
     89 
     90   rtc::Thread worker_;
     91   cricket::FakeMediaEngine* fme_;
     92   cricket::FakeDataEngine* fdme_;
     93   cricket::FakeDeviceManager* fdm_;
     94   cricket::FakeCaptureManager* fcm_;
     95   cricket::ChannelManager* cm_;
     96   cricket::FakeSession* session_;
     97 };
     98 
     99 // Test that we startup/shutdown properly.
    100 TEST_F(ChannelManagerTest, StartupShutdown) {
    101   EXPECT_FALSE(cm_->initialized());
    102   EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
    103   EXPECT_TRUE(cm_->Init());
    104   EXPECT_TRUE(cm_->initialized());
    105   cm_->Terminate();
    106   EXPECT_FALSE(cm_->initialized());
    107 }
    108 
    109 // Test that we startup/shutdown properly with a worker thread.
    110 TEST_F(ChannelManagerTest, StartupShutdownOnThread) {
    111   worker_.Start();
    112   EXPECT_FALSE(cm_->initialized());
    113   EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
    114   EXPECT_TRUE(cm_->set_worker_thread(&worker_));
    115   EXPECT_EQ(&worker_, cm_->worker_thread());
    116   EXPECT_TRUE(cm_->Init());
    117   EXPECT_TRUE(cm_->initialized());
    118   // Setting the worker thread while initialized should fail.
    119   EXPECT_FALSE(cm_->set_worker_thread(rtc::Thread::Current()));
    120   cm_->Terminate();
    121   EXPECT_FALSE(cm_->initialized());
    122 }
    123 
    124 // Test that we can create and destroy a voice and video channel.
    125 TEST_F(ChannelManagerTest, CreateDestroyChannels) {
    126   EXPECT_TRUE(cm_->Init());
    127   cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
    128       session_, cricket::CN_AUDIO, false);
    129   EXPECT_TRUE(voice_channel != NULL);
    130   cricket::VideoChannel* video_channel =
    131       cm_->CreateVideoChannel(session_, cricket::CN_VIDEO,
    132                               false, voice_channel);
    133   EXPECT_TRUE(video_channel != NULL);
    134   cricket::DataChannel* data_channel =
    135       cm_->CreateDataChannel(session_, cricket::CN_DATA,
    136                              false, cricket::DCT_RTP);
    137   EXPECT_TRUE(data_channel != NULL);
    138   cm_->DestroyVideoChannel(video_channel);
    139   cm_->DestroyVoiceChannel(voice_channel);
    140   cm_->DestroyDataChannel(data_channel);
    141   cm_->Terminate();
    142 }
    143 
    144 // Test that we can create and destroy a voice and video channel with a worker.
    145 TEST_F(ChannelManagerTest, CreateDestroyChannelsOnThread) {
    146   worker_.Start();
    147   EXPECT_TRUE(cm_->set_worker_thread(&worker_));
    148   EXPECT_TRUE(cm_->Init());
    149   delete session_;
    150   session_ = new cricket::FakeSession(&worker_, true);
    151   cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
    152       session_, cricket::CN_AUDIO, false);
    153   EXPECT_TRUE(voice_channel != NULL);
    154   cricket::VideoChannel* video_channel =
    155       cm_->CreateVideoChannel(session_, cricket::CN_VIDEO,
    156                               false, voice_channel);
    157   EXPECT_TRUE(video_channel != NULL);
    158   cricket::DataChannel* data_channel =
    159       cm_->CreateDataChannel(session_, cricket::CN_DATA,
    160                              false, cricket::DCT_RTP);
    161   EXPECT_TRUE(data_channel != NULL);
    162   cm_->DestroyVideoChannel(video_channel);
    163   cm_->DestroyVoiceChannel(voice_channel);
    164   cm_->DestroyDataChannel(data_channel);
    165   cm_->Terminate();
    166 }
    167 
    168 // Test that we fail to create a voice/video channel if the session is unable
    169 // to create a cricket::TransportChannel
    170 TEST_F(ChannelManagerTest, NoTransportChannelTest) {
    171   EXPECT_TRUE(cm_->Init());
    172   session_->set_fail_channel_creation(true);
    173   // The test is useless unless the session does not fail creating
    174   // cricket::TransportChannel.
    175   ASSERT_TRUE(session_->CreateChannel(
    176       "audio", "rtp", cricket::ICE_CANDIDATE_COMPONENT_RTP) == NULL);
    177 
    178   cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
    179       session_, cricket::CN_AUDIO, false);
    180   EXPECT_TRUE(voice_channel == NULL);
    181   cricket::VideoChannel* video_channel =
    182       cm_->CreateVideoChannel(session_, cricket::CN_VIDEO,
    183                               false, voice_channel);
    184   EXPECT_TRUE(video_channel == NULL);
    185   cricket::DataChannel* data_channel =
    186       cm_->CreateDataChannel(session_, cricket::CN_DATA,
    187                              false, cricket::DCT_RTP);
    188   EXPECT_TRUE(data_channel == NULL);
    189   cm_->Terminate();
    190 }
    191 
    192 // Test that SetDefaultVideoCodec passes through the right values.
    193 TEST_F(ChannelManagerTest, SetDefaultVideoEncoderConfig) {
    194   cricket::VideoCodec codec(96, "G264", 1280, 720, 60, 0);
    195   cricket::VideoEncoderConfig config(codec, 1, 2);
    196   EXPECT_TRUE(cm_->Init());
    197   EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
    198   EXPECT_EQ(config, fme_->default_video_encoder_config());
    199 }
    200 
    201 struct GetCapturerFrameSize : public sigslot::has_slots<> {
    202   void OnVideoFrame(VideoCapturer* capturer, const VideoFrame* frame) {
    203     width = frame->GetWidth();
    204     height = frame->GetHeight();
    205   }
    206   GetCapturerFrameSize(VideoCapturer* capturer) : width(0), height(0) {
    207     capturer->SignalVideoFrame.connect(this,
    208                                        &GetCapturerFrameSize::OnVideoFrame);
    209     static_cast<FakeVideoCapturer*>(capturer)->CaptureFrame();
    210   }
    211   size_t width;
    212   size_t height;
    213 };
    214 
    215 TEST_F(ChannelManagerTest, DefaultCapturerAspectRatio) {
    216   VideoCodec codec(100, "VP8", 640, 360, 30, 0);
    217   VideoFormat format(640, 360, 33, FOURCC_ANY);
    218   VideoEncoderConfig config(codec, 1, 2);
    219   EXPECT_TRUE(cm_->Init());
    220   // A capturer created before the default encoder config is set will have no
    221   // set aspect ratio, so it'll be 4:3 (based on the fake video capture impl).
    222   VideoCapturer* capturer = cm_->CreateVideoCapturer();
    223   ASSERT_TRUE(capturer != NULL);
    224   EXPECT_EQ(CS_RUNNING, capturer->Start(format));
    225   GetCapturerFrameSize size(capturer);
    226   EXPECT_EQ(640u, size.width);
    227   EXPECT_EQ(480u, size.height);
    228   delete capturer;
    229   // Try again, but with the encoder config set to 16:9.
    230   EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
    231   capturer = cm_->CreateVideoCapturer();
    232   ASSERT_TRUE(capturer != NULL);
    233   EXPECT_EQ(CS_RUNNING, capturer->Start(format));
    234   GetCapturerFrameSize cropped_size(capturer);
    235   EXPECT_EQ(640u, cropped_size.width);
    236   EXPECT_EQ(360u, cropped_size.height);
    237   delete capturer;
    238 }
    239 
    240 // Test that SetDefaultVideoCodec passes through the right values.
    241 TEST_F(ChannelManagerTest, SetDefaultVideoCodecBeforeInit) {
    242   cricket::VideoCodec codec(96, "G264", 1280, 720, 60, 0);
    243   cricket::VideoEncoderConfig config(codec, 1, 2);
    244   EXPECT_TRUE(cm_->SetDefaultVideoEncoderConfig(config));
    245   EXPECT_TRUE(cm_->Init());
    246   EXPECT_EQ(config, fme_->default_video_encoder_config());
    247 }
    248 
    249 TEST_F(ChannelManagerTest, SetAudioOptionsBeforeInit) {
    250   // Test that values that we set before Init are applied.
    251   AudioOptions options;
    252   options.auto_gain_control.Set(true);
    253   options.echo_cancellation.Set(false);
    254   EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
    255   std::string audio_in, audio_out;
    256   AudioOptions set_options;
    257   // Check options before Init.
    258   EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, &set_options));
    259   EXPECT_EQ("audio-in1", audio_in);
    260   EXPECT_EQ("audio-out1", audio_out);
    261   EXPECT_EQ(options, set_options);
    262   EXPECT_TRUE(cm_->Init());
    263   // Check options after Init.
    264   EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, &set_options));
    265   EXPECT_EQ("audio-in1", audio_in);
    266   EXPECT_EQ("audio-out1", audio_out);
    267   EXPECT_EQ(options, set_options);
    268   // At this point, the media engine should also be initialized.
    269   EXPECT_EQ(options, fme_->audio_options());
    270   EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
    271             fme_->audio_delay_offset());
    272 }
    273 
    274 TEST_F(ChannelManagerTest, GetAudioOptionsWithNullParameters) {
    275   std::string audio_in, audio_out;
    276   AudioOptions options;
    277   options.echo_cancellation.Set(true);
    278   EXPECT_TRUE(cm_->SetAudioOptions("audio-in2", "audio-out2", options));
    279   EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, NULL, NULL));
    280   EXPECT_EQ("audio-in2", audio_in);
    281   EXPECT_TRUE(cm_->GetAudioOptions(NULL, &audio_out, NULL));
    282   EXPECT_EQ("audio-out2", audio_out);
    283   AudioOptions out_options;
    284   EXPECT_TRUE(cm_->GetAudioOptions(NULL, NULL, &out_options));
    285   bool echo_cancellation = false;
    286   EXPECT_TRUE(out_options.echo_cancellation.Get(&echo_cancellation));
    287   EXPECT_TRUE(echo_cancellation);
    288 }
    289 
    290 TEST_F(ChannelManagerTest, SetAudioOptions) {
    291   // Test initial state.
    292   EXPECT_TRUE(cm_->Init());
    293   EXPECT_EQ(std::string(cricket::DeviceManagerInterface::kDefaultDeviceName),
    294             fme_->audio_in_device());
    295   EXPECT_EQ(std::string(cricket::DeviceManagerInterface::kDefaultDeviceName),
    296             fme_->audio_out_device());
    297   EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
    298             fme_->audio_delay_offset());
    299   // Test setting specific values.
    300   AudioOptions options;
    301   options.auto_gain_control.Set(true);
    302   EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
    303   EXPECT_EQ("audio-in1", fme_->audio_in_device());
    304   EXPECT_EQ("audio-out1", fme_->audio_out_device());
    305   bool auto_gain_control = false;
    306   EXPECT_TRUE(
    307       fme_->audio_options().auto_gain_control.Get(&auto_gain_control));
    308   EXPECT_TRUE(auto_gain_control);
    309   EXPECT_EQ(cricket::kDefaultAudioDelayOffset,
    310             fme_->audio_delay_offset());
    311   // Test setting bad values.
    312   EXPECT_FALSE(cm_->SetAudioOptions("audio-in9", "audio-out2", options));
    313 }
    314 
    315 TEST_F(ChannelManagerTest, SetEngineAudioOptions) {
    316   EXPECT_TRUE(cm_->Init());
    317   // Test setting specific values.
    318   AudioOptions options;
    319   options.experimental_ns.Set(true);
    320   EXPECT_TRUE(cm_->SetEngineAudioOptions(options));
    321   bool experimental_ns = false;
    322   EXPECT_TRUE(fme_->audio_options().experimental_ns.Get(&experimental_ns));
    323   EXPECT_TRUE(experimental_ns);
    324 }
    325 
    326 TEST_F(ChannelManagerTest, SetEngineAudioOptionsBeforeInitFails) {
    327   // Test that values that we set before Init are not applied.
    328   AudioOptions options;
    329   options.experimental_ns.Set(true);
    330   EXPECT_FALSE(cm_->SetEngineAudioOptions(options));
    331   EXPECT_FALSE(fme_->audio_options().experimental_ns.IsSet());
    332 }
    333 
    334 TEST_F(ChannelManagerTest, SetCaptureDeviceBeforeInit) {
    335   // Test that values that we set before Init are applied.
    336   EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
    337   EXPECT_TRUE(cm_->Init());
    338   EXPECT_EQ("video-in2", cm_->video_device_name());
    339 }
    340 
    341 TEST_F(ChannelManagerTest, GetCaptureDeviceBeforeInit) {
    342   std::string video_in;
    343   // Test that GetCaptureDevice works before Init.
    344   EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
    345   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    346   EXPECT_EQ("video-in1", video_in);
    347   // Test that options set before Init can be gotten after Init.
    348   EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
    349   EXPECT_TRUE(cm_->Init());
    350   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    351   EXPECT_EQ("video-in2", video_in);
    352 }
    353 
    354 TEST_F(ChannelManagerTest, SetCaptureDevice) {
    355   // Test setting defaults.
    356   EXPECT_TRUE(cm_->Init());
    357   EXPECT_TRUE(cm_->SetCaptureDevice(""));  // will use DeviceManager default
    358   EXPECT_EQ("video-in1", cm_->video_device_name());
    359   // Test setting specific values.
    360   EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
    361   EXPECT_EQ("video-in2", cm_->video_device_name());
    362   // TODO(juberti): Add test for invalid value here.
    363 }
    364 
    365 // Test unplugging and plugging back the preferred devices. When the preferred
    366 // device is unplugged, we fall back to the default device. When the preferred
    367 // device is plugged back, we use it.
    368 TEST_F(ChannelManagerTest, SetAudioOptionsUnplugPlug) {
    369   // Set preferences "audio-in1" and "audio-out1" before init.
    370   AudioOptions options;
    371   EXPECT_TRUE(cm_->SetAudioOptions("audio-in1", "audio-out1", options));
    372   // Unplug device "audio-in1" and "audio-out1".
    373   std::vector<std::string> in_device_list, out_device_list;
    374   in_device_list.push_back("audio-in2");
    375   out_device_list.push_back("audio-out2");
    376   fdm_->SetAudioInputDevices(in_device_list);
    377   fdm_->SetAudioOutputDevices(out_device_list);
    378   // Init should fall back to default devices.
    379   EXPECT_TRUE(cm_->Init());
    380   // The media engine should use the default.
    381   EXPECT_EQ("", fme_->audio_in_device());
    382   EXPECT_EQ("", fme_->audio_out_device());
    383   // The channel manager keeps the preferences "audio-in1" and "audio-out1".
    384   std::string audio_in, audio_out;
    385   EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, NULL));
    386   EXPECT_EQ("audio-in1", audio_in);
    387   EXPECT_EQ("audio-out1", audio_out);
    388   cm_->Terminate();
    389 
    390   // Plug devices "audio-in2" and "audio-out2" back.
    391   in_device_list.push_back("audio-in1");
    392   out_device_list.push_back("audio-out1");
    393   fdm_->SetAudioInputDevices(in_device_list);
    394   fdm_->SetAudioOutputDevices(out_device_list);
    395   // Init again. The preferences, "audio-in2" and "audio-out2", are used.
    396   EXPECT_TRUE(cm_->Init());
    397   EXPECT_EQ("audio-in1", fme_->audio_in_device());
    398   EXPECT_EQ("audio-out1", fme_->audio_out_device());
    399   EXPECT_TRUE(cm_->GetAudioOptions(&audio_in, &audio_out, NULL));
    400   EXPECT_EQ("audio-in1", audio_in);
    401   EXPECT_EQ("audio-out1", audio_out);
    402 }
    403 
    404 // We have one camera. Unplug it, fall back to no camera.
    405 TEST_F(ChannelManagerTest, SetCaptureDeviceUnplugPlugOneCamera) {
    406   // Set preferences "video-in1" before init.
    407   std::vector<std::string> vid_device_list;
    408   vid_device_list.push_back("video-in1");
    409   fdm_->SetVideoCaptureDevices(vid_device_list);
    410   EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
    411 
    412   // Unplug "video-in1".
    413   vid_device_list.clear();
    414   fdm_->SetVideoCaptureDevices(vid_device_list);
    415 
    416   // Init should fall back to avatar.
    417   EXPECT_TRUE(cm_->Init());
    418   // The media engine should use no camera.
    419   EXPECT_EQ("", cm_->video_device_name());
    420   // The channel manager keeps the user preference "video-in".
    421   std::string video_in;
    422   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    423   EXPECT_EQ("video-in1", video_in);
    424   cm_->Terminate();
    425 
    426   // Plug device "video-in1" back.
    427   vid_device_list.push_back("video-in1");
    428   fdm_->SetVideoCaptureDevices(vid_device_list);
    429   // Init again. The user preferred device, "video-in1", is used.
    430   EXPECT_TRUE(cm_->Init());
    431   EXPECT_EQ("video-in1", cm_->video_device_name());
    432   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    433   EXPECT_EQ("video-in1", video_in);
    434 }
    435 
    436 // We have multiple cameras. Unplug the preferred, fall back to another camera.
    437 TEST_F(ChannelManagerTest, SetCaptureDeviceUnplugPlugTwoDevices) {
    438   // Set video device to "video-in1" before init.
    439   EXPECT_TRUE(cm_->SetCaptureDevice("video-in1"));
    440   // Unplug device "video-in1".
    441   std::vector<std::string> vid_device_list;
    442   vid_device_list.push_back("video-in2");
    443   fdm_->SetVideoCaptureDevices(vid_device_list);
    444   // Init should fall back to default device "video-in2".
    445   EXPECT_TRUE(cm_->Init());
    446   // The media engine should use the default device "video-in2".
    447   EXPECT_EQ("video-in2", cm_->video_device_name());
    448   // The channel manager keeps the user preference "video-in".
    449   std::string video_in;
    450   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    451   EXPECT_EQ("video-in1", video_in);
    452   cm_->Terminate();
    453 
    454   // Plug device "video-in1" back.
    455   vid_device_list.push_back("video-in1");
    456   fdm_->SetVideoCaptureDevices(vid_device_list);
    457   // Init again. The user preferred device, "video-in1", is used.
    458   EXPECT_TRUE(cm_->Init());
    459   EXPECT_EQ("video-in1", cm_->video_device_name());
    460   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    461   EXPECT_EQ("video-in1", video_in);
    462 }
    463 
    464 TEST_F(ChannelManagerTest, GetCaptureDevice) {
    465   std::string video_in;
    466   // Test setting/getting defaults.
    467   EXPECT_TRUE(cm_->Init());
    468   EXPECT_TRUE(cm_->SetCaptureDevice(""));
    469   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    470   EXPECT_EQ("video-in1", video_in);
    471   // Test setting/getting specific values.
    472   EXPECT_TRUE(cm_->SetCaptureDevice("video-in2"));
    473   EXPECT_TRUE(cm_->GetCaptureDevice(&video_in));
    474   EXPECT_EQ("video-in2", video_in);
    475 }
    476 
    477 TEST_F(ChannelManagerTest, GetSetOutputVolumeBeforeInit) {
    478   int level;
    479   // Before init, SetOutputVolume() remembers the volume but does not change the
    480   // volume of the engine. GetOutputVolume() should fail.
    481   EXPECT_EQ(-1, fme_->output_volume());
    482   EXPECT_FALSE(cm_->GetOutputVolume(&level));
    483   EXPECT_FALSE(cm_->SetOutputVolume(-1));  // Invalid volume.
    484   EXPECT_TRUE(cm_->SetOutputVolume(99));
    485   EXPECT_EQ(-1, fme_->output_volume());
    486 
    487   // Init() will apply the remembered volume.
    488   EXPECT_TRUE(cm_->Init());
    489   EXPECT_TRUE(cm_->GetOutputVolume(&level));
    490   EXPECT_EQ(99, level);
    491   EXPECT_EQ(level, fme_->output_volume());
    492 
    493   EXPECT_TRUE(cm_->SetOutputVolume(60));
    494   EXPECT_TRUE(cm_->GetOutputVolume(&level));
    495   EXPECT_EQ(60, level);
    496   EXPECT_EQ(level, fme_->output_volume());
    497 }
    498 
    499 TEST_F(ChannelManagerTest, GetSetOutputVolume) {
    500   int level;
    501   EXPECT_TRUE(cm_->Init());
    502   EXPECT_TRUE(cm_->GetOutputVolume(&level));
    503   EXPECT_EQ(level, fme_->output_volume());
    504 
    505   EXPECT_FALSE(cm_->SetOutputVolume(-1));  // Invalid volume.
    506   EXPECT_TRUE(cm_->SetOutputVolume(60));
    507   EXPECT_EQ(60, fme_->output_volume());
    508   EXPECT_TRUE(cm_->GetOutputVolume(&level));
    509   EXPECT_EQ(60, level);
    510 }
    511 
    512 // Test that logging options set before Init are applied properly,
    513 // and retained even after Init.
    514 TEST_F(ChannelManagerTest, SetLoggingBeforeInit) {
    515   cm_->SetVoiceLogging(rtc::LS_INFO, "test-voice");
    516   cm_->SetVideoLogging(rtc::LS_VERBOSE, "test-video");
    517   EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
    518   EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
    519   EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
    520   EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
    521   EXPECT_TRUE(cm_->Init());
    522   EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
    523   EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
    524   EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
    525   EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
    526 }
    527 
    528 // Test that logging options set after Init are applied properly.
    529 TEST_F(ChannelManagerTest, SetLogging) {
    530   EXPECT_TRUE(cm_->Init());
    531   cm_->SetVoiceLogging(rtc::LS_INFO, "test-voice");
    532   cm_->SetVideoLogging(rtc::LS_VERBOSE, "test-video");
    533   EXPECT_EQ(rtc::LS_INFO, fme_->voice_loglevel());
    534   EXPECT_STREQ("test-voice", fme_->voice_logfilter().c_str());
    535   EXPECT_EQ(rtc::LS_VERBOSE, fme_->video_loglevel());
    536   EXPECT_STREQ("test-video", fme_->video_logfilter().c_str());
    537 }
    538 
    539 // Test that the Video/Voice Processors register and unregister
    540 TEST_F(ChannelManagerTest, RegisterProcessors) {
    541   cricket::FakeMediaProcessor fmp;
    542   EXPECT_TRUE(cm_->Init());
    543   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    544   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    545 
    546   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    547   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    548 
    549   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    550   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    551 
    552   EXPECT_TRUE(cm_->RegisterVoiceProcessor(1,
    553                                           &fmp,
    554                                           cricket::MPD_RX));
    555   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    556   EXPECT_TRUE(fme_->voice_processor_registered(cricket::MPD_RX));
    557 
    558 
    559   EXPECT_TRUE(cm_->UnregisterVoiceProcessor(1,
    560                                             &fmp,
    561                                             cricket::MPD_RX));
    562   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    563   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    564 
    565   EXPECT_TRUE(cm_->RegisterVoiceProcessor(1,
    566                                           &fmp,
    567                                           cricket::MPD_TX));
    568   EXPECT_TRUE(fme_->voice_processor_registered(cricket::MPD_TX));
    569   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    570 
    571   EXPECT_TRUE(cm_->UnregisterVoiceProcessor(1,
    572                                             &fmp,
    573                                             cricket::MPD_TX));
    574   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_TX));
    575   EXPECT_FALSE(fme_->voice_processor_registered(cricket::MPD_RX));
    576 }
    577 
    578 TEST_F(ChannelManagerTest, SetVideoRtxEnabled) {
    579   std::vector<VideoCodec> codecs;
    580   const VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
    581 
    582   // By default RTX is disabled.
    583   cm_->GetSupportedVideoCodecs(&codecs);
    584   EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
    585 
    586   // Enable and check.
    587   EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
    588   cm_->GetSupportedVideoCodecs(&codecs);
    589   EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
    590 
    591   // Disable and check.
    592   EXPECT_TRUE(cm_->SetVideoRtxEnabled(false));
    593   cm_->GetSupportedVideoCodecs(&codecs);
    594   EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
    595 
    596   // Cannot toggle rtx after initialization.
    597   EXPECT_TRUE(cm_->Init());
    598   EXPECT_FALSE(cm_->SetVideoRtxEnabled(true));
    599   EXPECT_FALSE(cm_->SetVideoRtxEnabled(false));
    600 
    601   // Can set again after terminate.
    602   cm_->Terminate();
    603   EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
    604   cm_->GetSupportedVideoCodecs(&codecs);
    605   EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
    606 }
    607 
    608 }  // namespace cricket
    609