# 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 import os from autotest_lib.client.bin import utils from autotest_lib.client.common_lib import error from autotest_lib.client.cros.update_engine import nebraska_wrapper from autotest_lib.client.cros.update_engine import update_engine_test class autoupdate_PeriodicCheck(update_engine_test.UpdateEngineTest): """Tests update_engine's periodic update check mechanism.""" version = 1 _PERIODIC_INTERVAL_PREF = 'test-update-check-interval-timeout' _PERIODIC_LOG = ('Unofficial build, but periodic update check interval ' 'timeout is defined, so update is not blocked.') def cleanup(self): """Cleans up the state and extra files this test created.""" self._remove_update_engine_pref(self._PERIODIC_INTERVAL_PREF) self._clear_custom_lsb_release() super(autoupdate_PeriodicCheck, self).cleanup() def run_once(self, payload_url, periodic_interval): """ Tests update_engine's periodic update check. @param payload_url: The payload url. @param periodic_interval: Seconds between periodic update checks. """ # Setup the DUT for the test. pref_file = os.path.join(self._UPDATE_ENGINE_PREFS_DIR, self._PERIODIC_INTERVAL_PREF) utils.run(['echo', str(periodic_interval), '>', pref_file]) utils.run(['touch', '/home/chronos/.oobe_completed']) with nebraska_wrapper.NebraskaWrapper( log_dir=self.resultsdir, payload_url=payload_url) as nebraska: logging.info('Setting first update response to return no update.') self._create_custom_lsb_release( nebraska.get_update_url(no_update=True)) self._restart_update_engine() # Wait for the first update check. try: utils.poll_for_condition( lambda: len(self._get_update_requests()) == 1, desc='1st periodic update check.', timeout=1.5 * periodic_interval) except utils.TimeoutError: raise error.TestFail('1st periodic check not found.') self._check_update_engine_log_for_entry(self._PERIODIC_LOG, raise_error=True) logging.info('First periodic update was initiated.') logging.info('Setting the next update response to be an update.') self._create_custom_lsb_release(nebraska.get_update_url()) # Wait for the second update check. try: utils.poll_for_condition( lambda: len(self._get_update_requests()) == 2, desc='2nd periodic update check.', timeout=2 * periodic_interval) except utils.TimeoutError: raise error.TestFail('2nd periodic check not found.') logging.info('Second periodic update was initiated.') self._wait_for_update_to_complete()