bluetooth_AdapterLEAdvertising: add 16 test cases for multi-advertising

This patch implements a number of test cases to verify bluetooth
low-energy advertising as a peripheral where each test case
comprises a distinct combination and permutation of tests.

Specifically, this autotest includes the following test cases:
    self.run_multiple_advertising_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)

BUG=chromium:602461
TEST=Conduct the autotest as follows:
Test advertising with multiple advertisement instances simultaneously.
(cr) $ test_that --board=$BOARD $DUT_IP bluetooth_AdapterLEAdvertising.multiple

Change-Id: I49c606f624561b6d017cadf5911298285df7834f
Reviewed-on: https://chromium-review.googlesource.com/412911
Commit-Ready: Shyh-In Hwang <josephsih@chromium.org>
Tested-by: Shyh-In Hwang <josephsih@chromium.org>
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
diff --git a/server/cros/bluetooth/advertisements_data.py b/server/cros/bluetooth/advertisements_data.py
new file mode 100644
index 0000000..916df82
--- /dev/null
+++ b/server/cros/bluetooth/advertisements_data.py
@@ -0,0 +1,69 @@
+# 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.
+
+"""A list of advertisements data for testing purpose."""
+
+
+ADVERTISEMENT1 = {
+    'Path': '/org/bluez/test/advertisement1',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff01': [0x1a, 0x1b, 0x1c, 0x1d, 0x1e]},
+    'ServiceUUIDs': ['180D', '180F'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9991': [0x11, 0x12, 0x13, 0x14, 0x15]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENT2 = {
+    'Path': '/org/bluez/test/advertisement2',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff02': [0x2a, 0x2b, 0x2c, 0x2d, 0x2e]},
+    'ServiceUUIDs': ['1821'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9992': [0x21, 0x22, 0x23, 0x24, 0x25]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENT3 = {
+    'Path': '/org/bluez/test/advertisement3',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff03': [0x3a, 0x3b, 0x3c, 0x3d, 0x3e]},
+    'ServiceUUIDs': ['1819', '180E'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9993': [0x31, 0x32, 0x33, 0x34, 0x35]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENT4 = {
+    'Path': '/org/bluez/test/advertisement4',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff04': [0x4a, 0x4b, 0x4c, 0x4d, 0x4e]},
+    'ServiceUUIDs': ['1808', '1810'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9994': [0x41, 0x42, 0x43, 0x44, 0x45]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENT5 = {
+    'Path': '/org/bluez/test/advertisement5',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff05': [0x5a, 0x5b, 0x5c, 0x5d, 0x5e]},
+    'ServiceUUIDs': ['1818', '181B'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9995': [0x51, 0x52, 0x53, 0x54, 0x55]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENT6 = {
+    'Path': '/org/bluez/test/advertisement6',
+    'Type': 'peripheral',
+    'ManufacturerData': {'0xff06': [0x6a, 0x6b, 0x6c, 0x6d, 0x6e]},
+    'ServiceUUIDs': ['1820'],
+    'SolicitUUIDs': [],
+    'ServiceData': {'9996': [0x61, 0x62, 0x63, 0x64, 0x65]},
+    'IncludeTxPower': True}
+
+
+ADVERTISEMENTS = [ADVERTISEMENT1, ADVERTISEMENT2, ADVERTISEMENT3,
+                  ADVERTISEMENT4, ADVERTISEMENT5, ADVERTISEMENT6]
diff --git a/server/cros/bluetooth/bluetooth_adpater_tests.py b/server/cros/bluetooth/bluetooth_adpater_tests.py
index e058838..7a5e369 100644
--- a/server/cros/bluetooth/bluetooth_adpater_tests.py
+++ b/server/cros/bluetooth/bluetooth_adpater_tests.py
@@ -330,6 +330,26 @@
         return decorator
 
 
+def test_case_log(method):
+    """A decorator for test case methods.
+
+    The main purpose of this decorator is to display the test case name
+    in the test log which looks like
+
+        <... test_case_RA3_CD_SI200_CD_PC_CD_UA3 ...>
+
+    @param method: the test case method to decorate.
+
+    @returns: a wrapper function of the decorated method.
+
+    """
+    @functools.wraps(method)
+    def wrapper(instance, *args, **kwargs):
+        logging.info('\n<... %s ...>', method.__name__)
+        method(instance, *args, **kwargs)
+    return wrapper
+
+
 class BluetoothAdapterTests(test.test):
     """Server side bluetooth adapter tests.
 
diff --git a/server/site_tests/bluetooth_AdapterLEAdvertising/bluetooth_AdapterLEAdvertising.py b/server/site_tests/bluetooth_AdapterLEAdvertising/bluetooth_AdapterLEAdvertising.py
index c11f801..a607b41 100644
--- a/server/site_tests/bluetooth_AdapterLEAdvertising/bluetooth_AdapterLEAdvertising.py
+++ b/server/site_tests/bluetooth_AdapterLEAdvertising/bluetooth_AdapterLEAdvertising.py
@@ -2,71 +2,757 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Server side bluetooth tests on adapter advertising."""
+"""Server side bluetooth tests on adapter ble advertising.
+
+The Mnemonics describing 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)
+
+A test represents a component of a test case which comprises a
+sequence of tests. A test case usually requires a tester (user)
+to perform a sequence of actions and make a sequence of
+observations if the test case is performed manually.
+
+A test consists of an optional action such as "register n
+advertisements" and a number of test criteria such as "verifying
+if min advertising interval is set to an expected value" or
+"verifying if advertising is disabled".
+
+"""
+
+import copy
+import logging
+import time
 
 from autotest_lib.client.common_lib import error
 from autotest_lib.server.cros.bluetooth import bluetooth_adpater_tests
 from autotest_lib.server.cros.multimedia import bluetooth_le_facade_adapter
 
 
+test_case_log = bluetooth_adpater_tests.test_case_log
+
+
 class bluetooth_AdapterLEAdvertising(
         bluetooth_adpater_tests.BluetoothAdapterTests):
     """Server side bluetooth adapter advertising Test.
 
-    This class tries to test the adapter could advertise with correct
-    parameters.
+    This class comprises a number of test cases to verify
+    bluetooth low-energy advertising.
 
-    In particular, the following subtests are performed. Look at the
-    docstrings of the subtests for more details.
-    - test_register_advertisement
-    - test_set_advertising_intervals
-    - test_reset_advertising
-
-    Refer to BluetoothAdapterTests for the implementation of the subtests
+    Refer to BluetoothAdapterTests for the implementation of the tests
     performed in this autotest test.
 
-    If the advertisement data in a control file is registered multiple
-    times, the advertising data issued by HCI commands may be omitted
-    by kernel and results in test failure. In this case, reboot the DUT
-    to avoid the test failure.
+    Refer to the design doc for more details:
+    "Test Cases for Bluetooth Low-Energy Advertising".
 
     """
-    def test_registration_and_reset(self, advertisements, min_adv_interval_ms,
-                                    max_adv_interval_ms):
-        """Test advertisements operations with new intervals.
 
-        @param advertisements: a list of advertisement instances.
-        @param min_adv_interval_ms: min_adv_interval in milli-second.
-        @param max_adv_interval_ms: max_adv_interval in milli-second.
+    SUSPEND_TIME = 10
+
+    @staticmethod
+    def get_instance_ids(advertisements):
+        """Get the list of instace IDs starting at 1.
+
+        @param advertisements: a list of advertisements.
 
         """
-        # Create a list of advertisement instance IDs starting at 1.
-        instance_ids = range(1, len(advertisements) + 1)
+        return range(1, len(advertisements) + 1)
 
-        # Test if the specified advertisements could be registered correctly.
+
+    def suspend_resume(self, suspend_time=SUSPEND_TIME):
+        """Suspend the DUT for a while and then resume.
+
+        @param suspend_time: the suspend time in seconds.
+
+        """
+        logging.info('The DUT suspends for %d seconds...', suspend_time)
+        self.host.suspend(suspend_time=suspend_time)
+        logging.info('The DUT is waken up.')
+
+
+    def register_advertisements(self, advertisements, min_adv_interval_ms,
+                                max_adv_interval_ms, instance_ids=None):
+        """Register multiple advertisements continuously.
+
+        @param advertisements: a list of advertisement instances.
+        @param min_adv_interval_ms: min_adv_interval in milliseconds.
+        @param max_adv_interval_ms: max_adv_interval in milliseconds.
+        @param instance_ids: the list of instance IDs to register.
+
+        """
+        if instance_ids is None:
+            instance_ids = self.get_instance_ids(advertisements)
+
         for instance_id, advertisement in zip(instance_ids, advertisements):
             self.test_register_advertisement(advertisement,
                                              instance_id,
                                              min_adv_interval_ms,
                                              max_adv_interval_ms)
 
-        # Test if advertising is reset correctly.
-        self.test_reset_advertising(instance_ids)
+
+    def unregister_advertisements(self, advertisements, min_adv_interval_ms,
+                                  max_adv_interval_ms, instance_ids=None):
+        """Register multiple advertisements.
+
+        @param advertisements: a list of advertisement instances.
+        @param min_adv_interval_ms: min_adv_interval in milliseconds.
+        @param max_adv_interval_ms: max_adv_interval in milliseconds.
+        @param instance_ids: the list of instance IDs to unregister.
+
+        """
+        if instance_ids is None:
+            instance_ids = self.get_instance_ids(advertisements)
+
+        count = 0
+        number_advs = len(advertisements)
+        for instance_id, advertisement in zip(instance_ids, advertisements):
+            # Advertising is only disabled at the removal of the
+            # last advertisement.
+            count += 1
+            advertising_disabled = count == number_advs
+            self.test_unregister_advertisement(advertisement,
+                                               instance_id,
+                                               min_adv_interval_ms,
+                                               max_adv_interval_ms,
+                                               advertising_disabled)
 
 
-    def run_once(self, host, advertisements, multi_advertising,
-                 min_adv_interval_ms, max_adv_interval_ms):
+    # ---------------------------------------------------------------
+    # Definitions of all test cases
+    # ---------------------------------------------------------------
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_UA3(self):
+        """Test Case: SI(200) - RA(3) - CD - UA(3)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_RA1_CD_UA1_CD_UA3(self):
+        """Test Case: SI(200) - RA(3) - CD - RA(1) - CD - UA(1) - CD - UA(3)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        # Make a copy of advertisements since we are going to modify it.
+        advertisements = copy.copy(self.three_advertisements)
+        number_advs = len(advertisements)
+        one_more_advertisement = [self.sixth_advertisement]
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Register one more advertisement.
+        # The instance ID to register is len(advertisements) + 1 = 4
+        self.register_advertisements(one_more_advertisement,
+                                     new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms,
+                                     instance_ids=[number_advs + 1])
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs + 1)
+
+        # Unregister the 3rd advertisement.
+        # After removing the advertisement, the remaining instance IDs
+        # would be [1, 2, 4]
+        instance_id = 3
+        self.test_unregister_advertisement(advertisements.pop(instance_id - 1),
+                                           instance_id,
+                                           new_min_adv_interval_ms,
+                                           new_max_adv_interval_ms,
+                                           advertising_disabled=False)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Unregister all existing advertisements which are [1, 2, 4]
+        # since adv 3 was removed in the previous step.
+        self.unregister_advertisements(advertisements + one_more_advertisement,
+                                       new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms,
+                                       instance_ids=[1, 2, 4])
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_RS(self):
+        """Test Case: SI(200) - RA(3) - CD - RS"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_reset_advertising(self.get_instance_ids(advertisements))
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_UA1_CD_RS(self):
+        """Test Case: SI(200) - RA(3) - CD - UA(1) - CD - RS"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        # Make a copy of advertisements since we are going to modify it.
+        advertisements = copy.copy(self.three_advertisements)
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        # Unregister the 1st advertisement.
+        # After removing the advertisement, the remaining instance IDs
+        # would be [2, 3]
+        instance_id = 1
+        self.test_unregister_advertisement(advertisements.pop(instance_id - 1),
+                                           instance_id,
+                                           new_min_adv_interval_ms,
+                                           new_max_adv_interval_ms,
+                                           advertising_disabled=False)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements) - 1)
+
+        self.test_reset_advertising([2, 3])
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_UA1_CD_RA2_CD_UA4(self):
+        """Test Case: SI(200) - RA(3) - CD - UA(1) - CD - RA(2) - CD - UA(4)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        # Make a copy of three_advertisements since we are going to modify it.
+        advertisements1 = copy.copy(self.three_advertisements)
+        advertisements2 = self.two_advertisements
+        number_advs1 = len(advertisements1)
+        number_advs2 = len(advertisements2)
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements1, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs1)
+
+        # Unregister the 2nd advertisement.
+        # After removing the 2nd advertisement, the remaining instance IDs
+        # would be [1, 3]
+        instance_id = 2
+        self.test_unregister_advertisement(advertisements1.pop(instance_id - 1),
+                                           instance_id,
+                                           new_min_adv_interval_ms,
+                                           new_max_adv_interval_ms,
+                                           advertising_disabled=False)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs1 - 1)
+
+        # Register two more advertisements.
+        # The instance IDs to register would be [2, 4]
+        self.register_advertisements(advertisements2, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms,
+                                     instance_ids=[2, 4])
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs1 + number_advs2 - 1)
+
+        # Unregister all advertisements.
+        # The instance_ids of advertisements1 is [1, 3].
+        # The instance_ids of advertisements2 is [2, 4].
+        self.unregister_advertisements(advertisements1 + advertisements2,
+                                       new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms,
+                                       instance_ids=[1, 3, 2, 4])
+
+
+    @test_case_log
+    def test_case_SI200_RA5_CD_FRA1_CD_UA5(self):
+        """Test Case: SI(200) - RA(5) - CD - FRA(1) - CD - UA(5)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.five_advertisements
+        extra_advertisement = self.sixth_advertisement
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_fail_to_register_advertisement(extra_advertisement,
+                                                 new_min_adv_interval_ms,
+                                                 new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_PC_CD_UA3(self):
+        """Test Case: SI(200) - RA(3) - CD - PC - CD - UA(3)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        # Turn off and then turn on the adapter.
+        self.test_power_off_adapter()
+        time.sleep(1)
+        self.test_power_on_adapter()
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_SI200_RA3_CD_SR_CD_UA3(self):
+        """Test Case: SI(200) - RA(3) - CD - SR - CD - UA(3)"""
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+
+        self.test_reset_advertising()
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.register_advertisements(advertisements, new_min_adv_interval_ms,
+                                     new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        # Suspend for a while and resume.
+        self.suspend_resume()
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               len(advertisements))
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_UA3(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - UA(3)"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_RS(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - RS"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_reset_advertising(self.get_instance_ids(advertisements))
+
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_UA1_CD_RS(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - UA(1) - CD - RS"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Unregister the 2nd advertisement.
+        instance_id = 2
+        self.test_unregister_advertisement(advertisements[instance_id - 1],
+                                           instance_id,
+                                           new_min_adv_interval_ms,
+                                           new_max_adv_interval_ms,
+                                           advertising_disabled=False)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs - 1)
+
+        # Test if advertising is reset correctly.Only instances [1, 3] are left.
+        self.test_reset_advertising([1, 3])
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_SI2000_CD_UA3(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - SI(2000) - CD - UA(3)"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_small_min_adv_interval_ms = 200
+        new_small_max_adv_interval_ms = 200
+        new_large_min_adv_interval_ms = 2000
+        new_large_max_adv_interval_ms = 2000
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_small_min_adv_interval_ms,
+                                            new_small_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_small_min_adv_interval_ms,
+                                               new_small_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_large_min_adv_interval_ms,
+                                            new_large_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_large_min_adv_interval_ms,
+                                               new_large_max_adv_interval_ms,
+                                               number_advs)
+
+        self.unregister_advertisements(advertisements,
+                                       new_large_min_adv_interval_ms,
+                                       new_large_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA5_CD_SI200_CD_FRA1_CD_UA5(self):
+        """Test Case: RA(5) - CD - SI(200) - CD - FRA(1) - CD - UA(5)"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.five_advertisements
+        extra_advertisement = self.sixth_advertisement
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_fail_to_register_advertisement(extra_advertisement,
+                                                 new_min_adv_interval_ms,
+                                                 new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_FSI10_CD_FSI20000_CD_UA3(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - FSI(10) - CD - FSI(20000) - CD
+        - UA(3)
+        """
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        invalid_small_min_adv_interval_ms = 10
+        invalid_small_max_adv_interval_ms = 10
+        invalid_large_min_adv_interval_ms = 20000
+        invalid_large_max_adv_interval_ms = 20000
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Fails to set intervals that are too small. Intervals remain the same.
+        self.test_fail_to_set_advertising_intervals(
+                invalid_small_min_adv_interval_ms,
+                invalid_small_max_adv_interval_ms,
+                new_min_adv_interval_ms, new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Fails to set intervals that are too large. Intervals remain the same.
+        self.test_fail_to_set_advertising_intervals(
+                invalid_large_min_adv_interval_ms,
+                invalid_large_max_adv_interval_ms,
+                new_min_adv_interval_ms, new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Unregister all advertisements.
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_PC_CD_UA3(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - PC - CD - UA(3)"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Turn off and then turn on the adapter.
+        self.test_power_off_adapter()
+        time.sleep(1)
+        self.test_power_on_adapter()
+
+        # Check if the advertising durations remain the same after resume.
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Unregister all advertisements.
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    @test_case_log
+    def test_case_RA3_CD_SI200_CD_SR_CD_UA3(self):
+        """Test Case: RA(3) - CD - SI(200) - CD - SR - CD - UA(3)"""
+        orig_min_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        orig_max_adv_interval_ms = self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS
+        new_min_adv_interval_ms = 200
+        new_max_adv_interval_ms = 200
+        advertisements = self.three_advertisements
+        number_advs = len(advertisements)
+
+        self.test_reset_advertising()
+
+        self.register_advertisements(advertisements, orig_min_adv_interval_ms,
+                                     orig_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(orig_min_adv_interval_ms,
+                                               orig_max_adv_interval_ms,
+                                               number_advs)
+
+        self.test_set_advertising_intervals(new_min_adv_interval_ms,
+                                            new_max_adv_interval_ms)
+
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Suspend for a while and resume.
+        self.suspend_resume()
+
+        # Check if the advertising durations remain the same after resume.
+        self.test_check_duration_and_intervals(new_min_adv_interval_ms,
+                                               new_max_adv_interval_ms,
+                                               number_advs)
+
+        # Unregister all advertisements.
+        self.unregister_advertisements(advertisements, new_min_adv_interval_ms,
+                                       new_max_adv_interval_ms)
+
+
+    def run_once(self, host, advertisements, multi_advertising):
         """Running Bluetooth adapter LE advertising autotest.
 
         @param host: device under test host.
         @param advertisements: a list of advertisement instances.
         @param multi_advertising: indicating if this is multi-advertising.
-        @param min_adv_interval_ms: min_adv_interval in milli-second.
-        @param max_adv_interval_ms: max_adv_interval in milli-second.
 
         """
         self.host = host
         self.advertisements = advertisements
+        self.five_advertisements = advertisements[0:5]
+        self.three_advertisements = advertisements[0:3]
+        self.two_advertisements = advertisements[3:5]
+        self.sixth_advertisement = advertisements[5]
+
         ble_adapter = bluetooth_le_facade_adapter.BluetoothLEFacadeRemoteAdapter
         self.bluetooth_le_facade = ble_adapter(self.host)
         self.bluetooth_facade = self.bluetooth_le_facade
@@ -74,41 +760,34 @@
         # Reset the adapter to forget previous stored data and turn it on.
         self.test_reset_on_adapter()
 
-        # Test if new advertising intervals could be set correctly.
-        self.test_set_advertising_intervals(min_adv_interval_ms,
-                                            max_adv_interval_ms)
-
         if multi_advertising:
-            # For multiple advertisements, test all instances with the specified
-            # advertising intervals.
-            self.test_registration_and_reset(
-                    advertisements,
-                    min_adv_interval_ms,
-                    max_adv_interval_ms)
-
-            # Test all instances with default advertising intervals.
-            self.test_registration_and_reset(
-                    advertisements,
-                    self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS,
-                    self.DAFAULT_MAX_ADVERTISEMENT_INTERVAL_MS)
+            # Run all test cases for multiple advertisements.
+            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()
 
         else:
-            # For single advertisement, test the 1st advertisement with the
-            # specified advertising intervals.
-            self.test_registration_and_reset(
-                    advertisements[0:1],
-                    min_adv_interval_ms,
-                    max_adv_interval_ms)
+            # Run all test cases for single advertisement.
+            # TODO(josephsih): add test cases for single-advertising.
 
-            # Test the 2nd advertisement with default advertising intervals.
             # Note: it is required to change the advertisement instance
             #       so that the advertisement data could be monitored by btmon.
             #       Otherwise, the advertisement data would be just cached and
             #       reused such that the data would not be visible in btmon.
-            self.test_registration_and_reset(
-                    advertisements[1:2],
-                    self.DAFAULT_MIN_ADVERTISEMENT_INTERVAL_MS,
-                    self.DAFAULT_MAX_ADVERTISEMENT_INTERVAL_MS)
+            pass
 
         if self.fails:
             raise error.TestFail(self.fails)
diff --git a/server/site_tests/bluetooth_AdapterLEAdvertising/control.multiple b/server/site_tests/bluetooth_AdapterLEAdvertising/control.multiple
index 8a019bd..344153d 100644
--- a/server/site_tests/bluetooth_AdapterLEAdvertising/control.multiple
+++ b/server/site_tests/bluetooth_AdapterLEAdvertising/control.multiple
@@ -3,13 +3,15 @@
 # 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'
+TIME = 'SHORT'  # It takes about 15 minutes on a Samus.
 TEST_CATEGORY = 'Functional'
 TEST_CLASS = 'bluetooth'
 TEST_TYPE = 'server'
@@ -22,9 +24,41 @@
 verifies that advertisements could be registered and unregistered
 continuously.
 
-Specifically, the subtests included in this autotest verify the
-following operations and parameters.
-    - test_register_advertisement
+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.
@@ -33,55 +67,35 @@
       * The service UUIDs are set correctly.
       * The service data is set correctly.
       * Advertising is enabled consequently.
-    - test_set_advertising_intervals
+    test_set_advertising_intervals
       * The new advertising intervals are set correctly.
-    - test_reset_advertising
+    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.
 """
 
 
-ADVERTISEMENT1 = {
-    'Path': '/org/bluez/test/advertisement1',
-    'Type': 'peripheral',
-    'ManufacturerData': {'0xff01': [0x1a, 0x1b, 0x1c, 0x1d, 0x1e]},
-    'ServiceUUIDs': ['180D', '180F'],
-    'SolicitUUIDs': [],
-    'ServiceData': {'9991': [0x11, 0x12, 0x13, 0x14, 0x15]},
-    'IncludeTxPower': True}
-
-ADVERTISEMENT2 = {
-    'Path': '/org/bluez/test/advertisement2',
-    'Type': 'peripheral',
-    'ManufacturerData': {'0xff02': [0x2a, 0x2b, 0x2c, 0x2d, 0x2e]},
-    'ServiceUUIDs': ['1821'],
-    'SolicitUUIDs': [],
-    'ServiceData': {'9992': [0x21, 0x22, 0x23, 0x24, 0x25]},
-    'IncludeTxPower': True}
-
-ADVERTISEMENT3 = {
-    'Path': '/org/bluez/test/advertisement3',
-    'Type': 'peripheral',
-    'ManufacturerData': {'0xff03': [0x3a, 0x3b, 0x3c, 0x3d, 0x3e]},
-    'ServiceUUIDs': ['1819', '180E'],
-    'SolicitUUIDs': [],
-    'ServiceData': {'9993': [0x31, 0x32, 0x33, 0x34, 0x35]},
-    'IncludeTxPower': True}
-
-ADVERTISEMENTS = [ADVERTISEMENT1, ADVERTISEMENT2, ADVERTISEMENT3]
-
-
-MIN_ADV_INTERVAL_MS = 200
-MAX_ADV_INTERVAL_MS = 200
-
-
 args_dict = utils.args_to_dict(args)
 
 def run(machine):
     host = hosts.create_host(machine)
-    job.run_test('bluetooth_AdapterLEAdvertising', host=host,
-                 advertisements=ADVERTISEMENTS, multi_advertising=True,
-                 min_adv_interval_ms=MIN_ADV_INTERVAL_MS,
-                 max_adv_interval_ms=MAX_ADV_INTERVAL_MS)
+    job.run_test('bluetooth_AdapterLEAdvertising',
+                 host=host,
+                 advertisements=advertisements_data.ADVERTISEMENTS,
+                 multi_advertising=True)
 
 parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLEAdvertising/control.single b/server/site_tests/bluetooth_AdapterLEAdvertising/control.single
index 224ff9f..9ff2e54 100644
--- a/server/site_tests/bluetooth_AdapterLEAdvertising/control.single
+++ b/server/site_tests/bluetooth_AdapterLEAdvertising/control.single
@@ -3,12 +3,14 @@
 # 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.single'
 PURPOSE = 'Test bluetooth adapter advertising.'
 CRITERIA = 'Adapter should advertise with correct parameters.'
-ATTRIBUTES = 'suite:bluetooth, suite:bluetooth_sanity'
+ATTRIBUTES = 'suite:bluetooth'
 TIME = 'SHORT'
 TEST_CATEGORY = 'Functional'
 TEST_CLASS = 'bluetooth'
@@ -41,27 +43,6 @@
 """
 
 
-ADVERTISEMENT1 = {
-    'Path': '/org/bluez/test/advertisement1',
-    'Type': 'peripheral',
-    'ManufacturerData': {'0xff01': [0x1a, 0x1b, 0x1c, 0x1d, 0x1e]},
-    'ServiceUUIDs': ['180D', '180F'],
-    'SolicitUUIDs': [],
-    'ServiceData': {'9991': [0x11, 0x12, 0x13, 0x14, 0x15]},
-    'IncludeTxPower': True}
-
-ADVERTISEMENT2 = {
-    'Path': '/org/bluez/test/advertisement2',
-    'Type': 'peripheral',
-    'ManufacturerData': {'0xff02': [0x2a, 0x2b, 0x2c, 0x2d, 0x2e]},
-    'ServiceUUIDs': ['1821'],
-    'SolicitUUIDs': [],
-    'ServiceData': {'9992': [0x21, 0x22, 0x23, 0x24, 0x25]},
-    'IncludeTxPower': True}
-
-ADVERTISEMENTS = [ADVERTISEMENT1, ADVERTISEMENT2]
-
-
 MIN_ADV_INTERVAL_MS = 300
 MAX_ADV_INTERVAL_MS = 400
 
@@ -71,7 +52,8 @@
 def run(machine):
     host = hosts.create_host(machine)
     job.run_test('bluetooth_AdapterLEAdvertising', host=host,
-                 advertisements=ADVERTISEMENTS, multi_advertising=False,
+                 advertisements=advertisements_data.ADVERTISEMENTS,
+                 multi_advertising=False,
                  min_adv_interval_ms=MIN_ADV_INTERVAL_MS,
                  max_adv_interval_ms=MAX_ADV_INTERVAL_MS)