| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/display/display_performance_mode_controller.h" |
| |
| #include "ash/shell.h" |
| #include "ash/test/ash_test_base.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| |
| namespace ash { |
| |
| namespace { |
| power_manager::PowerSupplyProperties BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::ExternalPower charger_state, |
| double battery_percent) { |
| power_manager::PowerSupplyProperties fake_power; |
| fake_power.set_external_power(charger_state); |
| fake_power.set_battery_percent(battery_percent); |
| return fake_power; |
| } |
| } // namespace |
| |
| class DisplayPerformanceModeControllerTest : public AshTestBase { |
| public: |
| DisplayPerformanceModeControllerTest() = default; |
| DisplayPerformanceModeControllerTest( |
| const DisplayPerformanceModeControllerTest&) = delete; |
| DisplayPerformanceModeControllerTest& operator=( |
| const DisplayPerformanceModeControllerTest&) = delete; |
| ~DisplayPerformanceModeControllerTest() override = default; |
| |
| void SetUp() override { |
| AshTestBase::SetUp(); |
| |
| Shell::Get()->display_performance_mode_controller()->AddObserver( |
| &observer_); |
| } |
| |
| void TearDown() override { |
| Shell::Get()->display_performance_mode_controller()->RemoveObserver( |
| &observer_); |
| |
| AshTestBase::TearDown(); |
| } |
| |
| protected: |
| using ModeState = DisplayPerformanceModeController::ModeState; |
| |
| class MockObserver : public DisplayPerformanceModeController::Observer { |
| public: |
| MOCK_METHOD(void, |
| OnDisplayPerformanceModeChanged, |
| (ModeState new_state), |
| (override)); |
| }; |
| |
| MockObserver observer_; |
| }; |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestPowerSaverOnLowBattery) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::DISCONNECTED, 10.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestPowerSaverOnAc) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::AC, 100.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestIntelligentOnAc) { |
| // Should not be called as the default is already intelligent. |
| EXPECT_CALL(observer_, OnDisplayPerformanceModeChanged).Times(0); |
| |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::AC, 15.f)); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, |
| TestResetToIntelligentAfterPowerSaver) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::DISCONNECTED, 15.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kIntelligent)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(false); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestHighPerformance) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, AvoidDuplicateSetting) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)) |
| .Times(1); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, |
| TestHighPerformanceModeBeforeOnPowerSaverBattery) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)) |
| .Times(1); |
| |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::AC, 100.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, |
| TestHighPerformanceModeAfterOnPowerSaverBattery) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::AC, 100.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, |
| TestTurnOffHighPerformanceToIntelligent) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kIntelligent)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(false); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, |
| TestTurnOffHighPerformanceToPowerSaver) { |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties( |
| power_manager::PowerSupplyProperties::DISCONNECTED, 10.f)); |
| PowerStatus::Get()->SetBatterySaverStateForTesting(true); |
| Shell::Get()->display_performance_mode_controller()->OnPowerStatusChanged(); |
| |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kHighPerformance)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| |
| EXPECT_CALL(observer_, |
| OnDisplayPerformanceModeChanged(ModeState::kPowerSaver)); |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(false); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestModeStateOnAddObserver) { |
| // Set Shiny Mode to go into High Performance mode. |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| |
| // Check that adding the controller reports back High Performance mode. |
| Shell::Get()->display_performance_mode_controller()->RemoveObserver( |
| &observer_); |
| ModeState current_state = |
| Shell::Get()->display_performance_mode_controller()->AddObserver( |
| &observer_); |
| EXPECT_EQ(current_state, ModeState::kHighPerformance); |
| } |
| |
| TEST_F(DisplayPerformanceModeControllerTest, TestHighPerformanceReadBack) { |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(true); |
| |
| EXPECT_EQ(Shell::Get() |
| ->display_performance_mode_controller() |
| ->GetCurrentStateForTesting(), |
| ModeState::kHighPerformance); |
| |
| Shell::Get() |
| ->display_performance_mode_controller() |
| ->SetHighPerformanceModeByUser(false); |
| |
| EXPECT_NE(Shell::Get() |
| ->display_performance_mode_controller() |
| ->GetCurrentStateForTesting(), |
| ModeState::kHighPerformance); |
| } |
| |
| } // namespace ash |