# Copyright 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_AdapterAdvHealth.adv_single_advertising_test'
PURPOSE = 'Test bluetooth adapter advertising.'
CRITERIA = 'Adapter should advertise with correct parameters.'
ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_standalone'
TIME = 'SHORT'  # ~4 minutes on Eve
MAX_RESULT_SIZE_KB = 128000
TEST_CATEGORY = 'Functional'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth'
PY_VERSION = 3

DOC = """
This test case verifies that the Bluetooth adapter of the DUT can
behave as a Bluetooth low-energy device and register a single
advertisement with data and parameters correctly. This test case also
verifies that the single advertisement could be registered and
unregistered continuously.

This autotest include the following test cases:
     self.test_case_SI200_RA1_CD_UA1()
     self.test_case_SI200_RA1_CD_RS()
     self.test_case_RA1_CD_SI200_CD_UA1()
     self.test_case_RA1_CD_SI200_CD_RS()
     self.test_case_RA1_CD_SI200_CD_FSI10_UA1_RA1_CD_UA1()
     self.test_case_RA1_CD_SI200_CD_FSI20000_UA1_RA1_CD_UA1()

Specifically, the subtests included in this autotest verify the
following operations and parameters.
    - test_register_advertisement
      * A single advertisement is registered successfully.
      * The advertising min/max intervals are set correctly.
        . The intervals are set to specified values.
        . The intervals are set to default values after reset.
      * The manufacturer id is set correctly.
      * The service UUIDs are set correctly.
      * The service data is set correctly.
      * Advertising is enabled consequently.
    - test_set_advertising_intervals
      * The new advertising intervals are set correctly.
    - test_reset_advertising
      * The single advertisement instance is removed.
      * Advertising is disabled consequently.

Mnemonics of the test cases:
    CD: check advertising duration and intervals
    RA: register advertisements
    UA: unregister advertisements
    SI: set advertising intervals
    RS: reset advertising
    FRA: fail to register extra advertisements when max ones have
         been registered.
    FSI: fail to set advertising intervals beyond legitimate range
         of [20 ms, 10,240 ms].
    PC: power cycle the bluetooth adapter (controller).
    SR: suspend and resume the DUT (chromebook)

"""

def run(machine):
    host = hosts.create_host(machine)
    job.run_test('bluetooth_AdapterAdvHealth', host=host, num_iterations=1,
                 test_name=NAME.split('.')[1], peer_required=False)

parallel_simple(run, machines)
