# 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.

# A Batch of Bluetooth Bluetooth audio health 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
#
# This contains the following tests:
# - au_hfp_nbs_dut_as_sink_test
#
# Purpose: Batch of Bluetooth Classic Audio health tests

# Deprecated variables:
#     TIME = 'SHORT'  # Approximately 2 mins
#     TEST_CATEGORY = 'Functional'

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterAUHealth.au_hfp_nbs_dut_as_sink_test.force_offload.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Pass the HFP NBS test',
    'hw_agnostic': False,
    'requirements': ['bt-audPath-0001-v01', 'bt-audPath-0002-v01']
}


# TODO(b/336088266): schedule this test within the supporting boards via project 3d.
ATTRIBUTES = ''
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL, working_bluetooth_btpeer:1'


args_dict = utils.args_to_dict(args)

def run(machine):
    host = hosts.create_host(machine)
    job.run_test('bluetooth_AdapterAUHealth', host=host, num_iterations=1,
                 args_dict=args_dict, test_name=NAME.split('.')[1], tag='.'.join(NAME.split('.')[1:]), floss=True, hfp_force_offload=True)

parallel_simple(run, machines)
