# Copyright 2016 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
from autotest_lib.server.cros.bluetooth import advertisements_data


AUTHOR = 'chromeos-chameleon'
NAME = 'bluetooth_AdapterLEAdvertising.multiple'
PURPOSE = 'Test bluetooth adapter advertising.'
CRITERIA = 'Adapter should advertise with correct parameters.'
ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_sanity'
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_PC_CD_UA3()
    self.test_case_SI200_RA3_CD_SR_CD_UA3()
    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()
    self.test_case_RA3_CD_SI200_CD_PC_CD_UA3()
    self.test_case_RA3_CD_SI200_CD_SR_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_AdapterLEAdvertising',
                 host=host,
                 advertisements=advertisements_data.ADVERTISEMENTS,
                 multi_advertising=True)

parallel_simple(run, machines)
