# 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

AUTHOR = 'cros-tdm-tpe-eng@google.com'
NAME = 'tast.healthd-per-build'
TIME = 'SHORT'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING'
ATTRIBUTES = 'suite:healthd_per-build'
MAX_RESULT_SIZE_KB = 256 * 1024
PY_VERSION = 3

METADATA = {
    "contacts": ["cros-tdm-tpe-eng@google.com"],
    "bug_component": "b:982097",
    'criteria': 'Tauto wrapper for specified tast tests',
    "hw_agnostic": False
}

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

DOC = '''
Run cros_healthd Tast tests per build.

Tast is an integration-testing framework analagous to the test-running portion
of Autotest. See https://chromium.googlesource.com/chromiumos/platform/tast/ for
more information.

This test runs Tast tests in the "health" category that are required to pass
against a remote DUT. It fails if any individual Tast tests fail.

See http://go/tast-failures for information about investigating failures.
'''

args_dict = utils.args_to_dict(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:healthd" && '
                             '"healthd_perbuild"'
                             ')'],
                 ignore_test_failures=False,
                 max_run_sec=1800,
                 command_args=args,
                 clear_tpm=True,
                 retries=2)

parallel_simple(run, machines)
