| // Copyright 2016 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 "ash/system/power/video_activity_notifier.h" |
| |
| #include <memory> |
| |
| #include "ash/test/ash_test_base.h" |
| #include "ash/wm/video_detector.h" |
| #include "base/macros.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/fake_power_manager_client.h" |
| |
| namespace ash { |
| |
| class VideoActivityNotifierTest : public AshTestBase { |
| public: |
| VideoActivityNotifierTest() = default; |
| ~VideoActivityNotifierTest() override = default; |
| |
| void SetUp() override { |
| AshTestBase::SetUp(); |
| power_client_ = static_cast<chromeos::FakePowerManagerClient*>( |
| chromeos::DBusThreadManager::Get()->GetPowerManagerClient()); |
| detector_ = std::make_unique<VideoDetector>(); |
| notifier_.reset(new VideoActivityNotifier(detector_.get())); |
| } |
| |
| void TearDown() override { |
| notifier_.reset(); |
| detector_.reset(); |
| AshTestBase::TearDown(); |
| } |
| |
| protected: |
| chromeos::FakePowerManagerClient* power_client_; // Not owned. |
| |
| std::unique_ptr<VideoDetector> detector_; |
| std::unique_ptr<VideoActivityNotifier> notifier_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VideoActivityNotifierTest); |
| }; |
| |
| // Test that powerd is notified immediately when video changes to a new playing |
| // state or the screen is unlocked. |
| TEST_F(VideoActivityNotifierTest, NotifyImmediatelyOnStateChange) { |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_WINDOWED); |
| EXPECT_FALSE(power_client_->PopVideoActivityReport()); |
| |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_FULLSCREEN); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| |
| notifier_->OnLockStateChanged(true); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| notifier_->OnLockStateChanged(false); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_WINDOWED); |
| EXPECT_FALSE(power_client_->PopVideoActivityReport()); |
| |
| notifier_->OnVideoStateChanged(VideoDetector::State::NOT_PLAYING); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_WINDOWED); |
| EXPECT_FALSE(power_client_->PopVideoActivityReport()); |
| } |
| |
| // Test that powerd is notified periodically while video is ongoing. |
| TEST_F(VideoActivityNotifierTest, NotifyPeriodically) { |
| // The timer shouldn't be running initially. |
| EXPECT_FALSE(notifier_->TriggerTimeoutForTest()); |
| |
| // The timer should start in response to windowed video. |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_WINDOWED); |
| EXPECT_FALSE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| EXPECT_TRUE(notifier_->TriggerTimeoutForTest()); |
| EXPECT_FALSE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| // After fullscreen video starts, the timer should start reporting that |
| // instead. |
| notifier_->OnVideoStateChanged(VideoDetector::State::PLAYING_FULLSCREEN); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| EXPECT_TRUE(notifier_->TriggerTimeoutForTest()); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| // Locking the screen should stop the timer. |
| notifier_->OnLockStateChanged(true); |
| EXPECT_FALSE(notifier_->TriggerTimeoutForTest()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| // Unlocking it should restart the timer. |
| notifier_->OnLockStateChanged(false); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| EXPECT_TRUE(notifier_->TriggerTimeoutForTest()); |
| EXPECT_TRUE(power_client_->PopVideoActivityReport()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| |
| // The timer should stop when video video. |
| notifier_->OnVideoStateChanged(VideoDetector::State::NOT_PLAYING); |
| EXPECT_FALSE(notifier_->TriggerTimeoutForTest()); |
| EXPECT_FALSE(power_client_->have_video_activity_report()); |
| } |
| |
| } // namespace ash |