# 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_source_visqol_test
#
# Purpose: Batch of Bluetooth Classic Audio health tests

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

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterAUHealth.au_hfp_nbs_dut_as_source_visqol_test.force_offload'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': (
    'All test files pass minimum score required for HFP NBS VISQOL 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:]),
                 hfp_force_offload=True)

parallel_simple(run, machines)
