power_policy_browsertest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Use of this source code is governed by a BSD-style license that can be
3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// found in the LICENSE file.
4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <string>
6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "base/compiler_specific.h"
8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "base/run_loop.h"
9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "base/values.h"
10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/browser/extensions/api/power/power_api_manager.h"
11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/browser/policy/browser_policy_connector.h"
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/browser/policy/mock_configuration_policy_provider.h"
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/browser/policy/policy_map.h"
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/browser/policy/policy_types.h"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/common/extensions/api/power.h"
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chrome/test/base/in_process_browser_test.h"
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chromeos/dbus/dbus_thread_manager.h"
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chromeos/dbus/fake_power_manager_client.h"
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chromeos/dbus/power_manager/policy.pb.h"
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "chromeos/dbus/power_policy_controller.h"
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "policy/policy_constants.h"
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "testing/gmock/include/gmock/gmock.h"
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace policy {
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace {
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing ::testing::AnyNumber;
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing ::testing::Return;
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing ::testing::_;
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace pm = power_manager;
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}  // namespace
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass PowerPolicyBrowserTest : public InProcessBrowserTest {
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines protected:
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // InProcessBrowserTest:
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sets |user_policy_name| to |user_policy_value|.
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void SetUserPolicy(const std::string& user_policy_name,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     base::Value* user_policy_value);
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Returns a string describing |policy|.
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string GetDebugString(const pm::PowerManagementPolicy& policy);
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  chromeos::FakePowerManagerClient* power_manager_client_;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines private:
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MockConfigurationPolicyProvider provider_;
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
54
55void PowerPolicyBrowserTest::SetUpInProcessBrowserTestFixture() {
56  chromeos::MockDBusThreadManagerWithoutGMock* dbus_thread_manager =
57      new chromeos::MockDBusThreadManagerWithoutGMock;
58  power_manager_client_ = dbus_thread_manager->fake_power_manager_client();
59  chromeos::DBusThreadManager::InitializeForTesting(dbus_thread_manager);
60  EXPECT_CALL(provider_, IsInitializationComplete(_))
61      .WillRepeatedly(Return(true));
62  EXPECT_CALL(provider_, RegisterPolicyDomain(_)).Times(AnyNumber());
63  BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
64}
65
66void PowerPolicyBrowserTest::SetUserPolicy(
67    const std::string& user_policy_name,
68    base::Value* user_policy_value) {
69  PolicyMap policy_map;
70  policy_map.Set(user_policy_name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
71                 user_policy_value);
72  provider_.UpdateChromePolicy(policy_map);
73  base::RunLoop().RunUntilIdle();
74}
75
76std::string PowerPolicyBrowserTest::GetDebugString(
77    const pm::PowerManagementPolicy& policy) {
78  return chromeos::PowerPolicyController::GetPolicyDebugString(policy);
79}
80
81IN_PROC_BROWSER_TEST_F(PowerPolicyBrowserTest, SetPowerPolicy) {
82  pm::PowerManagementPolicy original_power_management_policy =
83      power_manager_client_->get_policy();
84
85  pm::PowerManagementPolicy power_management_policy =
86      original_power_management_policy;
87  power_management_policy.set_ac_idle_action(
88      pm::PowerManagementPolicy::STOP_SESSION);
89  SetUserPolicy(
90      key::kIdleActionAC,
91      base::Value::CreateIntegerValue(pm::PowerManagementPolicy::STOP_SESSION));
92  EXPECT_EQ(GetDebugString(power_management_policy),
93            GetDebugString(power_manager_client_->get_policy()));
94
95  power_management_policy = original_power_management_policy;
96  power_management_policy.set_battery_idle_action(
97      pm::PowerManagementPolicy::STOP_SESSION);
98  SetUserPolicy(
99      key::kIdleActionBattery,
100      base::Value::CreateIntegerValue(pm::PowerManagementPolicy::STOP_SESSION));
101  EXPECT_EQ(GetDebugString(power_management_policy),
102            GetDebugString(power_manager_client_->get_policy()));
103
104  power_management_policy = original_power_management_policy;
105  power_management_policy.set_lid_closed_action(
106      pm::PowerManagementPolicy::STOP_SESSION);
107  SetUserPolicy(
108      key::kLidCloseAction,
109      base::Value::CreateIntegerValue(pm::PowerManagementPolicy::STOP_SESSION));
110  EXPECT_EQ(GetDebugString(power_management_policy),
111            GetDebugString(power_manager_client_->get_policy()));
112
113  power_management_policy = original_power_management_policy;
114  power_management_policy.mutable_ac_delays()->set_idle_ms(9000);
115  SetUserPolicy(key::kIdleDelayAC, base::Value::CreateIntegerValue(9000));
116  EXPECT_EQ(GetDebugString(power_management_policy),
117            GetDebugString(power_manager_client_->get_policy()));
118
119  power_management_policy = original_power_management_policy;
120  power_management_policy.mutable_ac_delays()->set_idle_warning_ms(8000);
121  SetUserPolicy(key::kIdleWarningDelayAC,
122                base::Value::CreateIntegerValue(8000));
123  EXPECT_EQ(GetDebugString(power_management_policy),
124            GetDebugString(power_manager_client_->get_policy()));
125
126  power_management_policy = original_power_management_policy;
127  power_management_policy.mutable_ac_delays()->set_screen_off_ms(7000);
128  SetUserPolicy(key::kScreenOffDelayAC, base::Value::CreateIntegerValue(7000));
129  EXPECT_EQ(GetDebugString(power_management_policy),
130            GetDebugString(power_manager_client_->get_policy()));
131
132  power_management_policy = original_power_management_policy;
133  power_management_policy.mutable_ac_delays()->set_screen_dim_ms(5000);
134  SetUserPolicy(key::kScreenDimDelayAC, base::Value::CreateIntegerValue(5000));
135  EXPECT_EQ(GetDebugString(power_management_policy),
136            GetDebugString(power_manager_client_->get_policy()));
137
138  power_management_policy = original_power_management_policy;
139  power_management_policy.mutable_ac_delays()->set_screen_lock_ms(6000);
140  SetUserPolicy(key::kScreenLockDelayAC, base::Value::CreateIntegerValue(6000));
141  EXPECT_EQ(GetDebugString(power_management_policy),
142            GetDebugString(power_manager_client_->get_policy()));
143
144  power_management_policy = original_power_management_policy;
145  power_management_policy.mutable_battery_delays()->set_idle_ms(5000);
146  SetUserPolicy(key::kIdleDelayBattery, base::Value::CreateIntegerValue(5000));
147  EXPECT_EQ(GetDebugString(power_management_policy),
148            GetDebugString(power_manager_client_->get_policy()));
149
150  power_management_policy = original_power_management_policy;
151  power_management_policy.mutable_battery_delays()->set_idle_warning_ms(4000);
152  SetUserPolicy(key::kIdleWarningDelayBattery,
153                base::Value::CreateIntegerValue(4000));
154  EXPECT_EQ(GetDebugString(power_management_policy),
155            GetDebugString(power_manager_client_->get_policy()));
156
157  power_management_policy = original_power_management_policy;
158  power_management_policy.mutable_battery_delays()->set_screen_off_ms(3000);
159  SetUserPolicy(key::kScreenOffDelayBattery,
160                base::Value::CreateIntegerValue(3000));
161  EXPECT_EQ(GetDebugString(power_management_policy),
162            GetDebugString(power_manager_client_->get_policy()));
163
164  power_management_policy = original_power_management_policy;
165  power_management_policy.mutable_battery_delays()->set_screen_dim_ms(1000);
166  SetUserPolicy(key::kScreenDimDelayBattery,
167                base::Value::CreateIntegerValue(1000));
168  EXPECT_EQ(GetDebugString(power_management_policy),
169            GetDebugString(power_manager_client_->get_policy()));
170
171  power_management_policy = original_power_management_policy;
172  power_management_policy.mutable_battery_delays()->set_screen_lock_ms(2000);
173  SetUserPolicy(key::kScreenLockDelayBattery,
174                base::Value::CreateIntegerValue(2000));
175  EXPECT_EQ(GetDebugString(power_management_policy),
176            GetDebugString(power_manager_client_->get_policy()));
177
178  power_management_policy = original_power_management_policy;
179  power_management_policy.set_use_audio_activity(false);
180  SetUserPolicy(key::kPowerManagementUsesAudioActivity,
181                base::Value::CreateBooleanValue(false));
182  EXPECT_EQ(GetDebugString(power_management_policy),
183            GetDebugString(power_manager_client_->get_policy()));
184
185  power_management_policy = original_power_management_policy;
186  power_management_policy.set_use_video_activity(false);
187  SetUserPolicy(key::kPowerManagementUsesVideoActivity,
188                base::Value::CreateBooleanValue(false));
189  EXPECT_EQ(GetDebugString(power_management_policy),
190            GetDebugString(power_manager_client_->get_policy()));
191
192  power_management_policy = original_power_management_policy;
193  power_management_policy.set_presentation_screen_dim_delay_factor(3.0);
194  SetUserPolicy(key::kPresentationScreenDimDelayScale,
195                base::Value::CreateIntegerValue(300));
196  EXPECT_EQ(GetDebugString(power_management_policy),
197            GetDebugString(power_manager_client_->get_policy()));
198}
199
200IN_PROC_BROWSER_TEST_F(PowerPolicyBrowserTest, AllowScreenWakeLocks) {
201  pm::PowerManagementPolicy baseline_policy =
202      power_manager_client_->get_policy();
203
204  // Default settings should have delays.
205  pm::PowerManagementPolicy power_management_policy = baseline_policy;
206  EXPECT_NE(0, baseline_policy.ac_delays().screen_dim_ms());
207  EXPECT_NE(0, baseline_policy.ac_delays().screen_off_ms());
208  EXPECT_NE(0, baseline_policy.battery_delays().screen_dim_ms());
209  EXPECT_NE(0, baseline_policy.battery_delays().screen_off_ms());
210
211  // Pretend an extension grabs a screen wake lock.
212  const char kExtensionId[] = "abcdefghijklmnopabcdefghijlkmnop";
213  extensions::PowerApiManager::GetInstance()->AddRequest(
214      kExtensionId, extensions::api::power::LEVEL_DISPLAY);
215  base::RunLoop().RunUntilIdle();
216
217  // Check that the lock is in effect (ignoring idle_action and reason).
218  pm::PowerManagementPolicy policy = baseline_policy;
219  policy.mutable_ac_delays()->set_screen_dim_ms(0);
220  policy.mutable_ac_delays()->set_screen_off_ms(0);
221  policy.mutable_battery_delays()->set_screen_dim_ms(0);
222  policy.mutable_battery_delays()->set_screen_off_ms(0);
223  policy.set_ac_idle_action(
224      power_manager_client_->get_policy().ac_idle_action());
225  policy.set_battery_idle_action(
226      power_manager_client_->get_policy().battery_idle_action());
227  policy.set_reason(power_manager_client_->get_policy().reason());
228  EXPECT_EQ(GetDebugString(policy),
229            GetDebugString(power_manager_client_->get_policy()));
230
231  // Engage the policy and verify that the defaults take effect again.
232  SetUserPolicy(key::kAllowScreenWakeLocks,
233                base::Value::CreateBooleanValue(false));
234  policy = baseline_policy;
235  policy.set_ac_idle_action(
236      power_manager_client_->get_policy().ac_idle_action());
237  policy.set_battery_idle_action(
238      power_manager_client_->get_policy().battery_idle_action());
239  policy.set_reason(power_manager_client_->get_policy().reason());
240  EXPECT_EQ(GetDebugString(policy),
241            GetDebugString(power_manager_client_->get_policy()));
242}
243
244}  // namespace policy
245