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 |