# Copyright (c) 2020 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.

AUTHOR = 'chromeos-bluetooth'
NAME = 'bluetooth_AdapterCLHealth.cl_sdp_service_search_request_basic_test'
ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_e2e'
TIME = 'SHORT'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'Server'
DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:1'

DOC = """
Verify the correct behaviour of the device when searching for services.

The tester sends a Service Search Request to the DUT, searching the UUID of
SDP Server Service, which is known to exist.
Tester also searchs for Service Class ID = 0x0001, which should never exist.
In order to verify the correct behaviour of continuation state, some number of
fake Bluetooth services are registered on the device. This is needed to create
a request with a very long response, and to force the SDP server on the device
to use this continuation state functionality.
The tester also sends Service Search Requests with intentionally invalid PDU
size parameter and with generally incorrect syntax to verify that the IUT reacts
correctly in these cases.

This test covers the following Bluetooth SIG test cases:
TP/SERVER/SS/BV-01-C
TP/SERVER/SS/BV-03-C
TP/SERVER/SS/BV-04-C
TP/SERVER/SS/BI-01-C
TP/SERVER/SS/BI-02-C
"""

from autotest_lib.server import utils

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,
                 test_name=NAME.split('.')[1])

parallel_simple(run, machines)
