| # 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. |
| |
| from __future__ import print_function |
| |
| import logging |
| import time |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.server import autotest |
| from autotest_lib.server.cros.faft.firmware_test import FirmwareTest |
| |
| |
| class firmware_Cr50USB(FirmwareTest): |
| """ |
| Stress the Cr50 usb connection to the DUT. |
| |
| This test is intended to be run with many iterations to ensure that the |
| USB connection is not flaky. |
| |
| The iteration should be specified by the parameter -a "num_iterations=10". |
| |
| To exit on the first USB failure use "exit_condition='immediately'". |
| """ |
| version = 1 |
| |
| SLEEP_DELAY = 20 |
| |
| def cleanup(self): |
| """Reenable CCD before cleanup""" |
| if hasattr(self, "cr50"): |
| self.cr50.ccd_enable() |
| super(firmware_Cr50USB, self).cleanup() |
| |
| |
| def run_once(self, host, cmdline_args, num_iterations=100, |
| exit_condition=None): |
| """Runs a single iteration of the test.""" |
| self.host = host |
| # Disable CCD so it doesn't interfere with the Cr50 AP usb connection. |
| if hasattr(self, "cr50"): |
| self.cr50.ccd_disable() |
| |
| # Make sure the device is logged in so TPM activity doesn't keep it |
| # awake |
| self.client_at = autotest.Autotest(self.host) |
| self.client_at.run_test('login_LoginSuccess') |
| |
| failed_runs = [] |
| fail_count = 0 |
| logging.info("Running Cr50 USB stress test for %d iterations", |
| num_iterations) |
| |
| for iteration in range(num_iterations): |
| if iteration: |
| time.sleep(self.SLEEP_DELAY) |
| |
| i = iteration + 1 |
| logging.info("Run %d of %d%s", i, num_iterations, |
| " %d failures" % fail_count if fail_count else "") |
| try: |
| # Run usb_updater command. |
| result = self.host.run("usb_updater -f") |
| except Exception as e: |
| failed_runs.append(str(i)) |
| fail_count += 1 |
| logging.debug(e) |
| |
| if exit_condition == "immediately": |
| raise error.TestFail("USB failure on run %d of %d" % |
| (i, num_iterations)) |
| |
| logging.info("USB failure on %d out of %d runs: %s", fail_count, |
| i, ', '.join(failed_runs)) |
| |
| if fail_count: |
| raise error.TestFail('USB failure on %d runs out of %d: %s' % |
| (fail_count, num_iterations, ', '.join(failed_runs))) |