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

from autotest_lib.server import utils

AUTHOR = 'chromeos-bluetooth'
NAME = 'bluetooth_AdapterSASanity.sa_multiple_advertising_test'
PURPOSE = 'Test bluetooth adapter advertising.'
CRITERIA = 'Adapter should advertise with correct parameters.'
ATTRIBUTES = 'suite:bluetooth_flaky'
TIME = 'SHORT'  # It takes about 15 minutes on a Samus.
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.
"""


args_dict = utils.args_to_dict(args)

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

parallel_simple(run, machines)
