102 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright 2020 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.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
 | |
| from telemetry.core import exceptions
 | |
| 
 | |
| class autoupdate_UpdateFromUI(update_engine_test.UpdateEngineTest):
 | |
|     """Starts an update from the Chrome OS Settings app. """
 | |
|     version = 1
 | |
| 
 | |
|     _NOTIFICATION_INTERVAL = 1
 | |
|     _NOTIFICATION_TIMEOUT = 10
 | |
|     _NOTIFICATION_TITLE = "Update available"
 | |
| 
 | |
| 
 | |
|     def initialize(self):
 | |
|         """Test setup."""
 | |
|         super(autoupdate_UpdateFromUI, self).initialize()
 | |
|         self._clear_custom_lsb_release()
 | |
|         self._cr = None
 | |
| 
 | |
| 
 | |
|     def cleanup(self):
 | |
|         """Test cleanup. Clears the custom lsb-release used by the test. """
 | |
|         self._clear_custom_lsb_release()
 | |
|         super(autoupdate_UpdateFromUI, self).cleanup()
 | |
| 
 | |
|     def _wait_for_update_notification(self):
 | |
|         """Waits for the post-update notification to appear. """
 | |
| 
 | |
|         def find_notification():
 | |
|             """Polls for visibility of the post-update notification. """
 | |
|             notifications = self._cr.get_visible_notifications()
 | |
|             if notifications is None:
 | |
|                 return False
 | |
|             return any(n for n in notifications
 | |
|                        if self._NOTIFICATION_TITLE in n['title'])
 | |
| 
 | |
|         utils.poll_for_condition(
 | |
|                 condition=find_notification,
 | |
|                 exception=error.TestFail('Post-update notification not found'),
 | |
|                 timeout=self._NOTIFICATION_TIMEOUT,
 | |
|                 sleep_interval=self._NOTIFICATION_INTERVAL)
 | |
| 
 | |
| 
 | |
|     def run_once(self, payload_url):
 | |
|         """
 | |
|         Tests that a Chrome OS software update can be completed from the UI,
 | |
|         and that the post-update notification appears when the update is
 | |
|         complete.
 | |
| 
 | |
|         @param payload_url: The payload url to use.
 | |
| 
 | |
|         """
 | |
|         with nebraska_wrapper.NebraskaWrapper(
 | |
|             log_dir=self.resultsdir, payload_url=payload_url) as nebraska:
 | |
|             # To check the post-update notification, we need to remain logged
 | |
|             # in after the update completes. However, the DUT will auto-reboot
 | |
|             # if we log out after completing an update. This will cause the
 | |
|             # server test to fail when returning from the client test. To avoid
 | |
|             # this, we stay logged in at the end of the client test by not
 | |
|             # using a context manager for the Chrome session.
 | |
|             try:
 | |
|                 self._cr = chrome.Chrome(autotest_ext=True)
 | |
| 
 | |
|                 # Need to create a custom lsb-release file to point the UI
 | |
|                 # update button to Nebraska instead of the default update
 | |
|                 # server.
 | |
|                 self._create_custom_lsb_release(
 | |
|                     nebraska.get_update_url(critical_update=True))
 | |
| 
 | |
|                 # Go to the OS settings page and check for an update.
 | |
|                 tab = self._cr.browser.tabs[0]
 | |
|                 tab.Navigate('chrome://os-settings/help')
 | |
|                 tab.WaitForDocumentReadyStateToBeComplete()
 | |
|                 self._take_screenshot('before_check_for_updates.png')
 | |
|                 try:
 | |
|                     tab.EvaluateJavaScript('settings.AboutPageBrowserProxyImpl'
 | |
|                                            '.getInstance().requestUpdate()')
 | |
|                 except exceptions.EvaluateException:
 | |
|                     raise error.TestFail(
 | |
|                         'Failed to find and click Check For Updates button.')
 | |
|                 self._take_screenshot('after_check_for_updates.png')
 | |
|                 self._wait_for_update_to_complete()
 | |
| 
 | |
|             except Exception as e:
 | |
|                 # The update didn't complete, so we can close the Chrome
 | |
|                 # session without worrying about auto-reboot.
 | |
|                 logging.exception("Failed to perform the update: %s", e)
 | |
|                 if self._cr:
 | |
|                     self._cr.close()
 | |
|                 raise error.TestFail("Failed to perform the update: %s" % e)
 | |
| 
 | |
|             self._wait_for_update_notification()
 |