Commit 9c93c34e authored by Jasmine Chen's avatar Jasmine Chen Committed by Chromium LUCI CQ

VCD: Initialize active client observer

This CL fixes an issue where the scoped_ref base::ObserverListThreadSafe
isn't initialized, causing chrome to crash immediately following
CameraHalDispatcherImpl::AddActiveClientObserver().
It also adds a unittest to make sure the observer works.

Bug: 1155159
Test: Create an observer in camera_hal_delegate.cc and verify that the
observer is registered and receives updates. \
  (DUT) $ capture_unittests --gtest_filter='*Dispatcher*'

Change-Id: I54a8a77a2b48eb328ca2c1f0a2fb3ce057f66b31
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2575297Reviewed-by: default avatarWei Lee <wtlee@chromium.org>
Commit-Queue: Wei Lee <wtlee@chromium.org>
Auto-Submit: Jasmine Chen <lnishan@google.com>
Cr-Commit-Position: refs/heads/master@{#834553}
parent 235fc62b
......@@ -216,7 +216,9 @@ void CameraHalDispatcherImpl::UnregisterPluginVmToken(
CameraHalDispatcherImpl::CameraHalDispatcherImpl()
: proxy_thread_("CameraProxyThread"),
blocking_io_thread_("CameraBlockingIOThread"),
camera_hal_server_callbacks_(this) {
camera_hal_server_callbacks_(this),
active_client_observers_(
new base::ObserverListThreadSafe<CameraActiveClientObserver>()) {
// This event is for adding camera category to categories list.
TRACE_EVENT0("camera", "CameraHalDispatcherImpl");
base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this);
......
......@@ -76,6 +76,16 @@ class MockCameraHalClient : public cros::mojom::CameraHalClient {
DISALLOW_COPY_AND_ASSIGN(MockCameraHalClient);
};
class MockCameraActiveClientObserver : public CameraActiveClientObserver {
public:
void OnActiveClientChange(cros::mojom::CameraClientType type,
bool is_active) override {
DoOnActiveClientChange(type, is_active);
}
MOCK_METHOD2(DoOnActiveClientChange,
void(cros::mojom::CameraClientType, bool));
};
} // namespace
class CameraHalDispatcherImplTest : public ::testing::Test {
......@@ -253,4 +263,32 @@ TEST_F(CameraHalDispatcherImplTest, ClientConnectionError) {
DoLoop();
}
// Test that CameraHalDispatcherImpl correctly fires CameraActiveClientObserver
// when a camera device is opened or closed by a client.
TEST_F(CameraHalDispatcherImplTest, CameraActiveClientObserverTest) {
MockCameraActiveClientObserver observer;
dispatcher_->AddActiveClientObserver(&observer);
EXPECT_CALL(observer, DoOnActiveClientChange(
cros::mojom::CameraClientType::TESTING, true))
.Times(1)
.WillOnce(
InvokeWithoutArgs(this, &CameraHalDispatcherImplTest::QuitRunLoop));
dispatcher_->CameraDeviceActivityChange(
/*camera_id=*/0, /*opened=*/true, cros::mojom::CameraClientType::TESTING);
DoLoop();
EXPECT_CALL(observer, DoOnActiveClientChange(
cros::mojom::CameraClientType::TESTING, false))
.Times(1)
.WillOnce(
InvokeWithoutArgs(this, &CameraHalDispatcherImplTest::QuitRunLoop));
dispatcher_->CameraDeviceActivityChange(
/*camera_id=*/0, /*opened=*/false,
cros::mojom::CameraClientType::TESTING);
DoLoop();
}
} // namespace media
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment