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

# Verify the correct behaviour of the device when executing Service Search
# Attribute transaction.

# The tester sends a Service Search Attribute Request to the DUT, checking:
# * non-existing Service, existing Attribute
# * existing Service, non-existing Attribute
# * non-existing Service, non-existing Attribute
# * existing Service, existing Attribute
# * various specific attributes, listed in Test Specification
# * correctness of continuation state behavior
# * responses to invalid requests

# This test covers the following Bluetooth SIG test cases:
# TP/SERVER/SSA/BV-01-C
# TP/SERVER/SSA/BV-02-C
# TP/SERVER/SSA/BV-03-C
# TP/SERVER/SSA/BV-06-C
# TP/SERVER/SSA/BV-11-C
# TP/SERVER/SSA/BV-12-C
# TP/SERVER/SSA/BV-23-C

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterCLHealth.cl_sdp_service_search_attribute_request_test.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Test SDP service search attribute request',
    '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)
