# Copyright 2020 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'
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,
    'life_cycle_stage': 'owner_monitored',
    'requirements': ['bt-audPath-0001-v01', 'bt-audPath-0002-v01']
}


ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_core'
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:]))

parallel_simple(run, machines)
