142 lines
4.9 KiB
Python
142 lines
4.9 KiB
Python
# Copyright 2018 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.
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.common_lib import utils
|
|
from autotest_lib.client.cros.enterprise import enterprise_policy_base
|
|
|
|
import logging
|
|
import time
|
|
|
|
|
|
class policy_SystemTimezone(
|
|
enterprise_policy_base.EnterprisePolicyTest):
|
|
"""
|
|
Test effect of SystemTimezone policy on Chrome OS behavior.
|
|
|
|
This will test that both the timezone can be set by the policy, and that
|
|
when the policy is not set a user can change the settings.
|
|
|
|
"""
|
|
version = 1
|
|
POLICY_NAME = 'SystemTimezone'
|
|
|
|
def _navigate_chromeos_settings_to_timezone(self):
|
|
"""
|
|
Will navigate the ChromeOS Settings (New as of R79) to the 'Time zone'
|
|
page.
|
|
|
|
"""
|
|
self.ui.click_and_wait_for_item_with_retries('/tray/', 'Settings', True)
|
|
self.ui.click_and_wait_for_item_with_retries('Settings', 'Advanced')
|
|
self.ui.click_and_wait_for_item_with_retries('Advanced',
|
|
'Date and time')
|
|
self.ui.click_and_wait_for_item_with_retries('Date and time',
|
|
'Time zone')
|
|
self.ui.click_and_wait_for_item_with_retries('Time zone',
|
|
'Choose from list',
|
|
click_role='link')
|
|
|
|
def _is_timezone_selectable(self):
|
|
"""
|
|
Check if the timezone is selectable via the UI. If the timezone
|
|
dropdown is greyed out, then it is not selectable.
|
|
|
|
@returns: True if dropdown is usable, False if not.
|
|
|
|
"""
|
|
self._navigate_chromeos_settings_to_timezone()
|
|
self.ui.doDefault_on_obj('Choose from list')
|
|
|
|
# Give the dropdown a second to load (there is no object to wait on).
|
|
time.sleep(2)
|
|
return not self.ui.is_obj_restricted('Time zone', role='popUpButton')
|
|
|
|
def _set_timezone(self):
|
|
"""Sets the timezone to the first option in the list."""
|
|
self.ui.doDefault_on_obj('/(UTC-10:00)/',
|
|
isRegex=True,
|
|
role='menuListOption')
|
|
|
|
def _test_timezone(self, expected):
|
|
"""
|
|
Verify the Timezone set on the device.
|
|
|
|
This is done by running the UNIX date command (%z) and verifying the
|
|
timezone matches the expected result.
|
|
|
|
"""
|
|
def check_timezone(expected):
|
|
result = utils.system_output('date +%z')
|
|
logging.info('date result {}'.format(result))
|
|
return result == expected
|
|
|
|
utils.poll_for_condition(
|
|
lambda: check_timezone(expected),
|
|
exception=error.TestFail('Time zone was not set! Expected {}'
|
|
.format(expected)),
|
|
timeout=30,
|
|
sleep_interval=1,
|
|
desc='Polling for timezone change')
|
|
|
|
def set_timezones(self):
|
|
"""
|
|
Iterate through different time zones, and verify they can be set.
|
|
|
|
This is specifically being done to verify the timezone via seeing
|
|
the reported timezone is changing, and not just on the first one via
|
|
luck.
|
|
|
|
"""
|
|
case = {'policy': 'Asia/Kathmandu', 'expected': '+0545'}
|
|
|
|
policy_value = case['policy']
|
|
expected = case['expected']
|
|
policies = {self.POLICY_NAME: policy_value}
|
|
self.setup_case(device_policies=policies, enroll=True)
|
|
self.ui.start_ui_root(self.cr)
|
|
# Logout so the policy can take effect
|
|
if self._is_timezone_selectable():
|
|
raise error.TestError(
|
|
'Timezone is selectable when the policy is set')
|
|
self.log_out_via_keyboard()
|
|
self._test_timezone(expected)
|
|
|
|
|
|
def set_empty_timezone(self):
|
|
"""
|
|
Set and verify the timezone when the policy is empty.
|
|
|
|
This will be done by adjusting the setting on the ://settings page,
|
|
and verifying the date reported. Additionally log out, then verify the
|
|
timezone matches as well.
|
|
|
|
"""
|
|
|
|
policies = {self.POLICY_NAME: ''}
|
|
self.setup_case(device_policies=policies, enroll=True)
|
|
self.ui.start_ui_root(self.cr)
|
|
|
|
# Check if the Timezone is changable in the settings.
|
|
if not self._is_timezone_selectable():
|
|
raise error.TestError('User cannot change timezone')
|
|
self._set_timezone()
|
|
|
|
self._test_timezone('-1000')
|
|
|
|
self.log_out_via_keyboard()
|
|
self._test_timezone('-1000')
|
|
|
|
def run_once(self, case):
|
|
"""
|
|
Run the proper test based on the selected case.
|
|
|
|
@param case: bool or None, value of the test case to run.
|
|
|
|
"""
|
|
if case:
|
|
self.set_timezones()
|
|
else:
|
|
self.set_empty_timezone()
|