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

# The test runs a set of basic stand alone tests, including:
# - test_bluetoothd_running
# - test_power_on_adapter
# - test_power_off_adapter
# - test_power_on_adapter
# - test_adapter_work_state
# - test_stop_bluetoothd
# - test_start_bluetoothd
# - test_adapter_work_state
# - test_reset_off_adapter
# - test_reset_on_adapter
# - test_adapter_work_state
# - test_UUIDs
# - test_start_discovery
# - test_stop_discovery
# - test_start_discovery
# - test_discoverable
# - test_nondiscoverable
# - test_discoverable
# - test_pairable
# - test_nonpairable
# - test_pairable
#
# Purpose: Runs a set of basic stand alone tests

# Deprecated variables:
#     TIME = 'MEDIUM'
#     TEST_CATEGORY = 'Functional'

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterSAHealth.sa_basic_test.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Pass all health test',
    'hw_agnostic': False,
    'requirements': ['bt-gen-0001-v01'],
}


ATTRIBUTES = 'suite:bluetooth_floss_sa,suite:bluetooth_floss_cq'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL'


args_dict = utils.args_to_dict(args)

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

parallel_simple(run, machines)
