# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.common_lib import utils
from autotest_lib.server.site_tests.tast import tast

AUTHOR = 'ChromiumOS Firmware EngProd team'
NAME = 'tast.firmware-usb'
METADATA = {
        "contacts": ["chromeos-faft@google.com", "jbettis@chromium.org"],
        "bug_component": "b:792402", # ChromeOS > Platform > Enablement > Firmware > FAFT
        "criteria": "Run Tast tests for firmware",
}
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING, servo_usb_state:NORMAL'
ATTRIBUTES = 'suite:faft_ec, suite:faft_ec_fw_qual'
MAX_RESULT_SIZE_KB = 1024 * 1024
JOB_RETRIES = 0

# tast.py uses binaries installed from autotest_server_package.tar.bz2.
REQUIRE_SSP = True

DOC = '''
Run Tast tests for EC firmware that require a working usb stick.

The tests are part of 'group:firmware'. The 'firmware_ec' and
'firmware_usb' sub-attributes limits it to tests which require USB.
'''

command_args, varslist = tast.split_arguments(args)
args_dict = utils.args_to_dict(command_args)
assert 'servo_state:WORKING' in DEPENDENCIES
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    job.run_test('tast',
                 host=hosts.create_host(machine, servo_args=servo_args),
                 test_exprs=['("group:firmware" && firmware_ec && firmware_usb)'],
                 ignore_test_failures=True, max_run_sec=10800,
                 command_args=command_args,
                 varslist=varslist,
                 ephemeraldevserver='false')

parallel_simple(run, machines)
