| // Copyright 2018 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 "services/audio/device_notifier.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "base/system/system_monitor.h" |
| #include "base/test/scoped_task_environment.h" |
| #include "services/audio/public/mojom/device_notifications.mojom.h" |
| #include "services/audio/traced_service_ref.h" |
| #include "services/service_manager/public/cpp/service_keepalive.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace audio { |
| |
| namespace { |
| |
| class MockDeviceListener : public mojom::DeviceListener { |
| public: |
| explicit MockDeviceListener(audio::mojom::DeviceListenerRequest request) |
| : binding_(this, std::move(request)) {} |
| MOCK_METHOD0(DevicesChanged, void()); |
| |
| private: |
| mojo::Binding<audio::mojom::DeviceListener> binding_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MockDeviceListener); |
| }; |
| |
| } // namespace |
| |
| class DeviceNotifierTest : public ::testing::Test, |
| public service_manager::ServiceKeepalive::Observer { |
| public: |
| DeviceNotifierTest() |
| : system_monitor_(std::make_unique<base::SystemMonitor>()), |
| service_keepalive_(nullptr, base::TimeDelta()) { |
| service_keepalive_.AddObserver(this); |
| } |
| |
| protected: |
| MOCK_METHOD0(OnNoServiceRefs, void()); |
| |
| void CreateDeviceNotifier() { |
| device_notifier_ = std::make_unique<DeviceNotifier>(); |
| device_notifier_->Bind(mojo::MakeRequest(&device_notifier_ptr_), |
| TracedServiceRef(service_keepalive_.CreateRef(), |
| "audio::DeviceNotifier Binding")); |
| EXPECT_FALSE(service_keepalive_.HasNoRefs()); |
| } |
| |
| void DestroyDeviceNotifier() { |
| device_notifier_ptr_.reset(); |
| scoped_task_environment_.RunUntilIdle(); |
| EXPECT_TRUE(service_keepalive_.HasNoRefs()); |
| } |
| |
| // service_manager::ServiceKeepalive::Observer: |
| void OnIdleTimeout() override { OnNoServiceRefs(); } |
| |
| base::test::ScopedTaskEnvironment scoped_task_environment_; |
| mojom::DeviceNotifierPtr device_notifier_ptr_; |
| |
| private: |
| std::unique_ptr<base::SystemMonitor> system_monitor_; |
| std::unique_ptr<DeviceNotifier> device_notifier_; |
| service_manager::ServiceKeepalive service_keepalive_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DeviceNotifierTest); |
| }; |
| |
| TEST_F(DeviceNotifierTest, DeviceNotifierNotifies) { |
| EXPECT_CALL(*this, OnNoServiceRefs()); |
| CreateDeviceNotifier(); |
| |
| mojom::DeviceListenerPtr device_listener_ptr; |
| MockDeviceListener listener(mojo::MakeRequest(&device_listener_ptr)); |
| |
| // Simulate audio-device event, but no callback should be invoked before the |
| // listener is registered. |
| EXPECT_CALL(listener, DevicesChanged()).Times(0); |
| base::SystemMonitor::Get()->ProcessDevicesChanged( |
| base::SystemMonitor::DEVTYPE_AUDIO); |
| scoped_task_environment_.RunUntilIdle(); |
| |
| // Register the listener and simulate an audio-device event. |
| device_notifier_ptr_->RegisterListener(std::move(device_listener_ptr)); |
| EXPECT_CALL(listener, DevicesChanged()); |
| base::SystemMonitor::Get()->ProcessDevicesChanged( |
| base::SystemMonitor::DEVTYPE_AUDIO); |
| scoped_task_environment_.RunUntilIdle(); |
| |
| // Simulate a video-device event, which should be ignored. |
| EXPECT_CALL(listener, DevicesChanged()).Times(0); |
| base::SystemMonitor::Get()->ProcessDevicesChanged( |
| base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); |
| scoped_task_environment_.RunUntilIdle(); |
| |
| DestroyDeviceNotifier(); |
| } |
| |
| } // namespace audio |