# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Tests link layer topology with two peer devices,
# connects DUT as central and peripheral,
# order of connection is peripheral-central
#
# Purpose: Batch of Bluetooth LLT health tests

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

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterLLTHealth.llt_1c1p_connect_pc'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Pass all health test',
    'hw_agnostic': False,
    'life_cycle_stage': 'owner_monitored',
    'requirements': ['bt-spec-0014-v01']
}


ATTRIBUTES = '' # TODO(b/186266241)
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL, working_bluetooth_btpeer:2'


args_dict = utils.args_to_dict(args)

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

parallel_simple(run, machines)
