# Copyright 2023 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-detachable-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 = 'LENGTHY'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING, servo_usb_state:NORMAL'
ATTRIBUTES = 'suite:faft_detachable'
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.

The tests are part of 'group:firmware'. The 'firmware_detachable'
sub-attribute limits it to detachable tests. Once the test is stable change
the attribute to one of the others. This group also requires working USB sticks.
'''

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_detachable && firmware_usb)'],
                 ignore_test_failures=True,
                 max_run_sec=16200, # 4h30m
                 command_args=command_args,
                 varslist=varslist,
                 ephemeraldevserver='false',
                 )

parallel_simple(run, machines)
