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

# Tests Receiver role during HID Use
#
#       This test verifies that the Receiver role can be performed while a HID
#       device is already connected.
#
#
# Purpose: Tests controller can handle Receiver role while already connected to
# a HID device

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

from autotest_lib.server import utils

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


ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_core'
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_AdapterLEHealth', host=host,
                 num_iterations=1, args_dict=args_dict,
                 test_name=NAME.split('.')[1], tag='.'.join(NAME.split('.')[1:]))

parallel_simple(run, machines)
