# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
AUTHOR = 'ChromeOS SW Engprod Team (chromeos-sw-engprod@google.com)'
NAME = 'tast.assistant-audiobox'
METADATA = {
    'contacts': ['chromeos-sw-engprod@google.com', 'jonfan@google.com', 'yawano@google.com'],
    'bug_component': 'b:905229', # ChromeOS > Software > Assistive
    'criteria': 'Run Assistant audio tests in Audiobox.',
    'hw_agnostic': False
}
TEST_TYPE = 'Server'
ATTRIBUTES = 'suite:assistant-audiobox'
JOB_RETRIES = 2
MAX_RESULT_SIZE_KB = 1024 * 1024
DEPENDENCIES = 'audio_box'

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

DOC = '''
Run Assistant audio tests in Audiobox.
'''

from autotest_lib.client.common_lib import utils
from autotest_lib.server import utils as server_utils


def run(machine):
    # Get host objects for each device.
    host = hosts.create_host(machine)

    # Extract Chameleon args from command line arguments
    args_dict = utils.args_to_dict(args)
    varslist = []

    # In Skylab, Chameleon follows the naming convention '{DUT}-chameleon'.
    # The series of tests are executed as Tast client tests, during which
    # DUT would issues xmlrpc commands directly against Chameleon.
    # The DUT and the corresponding Chameleon board in an audiobox can
    # access each other only through IP. The drone server can help
    # look up the IP for '{DUT}-chameleon' and pass that to DUT.
    if 'chameleon_host' in args_dict:
        chameleon_host = args_dict['chameleon_host']
    else:
        chameleon_host = '%s-chameleon' % host.hostname

    chameleon_ip = server_utils.get_ip_address(chameleon_host)
    logging.info('chameleon_host: %s resolves to chameleon_ip: %s', chameleon_host, chameleon_ip)
    varslist.append ('assistant.chameleon_host=%s' % chameleon_ip)

    if 'chameleon_port' in args_dict:
        varslist.append ('assistant.chameleon_port=%s' % args_dict['chameleon_port'])

    if 'chameleon_ssh_port' in args_dict:
        varslist.append ('assistant.chameleon_ssh_port=%s' % args_dict['chameleon_ssh_port'])

    logging.info('Calling Tast tests under group:assistant_audiobox with args: %s and varslist: %s', args, varslist)

    job.run_test('tast',
                 host=host,
                 test_exprs=['("group:assistant_audiobox")'],
                 command_args=args,
                 varslist=varslist)

parallel_simple(run, machines)
