# 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_AdapterAdvSanity.adv_multiple_advertising_test'
PURPOSE = 'Test bluetooth adapter advertising.'
CRITERIA = 'Adapter should advertise with correct parameters.'
ATTRIBUTES = 'suite:bluetooth_flaky'
TIME = 'LONG'  # It takes about 15 minutes on Eve.
MAX_RESULT_SIZE_KB = 512000
TEST_CATEGORY = 'Functional'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth'

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

Specifically, this autotest include the following test cases:
    self.test_case_SI200_RA3_CD_UA3()
    self.test_case_SI200_RA3_CD_RA1_CD_UA1_CD_UA3()
    self.test_case_SI200_RA3_CD_RS()
    self.test_case_SI200_RA3_CD_UA1_CD_RS()
    self.test_case_SI200_RA3_CD_UA1_CD_RA2_CD_UA4()
    self.test_case_SI200_RA5_CD_FRA1_CD_UA5()
    self.test_case_RA3_CD_SI200_CD_UA3()
    self.test_case_RA3_CD_SI200_CD_RS()
    self.test_case_RA3_CD_SI200_CD_UA1_CD_RS()
    self.test_case_RA3_CD_SI200_CD_SI2000_CD_UA3()
    self.test_case_RA5_CD_SI200_CD_FRA1_CD_UA5()
    self.test_case_RA3_CD_SI200_CD_FSI10_CD_FSI20000_CD_UA3()


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)


Every test case consists of a sequence of tests:
    test_register_advertisement
      * All advertisements are 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
      * All advertisement instances are removed.
      * Advertising is disabled consequently.
    test_check_duration_and_intervals
      * The duration is correct.
      * The new advertising intervals are set correctly.
    test_fail_to_register_advertisement
      * Max advertisements reached error.
      * Extra advertisement is not added.
      * The advertising min/max intervals remain the same.
      * Advertising remains enabled.
    test_unregister_advertisement
      * The advertisement is removed.
      * Advertising is disabled when the last one is removed.
    test_fail_to_set_advertising_intervals
      * It incurs invalid interval error.
      * The advertising min/max intervals remain the same.
"""

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

parallel_simple(run, machines)
