# Copyright 2017 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 time from autotest_lib.client.common_lib import error from autotest_lib.server import autotest, test from autotest_lib.server.cros.faft.firmware_test import FirmwareTest class firmware_Cr50DeepSleepStress(FirmwareTest): """Verify cr50 deep sleep after running power_SuspendStress. Cr50 should enter deep sleep every suspend. Verify that by checking the idle deep sleep count. @param duration: Total time to spend running power_SuspendStress. suspend_iterations will take priority if it is set to some non-zero value. @param suspend_iterations: The number of iterations to run for power_SuspendStress. """ version = 1 SLEEP_DELAY = 20 MIN_RESUME = 15 MIN_SUSPEND = 15 MEM = "mem" def initialize(self, host, cmdline_args): super(firmware_Cr50DeepSleepStress, self).initialize(host, cmdline_args) if not hasattr(self, "cr50"): raise error.TestNAError('Test can only be run on devices with ' 'access to the Cr50 console') def check_deep_sleep_count(self): self.cr50.ccd_enable() count = self.cr50.get_deep_sleep_count() logging.debug("Cr50 resumed from deep sleep %d times", count) return count def cleanup(self): self.check_deep_sleep_count() super(firmware_Cr50DeepSleepStress, self).cleanup() def run_once(self, host, duration=600, suspend_iterations=0): self.cr50.send_command('sysrst pulse') if self.MIN_SUSPEND + self.MIN_RESUME < self.SLEEP_DELAY: logging.info("Minimum suspend-resume cycle is %ds. This is " \ "shorter than the Cr50 idle timeout. Cr50 may not " \ "enter deep sleep every cycle", self.MIN_SUSPEND + self.MIN_RESUME) # Clear the deep sleep count logging.info("Clear Cr50 deep sleep count") self.cr50.clear_deep_sleep_count() # Disable CCD so Cr50 can enter deep sleep self.cr50.ccd_disable() self.client_at = autotest.Autotest(host) suspend_iterations = suspend_iterations if suspend_iterations else None self.client_at.run_test('power_SuspendStress', tag="idle", duration=duration, min_suspend=self.MIN_SUSPEND, min_resume=self.MIN_RESUME, check_connection=False, iterations=suspend_iterations, suspend_state=self.MEM) count = self.check_deep_sleep_count() if suspend_iterations: logging.info("After %d suspend-resume cycles Cr50 entered deep " \ "sleep %d times." % (suspend_iterations, count)) if count != suspend_iterations: raise error.TestFail("Cr50 deep sleep count, %d, did not " \ "match suspend count, %d" % (count, suspend_iterations)) else: logging.info("During the %ds test Cr50 entered deep sleep %d " \ "times" % (duration, count))