# 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 math import time from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib import utils from autotest_lib.client.cros.update_engine import nebraska_wrapper from autotest_lib.client.cros.update_engine import update_engine_test from autotest_lib.client.cros.enterprise import enterprise_policy_base class policy_DeviceAutoUpdateDisabled( enterprise_policy_base.EnterprisePolicyTest, update_engine_test.UpdateEngineTest): """Test for the DeviceAutoUpdateDisabled policy.""" version = 1 _POLICY = 'DeviceAutoUpdateDisabled' def _test_update_disabled(self, update_url, should_update): """ Main test function. Try to update and poll for start (or lack of start) to the update. Check whether an update request was sent. @param update_url: The URL to get an update from. @param should_update: True or False whether the device should update. """ # Log time is only in second accuracy. Assume no update request has # occured since the current whole second started. start_time = math.floor(time.time()) logging.info('Update test start time: %s', start_time) try: self._check_for_update(update_url, interactive=False) utils.poll_for_condition( self._is_update_started, timeout=60, exception=error.TestFail('Update did not start!')) except error.TestFail as e: if should_update: raise e else: if not should_update: raise error.TestFail('Update started when it should not have!') update_time = self._get_time_of_last_update_request() logging.info('Last update time: %s', update_time) if should_update and (not update_time or update_time < start_time): raise error.TestFail('No update request was sent!') if not should_update and update_time and update_time >= start_time: raise error.TestFail('Update request was sent!') def run_once(self, case, image_url, enroll=True): """ Entry point of this test. @param case: True, False, or None for the value of the update policy. @param image_url: Url of update image (this build). """ # Because we are doing polimorphism and the EnterprisePolicyTest is # earlier in the python MRO, this class's initialize() will get called, # but not the UpdateEngineTest's initialize(). So we need to call it # manually. update_engine_test.UpdateEngineTest.initialize(self) self.setup_case(device_policies={self._POLICY: case}, enroll=enroll) with nebraska_wrapper.NebraskaWrapper( log_dir=self.resultsdir, payload_url=image_url, target_version='999999.9.9') as nebraska: self._create_custom_lsb_release(nebraska.get_update_url(), build='1.1.1') # When policy is False or not set, user should update. self._test_update_disabled(nebraska.get_update_url(), should_update=case is not True)