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

# Verify that the bluetooth adapter of the DUT could receive HID reports
# sent from a connected bluetooth device correctly.
#
# Specifically, the following subtests are executed in this autotest.
#     - test_reset_on_adapter
#     - test_pairable
#     - test_discover_device
#     - test_pairing
#     - test_connection_by_adapter
#     - test_keyboard_input_from_trace
#     - test_disconnection_by_adapter
#     - test_remove_pairing
#
# Purpose: Test bluetooth adapter receiving reports from bluetooth HID devices.

# Deprecated variables:
#     TIME = 'SHORT'  # ~2 minutes on octopus
#     TEST_CATEGORY = 'Functional'

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterCLHealth.cl_HID_keyboard_reports_in_standard_inq_mode_test.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Adapter should receive HID events correctly.',
    'hw_agnostic': False,
    'requirements': ['bt-gen-0001-v01'],
}
ATTRIBUTES = 'suite:bluetooth_floss'
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_AdapterCLHealth',
                 host=host,
                 num_iterations=1,
                 args_dict=args_dict,
                 tag='.'.join(NAME.split('.')[1:]),
                 test_name=NAME.split('.')[1], floss=True)

parallel_simple(run, machines)
