| # 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)) |