# Copyright 2024 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 = "cienet-firmware@cienet.corp-partner.google.com"
NAME = 'tast.firmware-ec_servo_micro'
METADATA = {
        "contacts": ["chromeos-faft@google.com", "cienet-firmware@cienet.corp-partner.google.com"],
        "bug_component": "b:792402", # ChromeOS > Platform > Enablement > Firmware > FAFT
        "criteria": "Run Tast tests for firmware that require servo_micro",
}
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING, servo_component:servo_micro'
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 servo with servo_micro.

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

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_servo_micro)'],
                 ignore_test_failures=True, max_run_sec=10800,
                 command_args=command_args,
                 varslist=varslist,
                 )

parallel_simple(run, machines)