#include "ash/system/human_presence/lock_on_leave_controller.h"
#include <memory>
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_switches.h"
#include "ash/test/ash_test_base.h"
#include "base/command_line.h"
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/test/scoped_command_line.h"
#include "base/test/scoped_feature_list.h"
#include "chromeos/ash/components/dbus/human_presence/fake_human_presence_dbus_client.h"
#include "chromeos/ash/components/dbus/human_presence/human_presence_dbus_client.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
class LockOnLeaveControllerTest : public AshTestBase {
public:
void SetUp() override {
scoped_feature_list_.InitAndEnableFeature(features::kQuickDim);
base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kHasHps);
HumanPresenceDBusClient::InitializeFake();
human_presence_client_ = FakeHumanPresenceDBusClient::Get();
human_presence_client_->Reset();
AshTestBase::SetUp();
}
protected:
raw_ptr<FakeHumanPresenceDBusClient> human_presence_client_ = nullptr;
private:
base::test::ScopedFeatureList scoped_feature_list_;
base::test::ScopedCommandLine scoped_command_line_;
};
TEST_F(LockOnLeaveControllerTest,
EnableLockOnLeaveDoesNothingIfServiceUnavailable) {
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest, CallDisableLockOnLeaveOnServiceAvailable) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest, EnableLockOnLeaveSucceedsIfServiceAvailable) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
human_presence_client_->Reset();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
}
TEST_F(LockOnLeaveControllerTest, EnableHpsSenseOnlyCalledOnceOnTwoCalls) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
human_presence_client_->Reset();
lock_on_leave_controller->EnableLockOnLeave();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
}
TEST_F(LockOnLeaveControllerTest, DisableLockOnLeaveDoesNothingIfNotEnabled) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
human_presence_client_->Reset();
lock_on_leave_controller->DisableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest, DisableLockOnLeaveSuceedsIfEnabled) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
lock_on_leave_controller->EnableLockOnLeave();
human_presence_client_->Reset();
lock_on_leave_controller->DisableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest, DisableHpsSenseOnlyCalledOnceOnTwoCalls) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
human_presence_client_->Reset();
lock_on_leave_controller->DisableLockOnLeave();
lock_on_leave_controller->DisableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest, NoDbusCallsOnRestartIfLockOnLeaveDisabled) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
human_presence_client_->Shutdown();
human_presence_client_->Restart();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
}
TEST_F(LockOnLeaveControllerTest,
EnableLockOnLeaveOnRestartIfLockOnLeaveWasEnabled) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
base::RunLoop().RunUntilIdle();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
human_presence_client_->Shutdown();
human_presence_client_->Restart();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 2);
}
TEST_F(LockOnLeaveControllerTest, AlwaysCallDisableOnServiceAvailable) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
lock_on_leave_controller->EnableLockOnLeave();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
}
TEST_F(LockOnLeaveControllerTest, OrientationChanging) {
human_presence_client_->set_hps_service_is_available(true);
auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
human_presence_client_->Reset();
lock_on_leave_controller->OnOrientationChanged(false);
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
human_presence_client_->Reset();
lock_on_leave_controller->DisableLockOnLeave();
base::RunLoop().RunUntilIdle();
lock_on_leave_controller->OnOrientationChanged(false);
base::RunLoop().RunUntilIdle();
lock_on_leave_controller->EnableLockOnLeave();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
lock_on_leave_controller->OnOrientationChanged(true);
base::RunLoop().RunUntilIdle();
EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
}
}