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