| Index: content/browser/renderer_host/media/media_devices_manager_unittest.cc
|
| diff --git a/content/browser/renderer_host/media/media_devices_manager_unittest.cc b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
|
| index 23c3701bc02db1083299c7ab2864483111b60e55..cdbac6481a7c736508aef10fa09428902b7fd0a1 100644
|
| --- a/content/browser/renderer_host/media/media_devices_manager_unittest.cc
|
| +++ b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
|
| @@ -114,6 +114,12 @@ class MockVideoCaptureDeviceFactory
|
| }
|
| };
|
|
|
| +class MockMediaDeviceChangeSubscriber : public MediaDeviceChangeSubscriber {
|
| + public:
|
| + MOCK_METHOD2(OnDevicesChanged,
|
| + void(MediaDeviceType, const MediaDeviceInfoArray&));
|
| +};
|
| +
|
| } // namespace
|
|
|
| class MediaDevicesManagerTest : public ::testing::Test {
|
| @@ -438,4 +444,123 @@ TEST_F(MediaDevicesManagerTest, EnumerateCacheAllWithDeviceChanges) {
|
| }
|
| }
|
|
|
| +TEST_F(MediaDevicesManagerTest, SubscribeDeviceChanges) {
|
| + EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(3);
|
| + EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors())
|
| + .Times(3);
|
| + EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(3);
|
| +
|
| + size_t num_audio_input_devices = 5;
|
| + size_t num_video_input_devices = 4;
|
| + size_t num_audio_output_devices = 3;
|
| + audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
|
| + video_capture_device_factory_->set_number_of_devices(num_video_input_devices);
|
| + audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices);
|
| +
|
| + // Run an enumeration to make sure |media_devices_manager_| has the new
|
| + // configuration.
|
| + EXPECT_CALL(*this, MockCallback(_));
|
| + MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
|
| + devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = true;
|
| + devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true;
|
| + devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
|
| + base::RunLoop run_loop;
|
| + media_devices_manager_->EnumerateDevices(
|
| + devices_to_enumerate,
|
| + base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
|
| + base::Unretained(this), &run_loop));
|
| + run_loop.Run();
|
| +
|
| + // Add device-change event subscribers.
|
| + MockMediaDeviceChangeSubscriber subscriber_audio_input;
|
| + MockMediaDeviceChangeSubscriber subscriber_video_input;
|
| + MockMediaDeviceChangeSubscriber subscriber_audio_output;
|
| + MockMediaDeviceChangeSubscriber subscriber_all;
|
| +
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_INPUT, &subscriber_audio_input);
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_VIDEO_INPUT, &subscriber_video_input);
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, &subscriber_audio_output);
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_INPUT, &subscriber_all);
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_VIDEO_INPUT, &subscriber_all);
|
| + media_devices_manager_->SubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, &subscriber_all);
|
| +
|
| + MediaDeviceInfoArray notification_audio_input;
|
| + MediaDeviceInfoArray notification_video_input;
|
| + MediaDeviceInfoArray notification_audio_output;
|
| + MediaDeviceInfoArray notification_all_audio_input;
|
| + MediaDeviceInfoArray notification_all_video_input;
|
| + MediaDeviceInfoArray notification_all_audio_output;
|
| + EXPECT_CALL(subscriber_audio_input,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_AUDIO_INPUT, _))
|
| + .Times(1)
|
| + .WillOnce(SaveArg<1>(¬ification_audio_input));
|
| + EXPECT_CALL(subscriber_video_input,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_VIDEO_INPUT, _))
|
| + .Times(1)
|
| + .WillOnce(SaveArg<1>(¬ification_video_input));
|
| + EXPECT_CALL(subscriber_audio_output,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, _))
|
| + .Times(1)
|
| + .WillOnce(SaveArg<1>(¬ification_audio_output));
|
| + EXPECT_CALL(subscriber_all,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_AUDIO_INPUT, _))
|
| + .Times(2)
|
| + .WillRepeatedly(SaveArg<1>(¬ification_all_audio_input));
|
| + EXPECT_CALL(subscriber_all,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_VIDEO_INPUT, _))
|
| + .Times(2)
|
| + .WillRepeatedly(SaveArg<1>(¬ification_all_video_input));
|
| + EXPECT_CALL(subscriber_all,
|
| + OnDevicesChanged(MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, _))
|
| + .Times(2)
|
| + .WillRepeatedly(SaveArg<1>(¬ification_all_audio_output));
|
| +
|
| + // Simulate device changes.
|
| + num_audio_input_devices = 3;
|
| + num_video_input_devices = 2;
|
| + num_audio_output_devices = 4;
|
| + audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
|
| + video_capture_device_factory_->set_number_of_devices(num_video_input_devices);
|
| + audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices);
|
| + media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO);
|
| + media_devices_manager_->OnDevicesChanged(
|
| + base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(num_audio_input_devices, notification_audio_input.size());
|
| + EXPECT_EQ(num_video_input_devices, notification_video_input.size());
|
| + EXPECT_EQ(num_audio_output_devices, notification_audio_output.size());
|
| + EXPECT_EQ(num_audio_input_devices, notification_all_audio_input.size());
|
| + EXPECT_EQ(num_video_input_devices, notification_all_video_input.size());
|
| + EXPECT_EQ(num_audio_output_devices, notification_all_audio_output.size());
|
| +
|
| + media_devices_manager_->UnsubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_INPUT, &subscriber_audio_input);
|
| + media_devices_manager_->UnsubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_VIDEO_INPUT, &subscriber_video_input);
|
| + media_devices_manager_->UnsubscribeDeviceChangeNotifications(
|
| + MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, &subscriber_audio_output);
|
| +
|
| + // Simulate further device changes. Only the objects still subscribed to the
|
| + // device-change events will receive notifications.
|
| + num_audio_input_devices = 2;
|
| + num_video_input_devices = 1;
|
| + num_audio_output_devices = 3;
|
| + audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
|
| + video_capture_device_factory_->set_number_of_devices(num_video_input_devices);
|
| + audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices);
|
| + media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO);
|
| + media_devices_manager_->OnDevicesChanged(
|
| + base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(num_audio_input_devices, notification_all_audio_input.size());
|
| + EXPECT_EQ(num_video_input_devices, notification_all_video_input.size());
|
| + EXPECT_EQ(num_audio_output_devices, notification_all_audio_output.size());
|
| +}
|
| +
|
| } // namespace content
|
|
|