| # 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 verfying 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() |