blob: 37bde43a1d4929eb0407c220e6649329f8f0ba4e [file] [log] [blame]
// 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