blob: 95bb18f26be09b2284dc09dda970c8f1bd1291ec [file] [log] [blame]
// Copyright 2021 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/system/ambient_light_sensor_manager_mojo.h"
#include <memory>
#include <utility>
#include <base/bind.h>
#include <base/optional.h>
#include <base/run_loop.h>
#include <gtest/gtest.h>
#include "power_manager/common/fake_prefs.h"
#include "power_manager/powerd/system/ambient_light_sensor_delegate_mojo.h"
#include "power_manager/powerd/system/fake_sensor_device.h"
#include "power_manager/powerd/system/fake_sensor_service.h"
namespace power_manager {
namespace system {
namespace {
constexpr int32_t kFakeAcpiAlsId = 0;
constexpr int32_t kFakeBaseId = 1;
constexpr int32_t kFakeLidId = 2;
} // namespace
class AmbientLightSensorManagerMojoTest : public ::testing::Test {
public:
AmbientLightSensorManagerMojoTest(const AmbientLightSensorManagerMojoTest&) =
delete;
AmbientLightSensorManagerMojoTest& operator=(
const AmbientLightSensorManagerMojoTest&) = delete;
AmbientLightSensorManagerMojoTest() {}
~AmbientLightSensorManagerMojoTest() override {}
protected:
void TearDown() override { manager_.reset(); }
void SetManager() {
manager_ = std::make_unique<AmbientLightSensorManagerMojo>(&prefs_);
if (!manager_->GetSensorForInternalBacklight())
return;
ResetMojoChannel();
}
void ResetMojoChannel() {
sensor_service_.ClearReceivers();
mojo::PendingRemote<cros::mojom::SensorService> pending_remote;
sensor_service_.AddReceiver(
pending_remote.InitWithNewPipeAndPassReceiver());
manager_->SetUpChannel(std::move(pending_remote));
}
void SetSensor(int32_t iio_device_id,
bool is_color_sensor,
base::Optional<std::string> name,
base::Optional<std::string> location) {
auto sensor_device = std::make_unique<FakeSensorDevice>(
is_color_sensor, std::move(name), std::move(location));
sensor_devices_[iio_device_id] = sensor_device.get();
sensor_service_.SetSensorDevice(iio_device_id, std::move(sensor_device));
}
void SetLidSensor(bool is_color_sensor, base::Optional<std::string> name) {
SetSensor(kFakeLidId, is_color_sensor, std::move(name),
cros::mojom::kLocationLid);
}
void SetBaseSensor(base::Optional<std::string> name) {
SetSensor(kFakeBaseId, /*is_color_sensor=*/false, std::move(name),
cros::mojom::kLocationBase);
}
FakePrefs prefs_;
FakeSensorService sensor_service_;
std::map<int32_t, FakeSensorDevice*> sensor_devices_;
std::unique_ptr<AmbientLightSensorManagerMojo> manager_;
};
TEST_F(AmbientLightSensorManagerMojoTest, ZeroSensors) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 0);
prefs_.SetInt64(kAllowAmbientEQ, 0);
SetManager();
EXPECT_FALSE(manager_->GetSensorForInternalBacklight());
EXPECT_FALSE(manager_->GetSensorForKeyboardBacklight());
}
TEST_F(AmbientLightSensorManagerMojoTest, OneColorSensor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 1);
prefs_.SetInt64(kAllowAmbientEQ, 1);
SetLidSensor(/*is_color_sensor=*/true, kCrosECLightName);
SetBaseSensor(/*name=*/base::nullopt);
SetManager();
EXPECT_FALSE(manager_->HasColorSensor());
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_TRUE(internal_backlight_sensor);
EXPECT_EQ(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_FALSE(sensor_devices_[kFakeBaseId]->HasReceivers());
// Simulate a disconnection between |manager_| and IIO Service.
ResetMojoChannel();
// Wait until all reconnection tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_FALSE(sensor_devices_[kFakeBaseId]->HasReceivers());
}
TEST_F(AmbientLightSensorManagerMojoTest, TwoSensorsNoColor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 2);
prefs_.SetInt64(kAllowAmbientEQ, 0);
SetSensor(kFakeAcpiAlsId,
/*is_color_sensor=*/false, kAcpiAlsName,
/*location=*/base::nullopt);
SetLidSensor(/*is_color_sensor=*/false, kCrosECLightName);
SetBaseSensor(kCrosECLightName);
SetManager();
EXPECT_FALSE(manager_->HasColorSensor());
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_NE(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_FALSE(internal_backlight_sensor->IsColorSensor());
EXPECT_FALSE(keyboard_backlight_sensor->IsColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
ResetMojoChannel();
// Wait until all reconnection tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
}
TEST_F(AmbientLightSensorManagerMojoTest, AeqWithNoColorSensor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 2);
prefs_.SetInt64(kAllowAmbientEQ, 1);
SetLidSensor(/*is_color_sensor=*/false, kCrosECLightName);
SetBaseSensor(kCrosECLightName);
SetManager();
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_NE(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
ResetMojoChannel();
// Wait until all reconnection tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
}
TEST_F(AmbientLightSensorManagerMojoTest, AeqWithColorSensor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 2);
prefs_.SetInt64(kAllowAmbientEQ, 1);
SetLidSensor(/*is_color_sensor=*/true, kCrosECLightName);
SetBaseSensor(kCrosECLightName);
SetManager();
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_NE(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(internal_backlight_sensor->IsColorSensor());
EXPECT_FALSE(keyboard_backlight_sensor->IsColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
ResetMojoChannel();
// Wait until all reconnection tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
}
TEST_F(AmbientLightSensorManagerMojoTest, OneLateColorSensor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 1);
prefs_.SetInt64(kAllowAmbientEQ, 1);
SetBaseSensor(/*name=*/base::nullopt);
SetManager();
EXPECT_FALSE(manager_->HasColorSensor());
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_TRUE(internal_backlight_sensor);
EXPECT_EQ(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
SetLidSensor(/*is_color_sensor=*/true, kCrosECLightName);
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
EXPECT_FALSE(sensor_devices_[kFakeBaseId]->HasReceivers());
}
TEST_F(AmbientLightSensorManagerMojoTest, AeqWithLateColorSensor) {
prefs_.SetInt64(kHasAmbientLightSensorPref, 2);
prefs_.SetInt64(kAllowAmbientEQ, 1);
SetBaseSensor(kCrosECLightName);
SetManager();
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
auto internal_backlight_sensor = manager_->GetSensorForInternalBacklight();
auto keyboard_backlight_sensor = manager_->GetSensorForKeyboardBacklight();
EXPECT_NE(internal_backlight_sensor, keyboard_backlight_sensor);
EXPECT_FALSE(manager_->HasColorSensor());
EXPECT_FALSE(keyboard_backlight_sensor->IsColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeBaseId]->HasReceivers());
SetLidSensor(/*is_color_sensor=*/true, kCrosECLightName);
// Wait until all initialization tasks are done.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(manager_->HasColorSensor());
EXPECT_TRUE(internal_backlight_sensor->IsColorSensor());
EXPECT_FALSE(keyboard_backlight_sensor->IsColorSensor());
EXPECT_TRUE(sensor_devices_[kFakeLidId]->HasReceivers());
}
} // namespace system
} // namespace power_manager