# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.server import utils

AUTHOR = 'chromeos-chameleon'
NAME = 'bluetooth_AdapterPairing.le.mouse.pairing_twice'
PURPOSE = 'Test bluetooth adapter pairing and connecting to a bluetooth device.'
CRITERIA = 'Adapter should work in correct states.'
ATTRIBUTES = 'suite:bluetooth'
TIME = 'SHORT'    # This test takes about 2 and half minutes.
TEST_CATEGORY = 'Functional'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth, chameleon:bt_hog'

DOC = """
Verify that the bluetooth adapter of the DUT could pair and connect
to a bluetooth le device.

Specifically, the following subtests are executed in this autotest.
    - test_reset_on_adapter
    - test_pairable
    - test_discover_device
    - test_stop_discovery
    - test_device_name
    - test_device_class_of_service
    - test_device_class_of_device
    - test_pairing
    - test_connection_by_adapter
    - test_disconnection_by_adapter
    - test_connection_by_adapter (N.B. by adapter, Bluefruit can't initiate)
    - test_disconnection_by_adapter (N.B Bluefruit's disconnect isn't clean.)
    - test_remove_pairing
"""

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, chameleon_args=chameleon_args)
    job.run_test('bluetooth_AdapterPairing', host=host, device_type='LE_MOUSE',
                 num_iterations=1, min_pass_count=1, pairing_twice=True)

parallel_simple(run, machines)
