bluetooth: Added LLT health test cases

these test cases will test link layer topology
by connecting DUT to multiple devices
as both Central and Peripheral and
will transfer data over the connections

BUG=None
TEST=Tested

Change-Id: I8b145ced0fef9136bd8a488bcbaaef85e332612b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2484633
Reviewed-by: Daniel Winkler <danielwinkler@google.com>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Barath Petit <barath.petit@intel.corp-partner.google.com>
Tested-by: Nishanth Shetty C <nishanth.shetty.c@intel.com>
Tested-by: Barath Petit <barath.petit@intel.corp-partner.google.com>
Commit-Queue: Daniel Winkler <danielwinkler@google.com>
diff --git a/server/cros/bluetooth/bluetooth_adapter_better_together.py b/server/cros/bluetooth/bluetooth_adapter_better_together.py
index 5ca6011..44abb94 100644
--- a/server/cros/bluetooth/bluetooth_adapter_better_together.py
+++ b/server/cros/bluetooth/bluetooth_adapter_better_together.py
@@ -167,6 +167,29 @@
     return True
 
 
+  def test_smart_unlock_llt(self, address):
+    """Smart unlock flow for llt cases """
+    filter = {'Transport': 'le'}
+    parameters = {'MinimumConnectionInterval': 6,
+                  'MaximumConnectionInterval': 6}
+
+    self.test_set_discovery_filter(filter)
+    self.test_discover_device(address)
+
+    self.test_set_le_connection_parameters(address, parameters)
+    self.test_connection_by_adapter(address)
+
+    self.test_set_trusted(address)
+    self.test_service_resolved(address)
+    self.test_find_object_path(address)
+
+    self.test_start_notify(self.rx_object_path,
+                           self.CCCD_VALUE_INDICATION)
+    self.test_messages_exchange(
+        self.rx_object_path, self.tx_object_path, address)
+    self.test_stop_notify(self.rx_object_path)
+
+
   @test_retry_and_log(False)
   def test_remove_device_object(self, address):
     """Test the device object can be removed from the adapter"""
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/__init__.py b/server/site_tests/bluetooth_AdapterLLTHealth/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/__init__.py
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/bluetooth_AdapterLLTHealth.py b/server/site_tests/bluetooth_AdapterLLTHealth/bluetooth_AdapterLLTHealth.py
new file mode 100644
index 0000000..71bb9a5
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/bluetooth_AdapterLLTHealth.py
@@ -0,0 +1,618 @@
+# Copyright 2021 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 Batch of Bluetooth LE LLT health tests"""
+
+from autotest_lib.server.cros.bluetooth import advertisements_data
+
+DEFAULT_MIN_ADV_INTERVAL = 200
+DEFAULT_MAX_ADV_INTERVAL = 500
+
+from autotest_lib.server.cros.bluetooth.\
+     bluetooth_adapter_controller_role_tests \
+     import bluetooth_AdapterControllerRoleTests
+from autotest_lib.server.cros.bluetooth.bluetooth_adapter_quick_tests \
+     import BluetoothAdapterQuickTests
+from autotest_lib.server.cros.bluetooth.bluetooth_adapter_hidreports_tests \
+     import BluetoothAdapterHIDReportTests
+from autotest_lib.server.cros.bluetooth.bluetooth_adapter_better_together \
+     import BluetoothAdapterBetterTogether
+
+
+class bluetooth_AdapterLLTHealth(BluetoothAdapterHIDReportTests,
+                                 bluetooth_AdapterControllerRoleTests,
+                                 BluetoothAdapterBetterTogether):
+    """A Batch of Bluetooth LE LLT health tests. This test is written
+       as a batch of tests in order to reduce test time, since auto-test
+       ramp up time is costly. The batch is using BluetoothAdapterQuickTests
+       wrapper methods to start and end a test and a batch of tests.
+
+       This class can be called to run the entire test batch or to run a
+       specific test only
+    """
+
+    test_wrapper = BluetoothAdapterQuickTests.quick_test_test_decorator
+    batch_wrapper = BluetoothAdapterQuickTests.quick_test_batch_decorator
+
+
+    def discover_and_pair(self, device):
+        """Discovers and pairs given device. Automatically connects too.
+
+           @param device: meta object for bt peer device
+        """
+        self.test_discover_device(device.address)
+        self.test_pairing(device.address, device.pin, trusted=True)
+        self.test_connection_by_adapter(device.address)
+
+
+    def start_connectable_advertisement(self):
+        """ Initiate connectable advertising from DUT """
+        # Register and start advertising instance
+        # We ignore failure because the test isn't able to verify
+        # the min/max advertising intervals, but this is ok.
+        self.test_reset_advertising()
+        self.test_set_advertising_intervals(DEFAULT_MIN_ADV_INTERVAL,
+                                            DEFAULT_MAX_ADV_INTERVAL)
+        self.test_register_advertisement(advertisements_data.ADVERTISEMENTS[0],
+                                         1, DEFAULT_MIN_ADV_INTERVAL,
+                                         DEFAULT_MAX_ADV_INTERVAL)
+
+
+    def pair_and_test_central(self, peripheral):
+        """Connects DUT as central to a peripheral device.
+
+           @param peripheral: meta object for bt peer device
+        """
+        # Pair the central device first -
+        # necessary for later connection to peripheral
+        self.pair_adapter_to_device(peripheral)
+        self.test_device_set_discoverable(peripheral, False)
+
+        self.start_connectable_advertisement()
+        # Discover DUT from peer
+        self.test_discover_by_device(peripheral)
+        # Connect to DUT from peer, putting DUT in peripheral role
+        self.test_connection_by_device(peripheral)
+        self.test_reset_advertising()
+
+
+    @test_wrapper('LLT: 1 Central 1 Peripheral. Order of connection CP',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1
+                  })
+    def llt_1c1p_connect_cp(self):
+        """Tests llt with two peer devices.
+           Connects DUT as central to first device
+           and as peripheral to second device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+        # Establish connection from DUT as LE Central
+        self.discover_and_pair(central)
+
+        self.test_hid_device_created(central.address)
+        # Verify data transfer over the DUT LE central Connection
+        self.test_mouse_left_click(central)
+
+        # Now establish second connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Verify data over LE Central connection again
+        self.test_mouse_left_click(central)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central.address)
+        self.test_disconnection_by_device(peripheral)
+
+
+    @test_wrapper('LLT: 1 Central 1 Peripheral. Order of connection PC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1
+                  })
+    def llt_1c1p_connect_pc(self):
+        """Tests llt with two peer devices,
+           Connects DUT as peripheral to first device
+           and as central to second device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+        # Establish the first connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Establish  second connection from DUT as LE Central
+        self.discover_and_pair(central)
+        self.test_hid_device_created(central.address)
+        # Verify data transfer over the DUT LE Central Connection
+        self.test_mouse_left_click(central)
+        # Verfiy LE peripheral connection again
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central.address)
+        self.test_disconnection_by_device(peripheral)
+
+
+    @test_wrapper('LLT: 1 Central 1 Peripheral while DUT advertising.'
+                  'Order of connection PC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1
+                  })
+    def llt_1c1p_connect_pc_while_adv(self):
+        """Tests llt with two peer devices, while DUT advertising.
+           Connects DUT while advertising
+           as peripheral to first device
+           and as central to second device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+        # Establish the first connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Establish second connection from DUT as LE Central
+        # while advertising in progress
+        self.start_connectable_advertisement()
+        self.discover_and_pair(central)
+        self.test_hid_device_created(central.address)
+
+        # Verify data transfer over the DUT LE Central Connection
+        self.test_mouse_left_click(central)
+        # Verfiy LE Peripheral connection again
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central.address)
+        self.test_disconnection_by_device(peripheral)
+        self.test_reset_advertising()
+
+
+    @test_wrapper('LLT: 2 Central 1 Peripheral. Order of connection CCP',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2c1p_connect_ccp(self):
+        """Tests llt with three peer devices.
+           Connects DUT as central to first and second devices,
+           connects DUT as peripheral to third device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central_1 = self.devices['BLE_PHONE'][0]
+        central_2 = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+        # Establish two connections from DUT as LE Central
+        self.discover_and_pair(central_2)
+        self.test_hid_device_created(central_2.address)
+
+        # Verify data transfer over two DUT LE Central Connections
+        self.test_mouse_left_click(central_2)
+
+        central_1.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_1.address)
+
+        # Establish third connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Verify data transfer over two DUT LE Central Connections
+        self.test_mouse_left_click(central_2)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_1.address)
+        self.test_disconnection_by_adapter(central_2.address)
+        self.test_disconnection_by_device(peripheral)
+
+
+    @test_wrapper('LLT: 2 Central 1 Peripheral. Order of connection PCC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2c1p_connect_pcc(self):
+        """Tests llt with three peer devices.
+           Connects DUT as peripheral to first device
+           and as central to second and third device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central_1 = self.devices['BLE_PHONE'][0]
+        central_2 = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+
+        # Establish the first connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Establish connections from DUT as LE Central
+        self.discover_and_pair(central_2)
+        self.test_hid_device_created(central_2.address)
+
+        # Verify data transfer over two DUT LE Central Connections
+        self.test_mouse_left_click(central_2)
+
+        # Establish third connection
+        central_1.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_1.address)
+
+        # Verify once again data transfer over DUT LE Peripheral connection
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_1.address)
+        self.test_disconnection_by_adapter(central_2.address)
+        self.test_disconnection_by_device(peripheral)
+
+
+    @test_wrapper('LLT: 2 Central 1 Peripheral. Order of connection CPC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2c1p_connect_cpc(self):
+        """Tests llt with three peer devices.
+           Connects DUT as central to first device,
+           as peripheral to second and as central to third device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central_1 = self.devices['BLE_PHONE'][0]
+        central_2 = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+
+        # Establish the first connection with DUT as LE Central
+        central_1.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_1.address)
+
+        # Establish the second connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Establish third connections from DUT as LE Central
+        self.discover_and_pair(central_2)
+        self.test_hid_device_created(central_2.address)
+
+        # Verify data transfer over second LE Central Connections
+        self.test_mouse_left_click(central_2)
+        # Verify once again data transfer over DUT LE Peripheral connection
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_1.address)
+        self.test_disconnection_by_adapter(central_2.address)
+        self.test_disconnection_by_device(peripheral)
+
+
+    @test_wrapper('LLT: 2 Central 1 Peripheral while DUT advertising.'
+                  'Order of connection PCC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2c1p_connect_pcc_while_adv(self):
+        """Tests llt with three peer devices.
+           Connects DUT as peripheral to first device
+           and as central to second and third device while advertising,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central_1 = self.devices['BLE_MOUSE'][0]
+        central_2 = self.devices['BLE_PHONE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+
+        # Establish the first connection with DUT as LE Peripheral
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Connect as first LE Central while DUT is advertising
+        self.start_connectable_advertisement()
+        self.discover_and_pair(central_1)
+        self.test_hid_device_created(central_1.address)
+
+        # Establish second LE connection from DUT as LE Central
+        central_2.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_2.address)
+
+        # Verify data transfer over first LE Central Connections
+        self.test_mouse_left_click(central_1)
+        # Verify once again data transfer over DUT LE Peripheral connection
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_1.address)
+        self.test_disconnection_by_adapter(central_2.address)
+        self.test_disconnection_by_device(peripheral)
+        self.test_reset_advertising()
+
+
+    @test_wrapper('LLT: 2 Central 1 Peripheral while DUT Advertising.'
+                  'Order of connection CPC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2c1p_connect_cpc_while_adv(self):
+        """Tests llt with three peer devices.
+           Connects DUT while advertising as central to first device,
+           as peripheral to second and as central to third device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        central_1 = self.devices['BLE_PHONE'][0]
+        central_2 = self.devices['BLE_MOUSE'][0]
+        peripheral = self.devices['BLE_KEYBOARD'][0]
+
+        self.bluetooth_le_facade = self.bluetooth_facade
+        # Establish the first connection with DUT as LE Central
+        # while advertising in progress
+        self.start_connectable_advertisement()
+        central_1.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_1.address)
+
+        # Establish the second connection with DUT as LE Peripheral
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral)
+        self.run_keyboard_tests(peripheral)
+
+        # Establish third connections from DUT as LE Central
+        self.discover_and_pair(central_2)
+        self.test_hid_device_created(central_2.address)
+
+        # Verify data transfer over second LE Central Connections
+        self.test_mouse_left_click(central_2)
+        # Verify once again data transfer over DUT LE Peripheral connection
+        self.run_keyboard_tests(peripheral)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_1.address)
+        self.test_disconnection_by_adapter(central_2.address)
+        self.test_disconnection_by_device(peripheral)
+        self.test_reset_advertising()
+
+
+    @test_wrapper('LLT: 1 Central 2 Peripheral. Order of connection CPP',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2p1c_connect_cpp(self):
+        """Tests llt with three peer devices.
+           Connects DUT as central to first device
+           and as peripheral to second and third devices,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        peripheral_1 = self.devices['BLE_KEYBOARD'][0]
+        central_peer = self.devices['BLE_PHONE'][0]
+        peripheral_2 = self.devices['BLE_MOUSE'][0]
+
+        # Establish connection from DUT as LE Central
+        central_peer.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_peer.address)
+
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral_1)
+        self.run_keyboard_tests(peripheral_1)
+
+        # Establish and Verify second LE peripheral connection
+        self.pair_and_test_central(peripheral_2)
+
+        # Try transferring data over connection
+        self.test_mouse_left_click(peripheral_2)
+        # Verify traffic from LE Peripheral connections again
+        self.run_keyboard_tests(peripheral_1)
+        self.test_mouse_left_click(peripheral_2)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_peer.address)
+        self.test_disconnection_by_device(peripheral_1)
+        self.test_disconnection_by_device(peripheral_2)
+
+
+    @test_wrapper('LLT: 1 Central 2 Peripheral. Order of connection PCP',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2p1c_connect_pcp(self):
+        """Tests llt with three peer devices.
+           Connects DUT as peripheral to first device,
+           as central to second and as peripheral to third devices,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        peripheral_1 = self.devices['BLE_KEYBOARD'][0]
+        central_peer = self.devices['BLE_PHONE'][0]
+        peripheral_2 = self.devices['BLE_MOUSE'][0]
+
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral_1)
+        self.run_keyboard_tests(peripheral_1)
+
+        # Establish connection from DUT as LE Central
+        central_peer.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_peer.address)
+
+        # Establish and Verify second LE peripheral connection
+        self.pair_and_test_central(peripheral_2)
+
+        # Try transferring data over connection
+        self.test_mouse_left_click(peripheral_2)
+        # Verify traffic from LE Peripheral connections again
+        self.run_keyboard_tests(peripheral_1)
+        self.test_mouse_left_click(peripheral_2)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_peer.address)
+        self.test_disconnection_by_device(peripheral_1)
+        self.test_disconnection_by_device(peripheral_2)
+
+
+    @test_wrapper('LLT: 1 Central 2 Peripheral. Order of connection PPC',
+                  devices={
+                          'BLE_KEYBOARD': 1,
+                          'BLE_MOUSE': 1,
+                          'BLE_PHONE': 1
+                  })
+    def llt_2p1c_connect_ppc(self):
+        """Tests llt with three peer devices.
+           Connects DUT as peripheral to first and second devices
+           and as central to third device,
+           sends small amount of data over the connection
+        """
+
+        self.verify_controller_capability(
+                        required_roles=['central-peripheral'])
+
+        peripheral_1 = self.devices['BLE_KEYBOARD'][0]
+        central_peer = self.devices['BLE_PHONE'][0]
+        peripheral_2 = self.devices['BLE_MOUSE'][0]
+
+        self.bluetooth_le_facade = self.bluetooth_facade
+
+        # Connect to DUT from peer, putting DUT in peripheral role
+        # Try transferring data over connection
+        self.pair_and_test_central(peripheral_1)
+        self.run_keyboard_tests(peripheral_1)
+
+        # Establish and Verify second LE peripheral connection
+        self.pair_and_test_central(peripheral_2)
+
+        # Try transferring data over connection
+        self.test_mouse_left_click(peripheral_2)
+
+        # Verify data transfer over two DUT LE Central Connections
+        central_peer.RemoveDevice(self.bluetooth_facade.address)
+        self.test_smart_unlock_llt(address=central_peer.address)
+        # Verify traffic from LE Peripheral connections again
+        self.run_keyboard_tests(peripheral_1)
+        self.test_mouse_left_click(peripheral_2)
+
+        # Disconnect connections from DUT
+        self.test_disconnection_by_adapter(central_peer.address)
+        self.test_disconnection_by_device(peripheral_1)
+        self.test_disconnection_by_device(peripheral_2)
+
+
+    @batch_wrapper('LLT Health')
+    def llt_health_batch_run(self, num_iterations=1, test_name=None):
+        """Run the LE LLT health test batch or a specific given test.
+           The wrapper of this method is implemented in batch_decorator.
+           Using the decorator a test batch method can implement the only its
+           core tests invocations and let the decorator handle the wrapper,
+           which is taking care for whether to run a specific test or the
+           batch as a whole, and running the batch in iterations
+
+           @param num_iterations: how many iterations to run
+           @param test_name: specific test to run otherwise None to run the
+                             whole batch
+        """
+        self.llt_1c1p_connect_cp()
+        self.llt_1c1p_connect_pc()
+        self.llt_1c1p_connect_pc_while_adv()
+        self.llt_2c1p_connect_ccp()
+        self.llt_2c1p_connect_pcc()
+        self.llt_2c1p_connect_cpc()
+        self.llt_2c1p_connect_pcc_while_adv()
+        self.llt_2c1p_connect_cpc_while_adv()
+        self.llt_2p1c_connect_cpp()
+        self.llt_2p1c_connect_pcp()
+        self.llt_2p1c_connect_ppc()
+
+
+    def run_once(self,
+                 host,
+                 num_iterations=1,
+                 btpeer_args=[],
+                 test_name=None,
+                 flag='Quick Health'):
+        """Run the batch of Bluetooth LE LLT health tests
+
+        @param host: the DUT, usually a chromebook
+        @param num_iterations: the number of rounds to execute the test
+        @test_name: the test to run, or None for all tests
+        """
+
+        # Initialize and run the test batch or the requested specific test
+        self.quick_test_init(host,
+                             use_btpeer=True,
+                             flag=flag,
+                             btpeer_args=btpeer_args)
+        self.llt_health_batch_run(num_iterations, test_name)
+        self.quick_test_cleanup()
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_cp b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_cp
new file mode 100644
index 0000000..9502149
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_cp
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_1c1p_connect_cp'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:2'
+
+DOC = """
+      Tests link layer topology with two peer devices,
+      connects DUT as central and peripheral,
+      order of connection is central-peripheral
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc
new file mode 100644
index 0000000..3234dcb
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_1c1p_connect_pc'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:2'
+
+DOC = """
+      Tests link layer topology with two peer devices,
+      connects DUT as central and peripheral,
+      order of connection is peripheral-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc_while_adv b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc_while_adv
new file mode 100644
index 0000000..724c2c2
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_1c1p_connect_pc_while_adv
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_1c1p_connect_pc_while_adv'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:2'
+
+DOC = """
+      Tests link layer topology with two peer devices,
+      connects DUT as central and peripheral while advertising,
+      order of connection is peripheral-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_ccp b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_ccp
new file mode 100644
index 0000000..287b410
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_ccp
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2c1p_connect_ccp'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is central-central-peripheral
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc
new file mode 100644
index 0000000..500e573
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2c1p_connect_cpc'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is central-peripheral-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc_while_adv b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc_while_adv
new file mode 100644
index 0000000..ba2e1a5
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_cpc_while_adv
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2c1p_connect_cpc_while_adv'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass the health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral while advertising,
+      order of connection is central-peripheral-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc
new file mode 100644
index 0000000..a475af4
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2c1p_connect_pcc'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is peripheral-central-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc_while_adv b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc_while_adv
new file mode 100644
index 0000000..da39157
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2c1p_connect_pcc_while_adv
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2c1p_connect_pcc_while_adv'
+PURPOSE = ('Batch of LLT health tests')
+CRITERIA = 'Pass the health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral while advertising,
+      order of connection is peripheral-central-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1,btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_cpp b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_cpp
new file mode 100644
index 0000000..4f92daa
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_cpp
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2p1c_connect_cpp'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass the health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is central-peripheral-peripheral
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_pcp b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_pcp
new file mode 100644
index 0000000..0b70da4
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_pcp
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2p1c_connect_pcp'
+PURPOSE = ('Batch of BLuetooth LLT health tests')
+CRITERIA = 'Pass the health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is peripheral-central-peripheral
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_ppc b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_ppc
new file mode 100644
index 0000000..6907716
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_2p1c_connect_ppc
@@ -0,0 +1,33 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_2p1c_connect_ppc'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass the health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+      Tests link layer topology with three peer devices,
+      connects DUT as central and peripheral,
+      order of connection is peripheral-peripheral-central
+      """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args,
+                  test_name=NAME.split('.')[1])
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_health b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_health
new file mode 100644
index 0000000..13591be
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.llt_health
@@ -0,0 +1,37 @@
+# Copyright 2021 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_AdapterLLTHealth.llt_health'
+PURPOSE = ('Batch of Bluetooth LE LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'MEDIUM'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+    A Batch of Bluetooth LE health tests. This test is written as a batch
+    of tests in order to reduce test time, since auto-test ramp up time is
+    costy. The batch is using BluetoothAdapterQuickTests wrapper methods to
+    start and end a test and a batch of tests.
+
+    This class can be called to run the entire test batch or to run a
+    specific test only - todo http://b/132199238 [autotest BT quick health]
+    add support for running a single test in quick test
+    """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=1, btpeer_args=btpeer_args)
+
+parallel_simple(run, machines)
diff --git a/server/site_tests/bluetooth_AdapterLLTHealth/control.stress b/server/site_tests/bluetooth_AdapterLLTHealth/control.stress
new file mode 100644
index 0000000..32ea6a4
--- /dev/null
+++ b/server/site_tests/bluetooth_AdapterLLTHealth/control.stress
@@ -0,0 +1,37 @@
+# Copyright 2021 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_AdapterLLTHealth.stress'
+PURPOSE = ('Batch of Bluetooth LLT health tests')
+CRITERIA = 'Pass all health test'
+ATTRIBUTES = 'suite:bluetooth_flaky'
+TIME = 'LONG'
+TEST_CATEGORY = 'Functional'
+TEST_CLASS = 'bluetooth'
+TEST_TYPE = 'server'
+DEPENDENCIES = 'bluetooth, working_bluetooth_btpeer:3'
+
+DOC = """
+    A Batch of Bluetooth LE LLT health tests. This test is written as a batch
+    of tests in order to reduce test time, since auto-test ramp up time is
+    costy. The batch is using BluetoothAdapterQuickTests wrapper methods to
+    start and end a test and a batch of tests.
+
+    This class can be called to run the entire test batch or to run a
+    specific test only - todo http://b/132199238 [autotest BT quick health]
+    add support for running a single test in quick test
+    """
+
+args_dict = utils.args_to_dict(args)
+btpeer_args = hosts.CrosHost.get_btpeer_arguments(args_dict)
+
+def run(machine):
+    host = hosts.create_host(machine, btpeer_args=btpeer_args)
+    job.run_test('bluetooth_AdapterLLTHealth', host=host,
+                  num_iterations=15, btpeer_args=btpeer_args)
+
+parallel_simple(run, machines)