128 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			5.5 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.
 | |
| 
 | |
| import logging
 | |
| import os
 | |
| 
 | |
| 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 nebraska_wrapper
 | |
| from autotest_lib.client.cros.update_engine import update_engine_test
 | |
| 
 | |
| class autoupdate_UserData(update_engine_test.UpdateEngineTest):
 | |
|     """
 | |
|     Modifies some user settings and checks they were not reset by an update.
 | |
| 
 | |
|     This test is used as part of the server test autoupdate_DataPreserved.
 | |
|     This test will make use of several private Chrome APIs:
 | |
|     inputMethodPrivate: chrome/common/extensions/api/input_method_private.json
 | |
|     languageSettingsPrivate: chrome/common/extensions/api/
 | |
|                              language_settings_private.idl
 | |
|     settingsPrivate: chrome/common/extensions/api/settings_private.idl
 | |
| 
 | |
|     """
 | |
|     version = 1
 | |
| 
 | |
|     _TEST_FILE = '/home/chronos/user/Downloads/test.txt'
 | |
|     _US_IME = '_comp_ime_jkghodnilhceideoidjikpgommlajknkxkb:us::eng'
 | |
|     _US_INTL_IME = '_comp_ime_jkghodnilhceideoidjikpgommlajknkxkb:us:intl:eng'
 | |
|     _TIME_ZONE_PREF = 'generated.resolve_timezone_by_geolocation_on_off'
 | |
| 
 | |
|     _GET_IME_JS = '''
 | |
|         new Promise(function(resolve, reject) {
 | |
|             chrome.inputMethodPrivate.getCurrentInputMethod(
 | |
|                 function(id) {
 | |
|                     resolve(id);
 | |
|                 });
 | |
|         })
 | |
|     '''
 | |
|     _GET_PREF_JS = '''
 | |
|         new Promise(function(resolve, reject) {
 | |
|             chrome.settingsPrivate.getPref("%s", function(pref) {
 | |
|                 resolve(pref['value']);
 | |
|             });
 | |
|         })
 | |
|     '''
 | |
|     _SET_IME_JS = 'chrome.inputMethodPrivate.setCurrentInputMethod("%s")'
 | |
|     _SET_PREF_JS = ('chrome.settingsPrivate.setPref("%s", %s, '
 | |
|                     'x => console.log(x))')
 | |
| 
 | |
| 
 | |
|     def _modify_input_methods(self):
 | |
|         """ Change default Input Method to US International."""
 | |
|         current_ime = self._cr.autotest_ext.EvaluateJavaScript(
 | |
|             self._GET_IME_JS, promise=True)
 | |
|         logging.info('Current IME is %s', current_ime)
 | |
|         add_ime_js = ('chrome.languageSettingsPrivate.addInputMethod("%s")' %
 | |
|                       self._US_INTL_IME)
 | |
|         self._cr.autotest_ext.EvaluateJavaScript(add_ime_js)
 | |
|         self._cr.autotest_ext.EvaluateJavaScript(self._SET_IME_JS %
 | |
|                                                  self._US_INTL_IME)
 | |
|         new_ime = self._cr.autotest_ext.EvaluateJavaScript(self._GET_IME_JS)
 | |
|         if current_ime == new_ime:
 | |
|             raise error.TestFail('IME could not be changed before update.')
 | |
| 
 | |
| 
 | |
|     def _modify_time_zone(self):
 | |
|         """Change time zone to be user selected instead of automatic by IP."""
 | |
|         current_time_zone = self._cr.autotest_ext.EvaluateJavaScript(
 | |
|             self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
 | |
|         logging.info('Calculating timezone by IP: %s', current_time_zone)
 | |
|         self._cr.autotest_ext.EvaluateJavaScript(
 | |
|             self._SET_PREF_JS % (self._TIME_ZONE_PREF, 'false'))
 | |
|         new_timezone = self._cr.autotest_ext.EvaluateJavaScript(
 | |
|             self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
 | |
|         if current_time_zone == new_timezone:
 | |
|             raise error.TestFail('Timezone detection could not be changed.')
 | |
| 
 | |
| 
 | |
|     def _perform_after_update_checks(self):
 | |
|         """Check the user preferences and files are the same."""
 | |
|         with chrome.Chrome(dont_override_profile=True,
 | |
|                            autotest_ext=True) as cr:
 | |
|             # Check test file is still present.
 | |
|             if not os.path.exists(self._TEST_FILE):
 | |
|                 raise error.TestFail('Test file was not present after update.')
 | |
| 
 | |
|             # Check IME has not changed.
 | |
|             current_ime = cr.autotest_ext.EvaluateJavaScript(
 | |
|                 self._GET_IME_JS, promise=True)
 | |
|             if current_ime != self._US_INTL_IME:
 | |
|                 raise error.TestFail('Input method was not preserved after'
 | |
|                                      'update. Expected %s, Actual: %s' %
 | |
|                                      (self._US_INTL_IME, current_ime))
 | |
| 
 | |
|             # Check that timezone is user selected.
 | |
|             current_time_zone = cr.autotest_ext.EvaluateJavaScript(
 | |
|                 self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
 | |
|             if current_time_zone:
 | |
|                 raise error.TestFail('Time zone detection was changed back to '
 | |
|                                      'automatic.')
 | |
| 
 | |
| 
 | |
|     def run_once(self, payload_url=None):
 | |
|         """
 | |
|         Tests that user settings are not reset by update.
 | |
| 
 | |
|         @param payload_url: The payload url to use.
 | |
| 
 | |
|         """
 | |
|         if payload_url:
 | |
|             with nebraska_wrapper.NebraskaWrapper(
 | |
|                 log_dir=self.resultsdir, payload_url=payload_url) as nebraska:
 | |
|                 with chrome.Chrome(autotest_ext=True) as cr:
 | |
|                     self._cr = cr
 | |
|                     utils.run(['echo', 'hello', '>', self._TEST_FILE])
 | |
|                     self._modify_input_methods()
 | |
|                     self._modify_time_zone()
 | |
|                     self._check_for_update(
 | |
|                         nebraska.get_update_url(critical_update=True))
 | |
|                 # Sign out of Chrome and wait for the update to complete.
 | |
|                 # If we waited for the update to complete and then logged out
 | |
|                 # the DUT will auto-reboot and the client test cannot return.
 | |
|                 self._wait_for_update_to_complete()
 | |
|         else:
 | |
|             self._perform_after_update_checks()
 |