# Copyright 2016 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.
import logging
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.enterprise import enterprise_policy_base
from autotest_lib.client.cros.power import power_status
class policy_ChromeOsLockOnIdleSuspend(
enterprise_policy_base.EnterprisePolicyTest):
"""
Test effect of ChromeOsLockOnIdleSuspend policy on Chrome OS behavior.
This test verifies the behaviour and appearance of the 'Require password
to wake from sleep' check box setting in the Security: Idle Settings
section of the chrome://settings page for all valid values of the user
policy ChromeOsLockOnIdleSuspend: True, False, and Not set. The
corresponding test cases are: True_Lock, False_Unlock, NotSet_Unlock.
Note: True_Lock case is not run as part of the regression suite due to
bug crbug.com/666430. See control.true_lock for details.
"""
version = 1
POLICY_NAME = 'ChromeOsLockOnIdleSuspend'
TEST_CASES = {
'True_Lock': True,
'False_Unlock': False,
'NotSet_Unlock': None
}
IDLE_ACTION_DELAY = 5
POWER_MANAGEMENT_IDLE_SETTINGS = {
'AC': {
'Delays': {
'ScreenDim': 2000,
'ScreenOff': 3000,
'IdleWarning': 4000,
'Idle': (IDLE_ACTION_DELAY * 1000)
},
'IdleAction': 'Suspend'
},
'Battery': {
'Delays': {
'ScreenDim': 2000,
'ScreenOff': 3000,
'IdleWarning': 4000,
'Idle': (IDLE_ACTION_DELAY * 1000)
},
'IdleAction': 'Suspend'
}
}
PERCENT_CHARGE_MIN = 10
STARTUP_URLS = ['chrome://policy', 'chrome://settings']
SUPPORTING_POLICIES = {
'AllowScreenLock': True,
'LidCloseAction': 0,
'PowerManagementIdleSettings': POWER_MANAGEMENT_IDLE_SETTINGS,
'RestoreOnStartup': 4,
'RestoreOnStartupURLs': STARTUP_URLS
}
def initialize(self, **kwargs):
"""Set up local variables and ensure sufficient battery charge."""
self._power_status = power_status.get_status()
if not self._power_status.on_ac():
# Ensure that the battery has sufficient minimum charge.
self._power_status.assert_battery_state(self.PERCENT_CHARGE_MIN)
logging.info('Device power type is "%s"', self._power_type)
super(policy_ChromeOsLockOnIdleSuspend, self).initialize(**kwargs)
@property
def _power_type(self):
"""Return type of power used by DUT: AC or Battery."""
return 'AC' if self._power_status.on_ac() else 'Battery'
def _is_screen_locked(self):
"""Return true if login status indicates that screen is locked."""
def _get_screen_locked():
"""Return isScreenLocked property, if defined."""
login_status = self.cr.login_status
if (isinstance(login_status, dict) and
'isScreenLocked' in login_status):
return self.cr.login_status['isScreenLocked']
else:
logging.debug('login_status: %s', login_status)
return None
return utils.wait_for_value(_get_screen_locked, expected_value=True,
timeout_sec=self.IDLE_ACTION_DELAY)
def _test_require_password_to_wake(self, policy_value):
"""
Verify CrOS enforces ChromeOsLockOnIdleSuspend policy value.
@param policy_value: policy value for this case.
@raises: TestFail if behavior is incorrect.
"""
screen_is_locked = self._is_screen_locked()
if screen_is_locked is None:
raise error.TestError('Could not determine screen state!')
# Screen shall be locked if the policy is True, else unlocked.
if policy_value:
if not screen_is_locked:
raise error.TestFail('Screen should be locked.')
else:
if screen_is_locked:
raise error.TestFail('Screen should be unlocked.')
def run_once(self, case):
"""
Setup and run the test configured for the specified test case.
@param case: Name of the test case to run.
"""
case_value = self.TEST_CASES[case]
self.SUPPORTING_POLICIES[self.POLICY_NAME] = case_value
self.setup_case(user_policies=self.SUPPORTING_POLICIES)
self._test_require_password_to_wake(case_value)