#include "chromeos/dbus/power/fake_power_manager_client.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "chromeos/dbus/power_manager/backlight.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace {
const double kInitialBatteryPercent = 85;
const double kUpdatedBatteryPercent = 70;
const power_manager::PowerSupplyProperties_BatteryState kInitialBatteryState =
power_manager::PowerSupplyProperties_BatteryState_DISCHARGING;
const power_manager::PowerSupplyProperties_ExternalPower kInitialExternalPower =
power_manager::PowerSupplyProperties_ExternalPower_USB;
class TestObserver : public PowerManagerClient::Observer {
public:
TestObserver() : num_power_changed_(0) {}
TestObserver(const TestObserver&) = delete;
TestObserver& operator=(const TestObserver&) = delete;
~TestObserver() override = default;
const power_manager::PowerSupplyProperties& props() const { return props_; }
int num_power_changed() const { return num_power_changed_; }
const power_manager::BatterySaverModeState& battery_saver_state() const {
return battery_saver_state_;
}
const power_manager::AmbientLightSensorChange&
last_ambient_light_sensor_change() const {
return last_ambient_light_sensor_change_;
}
const power_manager::AmbientLightSensorChange&
last_keyboard_ambient_light_sensor_change() const {
return last_keyboard_ambient_light_sensor_change_;
}
void ClearProps() { props_.Clear(); }
void PowerChanged(
const power_manager::PowerSupplyProperties& proto) override {
props_ = proto;
++num_power_changed_;
}
void BatterySaverModeStateChanged(
const power_manager::BatterySaverModeState& proto) override {
battery_saver_state_ = proto;
}
void AmbientLightSensorEnabledChanged(
const power_manager::AmbientLightSensorChange& change) override {
last_ambient_light_sensor_change_ = change;
}
void KeyboardAmbientLightSensorEnabledChanged(
const power_manager::AmbientLightSensorChange& change) override {
last_keyboard_ambient_light_sensor_change_ = change;
}
private:
int num_power_changed_;
power_manager::PowerSupplyProperties props_;
power_manager::BatterySaverModeState battery_saver_state_;
power_manager::AmbientLightSensorChange last_ambient_light_sensor_change_;
power_manager::AmbientLightSensorChange
last_keyboard_ambient_light_sensor_change_;
};
void SetTestProperties(power_manager::PowerSupplyProperties* props) {
props->set_battery_percent(kInitialBatteryPercent);
props->set_is_calculating_battery_time(true);
props->set_battery_state(kInitialBatteryState);
props->set_external_power(kInitialExternalPower);
}
}
TEST(FakePowerManagerClientTest, UpdatePowerPropertiesTest) {
FakePowerManagerClient client;
power_manager::PowerSupplyProperties props;
SetTestProperties(&props);
client.UpdatePowerProperties(props);
EXPECT_EQ(kInitialBatteryPercent, client.GetLastStatus()->battery_percent());
EXPECT_TRUE(client.GetLastStatus()->is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, client.GetLastStatus()->battery_state());
EXPECT_EQ(kInitialExternalPower, client.GetLastStatus()->external_power());
props = *client.GetLastStatus();
props.set_battery_percent(kUpdatedBatteryPercent);
client.UpdatePowerProperties(props);
EXPECT_EQ(kUpdatedBatteryPercent, client.GetLastStatus()->battery_percent());
EXPECT_TRUE(client.GetLastStatus()->is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, client.GetLastStatus()->battery_state());
EXPECT_EQ(kInitialExternalPower, client.GetLastStatus()->external_power());
}
TEST(FakePowerManagerClientTest, NotifyObserversTest) {
FakePowerManagerClient client;
TestObserver test_observer;
client.AddObserver(&test_observer);
EXPECT_TRUE(client.HasObserver(&test_observer));
power_manager::PowerSupplyProperties props;
SetTestProperties(&props);
client.UpdatePowerProperties(props);
EXPECT_EQ(kInitialBatteryPercent, test_observer.props().battery_percent());
EXPECT_TRUE(test_observer.props().is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, test_observer.props().battery_state());
EXPECT_EQ(kInitialExternalPower, test_observer.props().external_power());
EXPECT_EQ(1, test_observer.num_power_changed());
base::test::SingleThreadTaskEnvironment task_environment(
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
test_observer.ClearProps();
client.RequestStatusUpdate();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(kInitialBatteryPercent, test_observer.props().battery_percent());
EXPECT_TRUE(test_observer.props().is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, test_observer.props().battery_state());
EXPECT_EQ(kInitialExternalPower, test_observer.props().external_power());
EXPECT_EQ(2, test_observer.num_power_changed());
props = *client.GetLastStatus();
props.set_battery_percent(kUpdatedBatteryPercent);
props.set_external_power(
power_manager::PowerSupplyProperties_ExternalPower_AC);
client.UpdatePowerProperties(props);
EXPECT_EQ(kUpdatedBatteryPercent, test_observer.props().battery_percent());
EXPECT_TRUE(test_observer.props().is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, test_observer.props().battery_state());
EXPECT_EQ(power_manager::PowerSupplyProperties_ExternalPower_AC,
test_observer.props().external_power());
EXPECT_EQ(3, test_observer.num_power_changed());
client.RemoveObserver(&test_observer);
EXPECT_FALSE(client.HasObserver(&test_observer));
}
TEST(FakePowerManagerClientTest, UpdatePowerPropertiesWithNullTest) {
FakePowerManagerClient client;
power_manager::PowerSupplyProperties props;
SetTestProperties(&props);
client.UpdatePowerProperties(props);
ASSERT_TRUE(client.GetLastStatus().has_value());
EXPECT_EQ(kInitialBatteryPercent, client.GetLastStatus()->battery_percent());
EXPECT_TRUE(client.GetLastStatus()->is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, client.GetLastStatus()->battery_state());
EXPECT_EQ(kInitialExternalPower, client.GetLastStatus()->external_power());
client.UpdatePowerProperties(std::nullopt);
EXPECT_FALSE(client.GetLastStatus().has_value());
}
TEST(FakePowerManagerClientTest,
UpdatePowerPropertiesWithNullWillNotNotifyObserversTest) {
FakePowerManagerClient client;
TestObserver test_observer;
client.AddObserver(&test_observer);
EXPECT_TRUE(client.HasObserver(&test_observer));
power_manager::PowerSupplyProperties props;
SetTestProperties(&props);
client.UpdatePowerProperties(props);
EXPECT_EQ(1, test_observer.num_power_changed());
EXPECT_EQ(kInitialBatteryPercent, test_observer.props().battery_percent());
EXPECT_TRUE(test_observer.props().is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, test_observer.props().battery_state());
EXPECT_EQ(kInitialExternalPower, test_observer.props().external_power());
client.UpdatePowerProperties(std::nullopt);
EXPECT_EQ(1, test_observer.num_power_changed());
EXPECT_EQ(kInitialBatteryPercent, test_observer.props().battery_percent());
EXPECT_TRUE(test_observer.props().is_calculating_battery_time());
EXPECT_EQ(kInitialBatteryState, test_observer.props().battery_state());
EXPECT_EQ(kInitialExternalPower, test_observer.props().external_power());
}
TEST(FakePowerManagerClientTest, BatterySaverState) {
base::test::SingleThreadTaskEnvironment task_environment(
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
FakePowerManagerClient client;
TestObserver test_observer;
client.AddObserver(&test_observer);
EXPECT_FALSE(test_observer.battery_saver_state().has_enabled());
{
power_manager::SetBatterySaverModeStateRequest request;
request.set_enabled(true);
client.SetBatterySaverModeState(request);
EXPECT_FALSE(test_observer.battery_saver_state().has_enabled());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(test_observer.battery_saver_state().has_enabled());
EXPECT_TRUE(test_observer.battery_saver_state().enabled());
}
{
bool called = false;
client.GetBatterySaverModeState(base::BindOnce(
[](std::reference_wrapper<bool> called_ref,
std::optional<power_manager::BatterySaverModeState> state) {
EXPECT_TRUE(state.has_value());
EXPECT_TRUE(state->has_enabled());
EXPECT_TRUE(state->enabled());
called_ref.get() = true;
},
std::ref(called)));
EXPECT_FALSE(called);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
}
{
power_manager::SetBatterySaverModeStateRequest request;
request.set_enabled(false);
client.SetBatterySaverModeState(request);
EXPECT_TRUE(test_observer.battery_saver_state().has_enabled());
EXPECT_TRUE(test_observer.battery_saver_state().enabled());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(test_observer.battery_saver_state().has_enabled());
EXPECT_FALSE(test_observer.battery_saver_state().enabled());
}
{
bool called = false;
client.GetBatterySaverModeState(base::BindOnce(
[](std::reference_wrapper<bool> called_ref,
std::optional<power_manager::BatterySaverModeState> state) {
EXPECT_TRUE(state.has_value());
EXPECT_TRUE(state->has_enabled());
EXPECT_FALSE(state->enabled());
called_ref.get() = true;
},
std::ref(called)));
EXPECT_FALSE(called);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
}
}
TEST(FakePowerManagerClientTest, AmbientLightSensorEnabled) {
base::test::SingleThreadTaskEnvironment task_environment(
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
FakePowerManagerClient client;
TestObserver test_observer;
client.AddObserver(&test_observer);
EXPECT_FALSE(
test_observer.last_ambient_light_sensor_change().has_sensor_enabled());
EXPECT_FALSE(test_observer.last_ambient_light_sensor_change().has_cause());
power_manager::SetAmbientLightSensorEnabledRequest set_als_request;
set_als_request.set_sensor_enabled(false);
client.SetAmbientLightSensorEnabled(set_als_request);
EXPECT_FALSE(
test_observer.last_ambient_light_sensor_change().has_sensor_enabled());
EXPECT_FALSE(test_observer.last_ambient_light_sensor_change().has_cause());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(
test_observer.last_ambient_light_sensor_change().has_sensor_enabled());
EXPECT_FALSE(
test_observer.last_ambient_light_sensor_change().sensor_enabled());
EXPECT_TRUE(test_observer.last_ambient_light_sensor_change().has_cause());
EXPECT_EQ(
test_observer.last_ambient_light_sensor_change().cause(),
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
set_als_request.set_sensor_enabled(true);
client.SetAmbientLightSensorEnabled(set_als_request);
EXPECT_TRUE(
test_observer.last_ambient_light_sensor_change().has_sensor_enabled());
EXPECT_FALSE(
test_observer.last_ambient_light_sensor_change().sensor_enabled());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(
test_observer.last_ambient_light_sensor_change().sensor_enabled());
EXPECT_TRUE(test_observer.last_ambient_light_sensor_change().has_cause());
EXPECT_EQ(
test_observer.last_ambient_light_sensor_change().cause(),
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
}
TEST(FakePowerManagerClientTest, KeyboardAmbientLightSensorEnabled) {
base::test::SingleThreadTaskEnvironment task_environment(
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
FakePowerManagerClient client;
TestObserver test_observer;
client.AddObserver(&test_observer);
EXPECT_FALSE(test_observer.last_keyboard_ambient_light_sensor_change()
.has_sensor_enabled());
EXPECT_FALSE(
test_observer.last_keyboard_ambient_light_sensor_change().has_cause());
power_manager::SetAmbientLightSensorEnabledRequest set_als_request;
set_als_request.set_sensor_enabled(false);
client.SetKeyboardAmbientLightSensorEnabled(set_als_request);
EXPECT_FALSE(test_observer.last_keyboard_ambient_light_sensor_change()
.has_sensor_enabled());
EXPECT_FALSE(
test_observer.last_keyboard_ambient_light_sensor_change().has_cause());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(test_observer.last_keyboard_ambient_light_sensor_change()
.has_sensor_enabled());
EXPECT_FALSE(test_observer.last_keyboard_ambient_light_sensor_change()
.sensor_enabled());
EXPECT_TRUE(
test_observer.last_keyboard_ambient_light_sensor_change().has_cause());
EXPECT_EQ(
test_observer.last_keyboard_ambient_light_sensor_change().cause(),
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
set_als_request.set_sensor_enabled(true);
client.SetKeyboardAmbientLightSensorEnabled(set_als_request);
EXPECT_TRUE(test_observer.last_keyboard_ambient_light_sensor_change()
.has_sensor_enabled());
EXPECT_FALSE(test_observer.last_keyboard_ambient_light_sensor_change()
.sensor_enabled());
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(test_observer.last_keyboard_ambient_light_sensor_change()
.sensor_enabled());
EXPECT_TRUE(
test_observer.last_keyboard_ambient_light_sensor_change().has_cause());
EXPECT_EQ(
test_observer.last_keyboard_ambient_light_sensor_change().cause(),
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
}
TEST(FakePowerManagerClientTest, GetAmbientLightSensorEnabled) {
base::test::SingleThreadTaskEnvironment task_environment(
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
FakePowerManagerClient client;
{
power_manager::SetAmbientLightSensorEnabledRequest set_als_request;
set_als_request.set_sensor_enabled(true);
client.SetAmbientLightSensorEnabled(set_als_request);
bool called = false;
client.GetAmbientLightSensorEnabled(base::BindOnce(
[](std::reference_wrapper<bool> called_ref,
std::optional<bool> is_ambient_light_sensor_enabled) {
EXPECT_TRUE(is_ambient_light_sensor_enabled.value());
called_ref.get() = true;
},
std::ref(called)));
EXPECT_FALSE(called);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
}
{
power_manager::SetAmbientLightSensorEnabledRequest set_als_request;
set_als_request.set_sensor_enabled(false);
client.SetAmbientLightSensorEnabled(set_als_request);
bool called = false;
client.GetAmbientLightSensorEnabled(base::BindOnce(
[](std::reference_wrapper<bool> called_ref,
std::optional<bool> is_ambient_light_sensor_enabled) {
EXPECT_FALSE(is_ambient_light_sensor_enabled.value());
called_ref.get() = true;
},
std::ref(called)));
EXPECT_FALSE(called);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
}
}
}