| # 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. |
| |
| import os |
| import time |
| |
| from autotest_lib.client.bin import utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.cros.update_engine import update_engine_test |
| |
| class autoupdate_UserData(update_engine_test.UpdateEngineTest): |
| """ |
| Logs in, stats an update, waits for a while, then logs out. |
| |
| This test is used as part of the server test autoupdate_Interruptions. |
| |
| """ |
| version = 1 |
| |
| # Input method to change to. |
| _NEW_INPUT_METHOD = 'US International keyboard' |
| |
| # Javascript code for interacting with chrome://settings. |
| _CLICK_TIMEZONE_BUTTON = "document.querySelector('* /deep/ #timeZoneButton').click()" |
| _CLICK_AUTODETECT_OFF = "document.querySelector('* /deep/ #timeZoneAutoDetectOff').click()" |
| _IS_AUTODETECT_OFF = "document.querySelector('* /deep/ #timeZoneAutoDetectOff').checked" |
| _CLICK_INPUT_METHOD_BUTTON = "document.querySelector('* /deep/ #manageInputMethodsSubpageTrigger').click()" |
| _CLICK_MANAGE_INPUT_METHODS_BUTTON = "document.querySelector('* /deep/ #manageInputMethods').click()" |
| _CLICK_ADD_US_INTL_OPTION = "document.querySelectorAll('* /deep/ paper-checkbox')[1].click()" |
| _CLICK_MAKE_US_INTL_DEFAULT = "document.querySelector('* /deep/ #inputMethodsCollapse div.vertical-list').children[1].click()" |
| _GET_DEFAULT_INPUT_METHOD = "document.querySelector('* /deep/ #inputMethodsCollapse div.vertical-list').children[0].innerText" |
| _TEST_FILE = '/home/chronos/user/Downloads/test.txt' |
| |
| |
| def _execute_javascript(self, tab, code): |
| """ |
| Exeutes javascript code in the tab provided. |
| |
| @param tab: The chrome tab to run code in. |
| @param code: The javascript code to execute. |
| |
| """ |
| tab.ExecuteJavaScript(code) |
| time.sleep(5) |
| |
| |
| def _navigate(self, tab, url): |
| """ |
| Navigate a chrome tab to a URL. |
| |
| @param tab: The chrome tab. |
| @param url: The URL to navigate to. |
| |
| """ |
| tab.Navigate(url) |
| tab.WaitForDocumentReadyStateToBeComplete() |
| time.sleep(5) |
| |
| |
| def _modify_input_methods(self, tab): |
| """ |
| Change default input method to US International. |
| |
| @param tab: The chrome tab to user. |
| |
| """ |
| # TODO(dhaddock): A better way to interact with chrome://settings. |
| self._navigate(tab, 'chrome://settings/languages') |
| self._execute_javascript(tab, self._CLICK_INPUT_METHOD_BUTTON) |
| self._execute_javascript(tab, self._CLICK_MANAGE_INPUT_METHODS_BUTTON) |
| self._execute_javascript(tab, self._CLICK_ADD_US_INTL_OPTION) |
| self._navigate(tab, 'chrome://settings/languages') |
| self._execute_javascript(tab, self._CLICK_INPUT_METHOD_BUTTON) |
| self._execute_javascript(tab, self._CLICK_MAKE_US_INTL_DEFAULT) |
| |
| |
| def _modify_time_zone(self, tab): |
| """ |
| Change time zone to by user selected instead of automatic. |
| |
| @param tab: The chrome tab to user. |
| |
| """ |
| # TODO(dhaddock): A better way to interact with chrome://settings. |
| self._navigate(tab, 'chrome://settings/dateTime') |
| self._execute_javascript(tab, self._CLICK_TIMEZONE_BUTTON) |
| self._execute_javascript(tab, self._CLICK_AUTODETECT_OFF) |
| |
| |
| def _perform_after_update_checks(self): |
| """Check the user preferences and files are the same.""" |
| with chrome.Chrome(logged_in=True, dont_override_profile=True) as cr: |
| tab = cr.browser.tabs[0] |
| |
| # Open input methods and ensure the default is the one |
| # we selected before the update. |
| self._navigate(tab, 'chrome://settings/languages') |
| self._execute_javascript(tab, self._CLICK_INPUT_METHOD_BUTTON) |
| result = tab.EvaluateJavaScript(self._GET_DEFAULT_INPUT_METHOD) |
| if self._NEW_INPUT_METHOD not in result: |
| raise error.TestFail('Input method was not preserved.') |
| |
| # Make sure we are not autodetecting timezone. |
| self._navigate(tab, 'chrome://settings/dateTime') |
| self._execute_javascript(tab, self._CLICK_TIMEZONE_BUTTON) |
| result = tab.EvaluateJavaScript(self._IS_AUTODETECT_OFF) |
| if not result: |
| raise error.TestFail('Time zone is back to automatic.') |
| |
| if not os.path.exists(self._TEST_FILE): |
| raise error.TestFail('Test file is gone after update.') |
| utils.run('rm %s' % self._TEST_FILE) |
| |
| |
| def run_once(self, update_url=None, after_update=False): |
| """ |
| Tests that user settings are not reset by update. |
| |
| @param update_url: The update url to use. |
| @param after_update: True for post update checks. |
| |
| """ |
| if after_update: |
| self._perform_after_update_checks() |
| else: |
| with chrome.Chrome(logged_in=True) as cr: |
| utils.run('echo hello > %s' % self._TEST_FILE) |
| tab = cr.browser.tabs[0] |
| self._modify_input_methods(tab) |
| self._modify_time_zone(tab) |
| self._check_for_update(update_url) |
| self._wait_for_progress(0.2) |