blob: 854e9de9e576aa717584d091e4eb559d2d0713b8 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS 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 "power_manager/powerd/policy/ambient_light_handler.h"
#include <stdint.h>
#include <base/compiler_specific.h>
#include <gtest/gtest.h>
#include "power_manager/powerd/system/ambient_light_sensor_stub.h"
namespace power_manager {
namespace policy {
namespace {
// AmbientLightHandler::Delegate implementation that records the latest
// brightness percent that was passed to it.
class TestDelegate : public AmbientLightHandler::Delegate {
public:
TestDelegate()
: percent_(-1.0),
cause_(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT) {}
virtual ~TestDelegate() {}
double percent() const { return percent_; }
AmbientLightHandler::BrightnessChangeCause cause() const { return cause_; }
void SetBrightnessPercentForAmbientLight(
double brightness_percent,
AmbientLightHandler::BrightnessChangeCause cause) override {
percent_ = brightness_percent;
cause_ = cause;
}
private:
double percent_;
AmbientLightHandler::BrightnessChangeCause cause_;
DISALLOW_COPY_AND_ASSIGN(TestDelegate);
};
class AmbientLightHandlerTest : public ::testing::Test {
public:
AmbientLightHandlerTest()
: light_sensor_(0),
handler_(&light_sensor_, &delegate_),
initial_brightness_percent_(0.0) {}
virtual ~AmbientLightHandlerTest() {}
protected:
// Initializes |handler_|.
void Init() {
light_sensor_.set_lux(initial_lux_);
handler_.Init(steps_pref_, initial_brightness_percent_);
}
// Updates the lux level returned by |light_sensor_| and notifies
// |handler_| about the change.
void UpdateSensor(int64_t lux) {
light_sensor_.set_lux(lux);
handler_.OnAmbientLightUpdated(&light_sensor_);
}
system::AmbientLightSensorStub light_sensor_;
TestDelegate delegate_;
AmbientLightHandler handler_;
// Initial value for pref passed to AmbientLightHandler::Init().
std::string steps_pref_;
// Initial light level reported by |light_sensor_|.
int initial_lux_;
// Initial backlight brightness level passed to AmbientLightHandler::Init().
double initial_brightness_percent_;
private:
DISALLOW_COPY_AND_ASSIGN(AmbientLightHandlerTest);
};
} // namespace
TEST_F(AmbientLightHandlerTest, UpdatePercent) {
steps_pref_ = "20.0 -1 40\n50.0 20 80\n100.0 60 -1";
initial_lux_ = 50;
initial_brightness_percent_ = 60.0;
Init();
EXPECT_LT(delegate_.percent(), 0.0);
// The middle step should be used as soon as a light reading is received.
UpdateSensor(50);
EXPECT_DOUBLE_EQ(50.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
// An initial reading in the lower step should be ignored, but a second
// reading should overcome hysteresis.
UpdateSensor(10);
EXPECT_DOUBLE_EQ(50.0, delegate_.percent());
UpdateSensor(10);
EXPECT_DOUBLE_EQ(20.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
// Send two high readings and check that the second one causes a jump to
// the top step.
UpdateSensor(110);
EXPECT_DOUBLE_EQ(20.0, delegate_.percent());
UpdateSensor(90);
EXPECT_DOUBLE_EQ(100.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
}
TEST_F(AmbientLightHandlerTest, PowerSources) {
// Define a single target percent in the bottom step and separate AC and
// battery targets for the middle and top steps.
steps_pref_ = "20.0 -1 40\n50.0 40.0 20 80\n100.0 90.0 60 -1";
initial_lux_ = 0;
initial_brightness_percent_ = 10.0;
Init();
EXPECT_LT(delegate_.percent(), 0.0);
// No changes should be made when switching to battery power at the
// bottom step.
UpdateSensor(0);
EXPECT_DOUBLE_EQ(20.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
handler_.HandlePowerSourceChange(POWER_BATTERY);
EXPECT_DOUBLE_EQ(20.0, delegate_.percent());
// Check that the brightness is updated in response to power source
// changes while at the middle and top steps.
UpdateSensor(50);
UpdateSensor(50);
EXPECT_DOUBLE_EQ(40.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
handler_.HandlePowerSourceChange(POWER_AC);
EXPECT_DOUBLE_EQ(50.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_POWER_SOURCE, delegate_.cause());
UpdateSensor(100);
UpdateSensor(100);
EXPECT_DOUBLE_EQ(100.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
handler_.HandlePowerSourceChange(POWER_BATTERY);
EXPECT_DOUBLE_EQ(90.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_POWER_SOURCE, delegate_.cause());
}
TEST_F(AmbientLightHandlerTest, DeferInitialChange) {
steps_pref_ = "80.0 30.0 -1 400\n100.0 100 -1";
initial_lux_ = 0;
initial_brightness_percent_ = 60.0;
// Power source changes before the ambient light has been measured
// shouldn't trigger changes.
Init();
EXPECT_LT(delegate_.percent(), 0.0);
handler_.HandlePowerSourceChange(POWER_BATTERY);
EXPECT_LT(delegate_.percent(), 0.0);
// After the first ambient light reading, the battery percent from the
// bottom step should be used.
UpdateSensor(0);
EXPECT_DOUBLE_EQ(30.0, delegate_.percent());
EXPECT_EQ(AmbientLightHandler::CAUSED_BY_AMBIENT_LIGHT, delegate_.cause());
}
} // namespace policy
} // namespace power_manager