1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ash/system/power/power_button_test_base.h"
6 
7 #include "ash/public/cpp/ash_switches.h"
8 #include "ash/public/cpp/test/shell_test_api.h"
9 #include "ash/session/session_controller_impl.h"
10 #include "ash/session/test_session_controller_client.h"
11 #include "ash/shell.h"
12 #include "ash/system/power/power_button_controller.h"
13 #include "ash/system/power/power_button_controller_test_api.h"
14 #include "ash/wm/lock_state_controller.h"
15 #include "ash/wm/lock_state_controller_test_api.h"
16 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
17 #include "base/command_line.h"
18 #include "base/memory/ptr_util.h"
19 #include "base/test/simple_test_tick_clock.h"
20 #include "chromeos/dbus/power/power_manager_client.h"
21 #include "ui/events/event.h"
22 #include "ui/events/test/event_generator.h"
23 
24 namespace ash {
25 
26 PowerButtonTestBase::PowerButtonTestBase() = default;
27 
28 PowerButtonTestBase::~PowerButtonTestBase() = default;
29 
SetUp()30 void PowerButtonTestBase::SetUp() {
31   AshTestBase::SetUp();
32 
33   lock_state_controller_ = Shell::Get()->lock_state_controller();
34   lock_state_test_api_ =
35       std::make_unique<LockStateControllerTestApi>(lock_state_controller_);
36 }
37 
TearDown()38 void PowerButtonTestBase::TearDown() {
39   AshTestBase::TearDown();
40 }
41 
ResetPowerButtonController()42 void PowerButtonTestBase::ResetPowerButtonController() {
43   ShellTestApi().ResetPowerButtonControllerForTest();
44   power_button_test_api_ = nullptr;
45   InitPowerButtonControllerMembers(
46       chromeos::PowerManagerClient::TabletMode::UNSUPPORTED);
47 }
48 
InitPowerButtonControllerMembers(chromeos::PowerManagerClient::TabletMode initial_tablet_mode_switch_state)49 void PowerButtonTestBase::InitPowerButtonControllerMembers(
50     chromeos::PowerManagerClient::TabletMode initial_tablet_mode_switch_state) {
51   power_button_controller_ = Shell::Get()->power_button_controller();
52   power_button_test_api_ =
53       std::make_unique<PowerButtonControllerTestApi>(power_button_controller_);
54   power_button_test_api_->SetTickClock(&tick_clock_);
55 
56   if (initial_tablet_mode_switch_state !=
57       chromeos::PowerManagerClient::TabletMode::UNSUPPORTED) {
58     SetTabletModeSwitchState(initial_tablet_mode_switch_state);
59   } else {
60     screenshot_controller_ = nullptr;
61   }
62 }
63 
SetTabletModeSwitchState(chromeos::PowerManagerClient::TabletMode tablet_mode_switch_state)64 void PowerButtonTestBase::SetTabletModeSwitchState(
65     chromeos::PowerManagerClient::TabletMode tablet_mode_switch_state) {
66   power_button_controller_->OnGetSwitchStates(
67       chromeos::PowerManagerClient::SwitchStates{
68           chromeos::PowerManagerClient::LidState::OPEN,
69           tablet_mode_switch_state});
70 
71   screenshot_controller_ = power_button_test_api_->GetScreenshotController();
72 }
73 
PressPowerButton()74 void PowerButtonTestBase::PressPowerButton() {
75   power_button_controller_->PowerButtonEventReceived(true,
76                                                      tick_clock_.NowTicks());
77 }
78 
ReleasePowerButton()79 void PowerButtonTestBase::ReleasePowerButton() {
80   power_button_controller_->PowerButtonEventReceived(false,
81                                                      tick_clock_.NowTicks());
82 }
83 
PressKey(ui::KeyboardCode key_code)84 void PowerButtonTestBase::PressKey(ui::KeyboardCode key_code) {
85   GetEventGenerator()->PressKey(key_code, ui::EF_NONE);
86 }
87 
ReleaseKey(ui::KeyboardCode key_code)88 void PowerButtonTestBase::ReleaseKey(ui::KeyboardCode key_code) {
89   GetEventGenerator()->ReleaseKey(key_code, ui::EF_NONE);
90 }
91 
GenerateMouseMoveEvent()92 void PowerButtonTestBase::GenerateMouseMoveEvent() {
93   GetEventGenerator()->MoveMouseTo(10, 10);
94 }
95 
Initialize(PowerButtonController::ButtonType button_type,LoginStatus status)96 void PowerButtonTestBase::Initialize(
97     PowerButtonController::ButtonType button_type,
98     LoginStatus status) {
99   power_button_test_api_->SetPowerButtonType(button_type);
100   if (status == LoginStatus::NOT_LOGGED_IN)
101     ClearLogin();
102   else
103     CreateUserSessions(1);
104 
105   if (status == LoginStatus::GUEST)
106     SetCanLockScreen(false);
107 }
108 
LockScreen()109 void PowerButtonTestBase::LockScreen() {
110   lock_state_controller_->OnLockStateChanged(true);
111   GetSessionControllerClient()->LockScreen();
112 }
113 
UnlockScreen()114 void PowerButtonTestBase::UnlockScreen() {
115   lock_state_controller_->OnLockStateChanged(false);
116   GetSessionControllerClient()->UnlockScreen();
117 }
118 
EnableTabletMode(bool enable)119 void PowerButtonTestBase::EnableTabletMode(bool enable) {
120   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(enable);
121 }
122 
AdvanceClockToAvoidIgnoring()123 void PowerButtonTestBase::AdvanceClockToAvoidIgnoring() {
124   tick_clock_.Advance(PowerButtonController::kIgnoreRepeatedButtonUpDelay +
125                       base::TimeDelta::FromMilliseconds(1));
126 }
127 
128 }  // namespace ash
129