# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.server import utils

AUTHOR = 'chromeos-bluetooth'
NAME = 'bluetooth_AdapterAUSanity'
PURPOSE = ('Batch of Bluetooth Classic Audio sanity tests')
CRITERIA = 'Pass all sanity test'
ATTRIBUTES = 'suite:bluetooth' # This control file is used to run all tests locally.
TIME = 'SHORT'  # Approximately 4 mins
TEST_CATEGORY = 'Functional'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth, chameleon:bt_peer'

DOC = """
    A Batch of Bluetooth Bluetooth audio sanity tests. This test is written
    as a batch of tests in order to reduce test time, since auto-test ramp
    up time is costly. The batch is using BluetoothAdapterQuickTests wrapper
    methods to start and end a test and a batch of tests.

    This class can be called to run the entire test batch or to run a
    specific test only

    Currently, the batch contains the following tests:
    - au_a2dp_test
    - au_hfp_wbs_dut_as_source_test
    - au_hfp_wbs_dut_as_sink_test
    """

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)
btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, chameleon_args=chameleon_args)
    host.initialize_btpeer(btpeer_args)
    job.run_test('bluetooth_AdapterAUSanity', host=host, num_iterations=1)

parallel_simple(run, machines)
