| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/capture/video/fuchsia/video_capture_device_factory_fuchsia.h" |
| |
| #include "base/fuchsia/test_component_context_for_process.h" |
| #include "base/run_loop.h" |
| #include "base/test/bind.h" |
| #include "base/test/task_environment.h" |
| #include "media/fuchsia/camera/fake_fuchsia_camera.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace media { |
| |
| class VideoCaptureDeviceFactoryFuchsiaTest : public testing::Test { |
| protected: |
| std::vector<VideoCaptureDeviceInfo> GetDevicesInfo() { |
| std::vector<VideoCaptureDeviceInfo> devices_info; |
| base::RunLoop run_loop; |
| device_factory_.GetDevicesInfo(base::BindLambdaForTesting( |
| [&devices_info, &run_loop](std::vector<VideoCaptureDeviceInfo> result) { |
| devices_info = std::move(result); |
| run_loop.Quit(); |
| })); |
| run_loop.Run(); |
| return devices_info; |
| } |
| |
| base::test::SingleThreadTaskEnvironment task_environment_{ |
| base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; |
| base::TestComponentContextForProcess test_context_; |
| |
| FakeCameraDeviceWatcher fake_device_watcher_{ |
| test_context_.additional_services()}; |
| |
| VideoCaptureDeviceFactoryFuchsia device_factory_; |
| }; |
| |
| TEST_F(VideoCaptureDeviceFactoryFuchsiaTest, EnumerateDevices) { |
| auto devices_info = GetDevicesInfo(); |
| |
| EXPECT_EQ(devices_info.size(), 1U); |
| } |
| |
| TEST_F(VideoCaptureDeviceFactoryFuchsiaTest, EnumerateDevicesAfterDisconnect) { |
| auto devices_info = GetDevicesInfo(); |
| EXPECT_EQ(devices_info.size(), 1U); |
| devices_info.clear(); |
| |
| // Disconnect DeviceWatcher and run the run loop so |device_factory_| can |
| // handle the disconnect. |
| fake_device_watcher_.DisconnectClients(); |
| base::RunLoop().RunUntilIdle(); |
| |
| // Try enumerating devices again. DeviceWatcher is expected to be reconnected. |
| devices_info = GetDevicesInfo(); |
| |
| EXPECT_EQ(devices_info.size(), 1U); |
| } |
| |
| // Verify that device removal is handled correctly if device info requests are |
| // still pending. See crbug.com/1185899 . |
| TEST_F(VideoCaptureDeviceFactoryFuchsiaTest, RemoveWhileEnumerating) { |
| std::vector<VideoCaptureDeviceInfo> devices_info; |
| |
| // Set handler for the default device's GetIdentifier() which stops the |
| // RunLoop but doesn't respond to GetIdentifier(). |
| base::RunLoop get_identifier_run_loop; |
| fake_device_watcher_.devices().begin()->second->SetGetIdentifierHandler( |
| base::BindLambdaForTesting( |
| [&get_identifier_run_loop]( |
| fuchsia::camera3::Device::GetIdentifierCallback callback) { |
| get_identifier_run_loop.Quit(); |
| })); |
| |
| base::RunLoop get_devices_run_loop; |
| device_factory_.GetDevicesInfo(base::BindLambdaForTesting( |
| [&get_devices_run_loop, |
| &devices_info](std::vector<VideoCaptureDeviceInfo> result) { |
| devices_info = std::move(result); |
| get_devices_run_loop.Quit(); |
| })); |
| |
| get_identifier_run_loop.Run(); |
| |
| // Remove the first device. This will unblock GetDevicesInfo() (blocked on |
| // GetIdentifier() for the device being removed). The result is not dropped |
| // immediately to ensure that the Device connection is not dropped. |
| auto stream_and_device = fake_device_watcher_.RemoveDevice( |
| fake_device_watcher_.devices().begin()->first); |
| |
| get_devices_run_loop.Run(); |
| EXPECT_TRUE(devices_info.empty()); |
| } |
| |
| } // namespace media |