Multidevice CTS tests

Bug: 243666928
Bug: 229730966
Fixes: 243666928
Fixes: 229730966
Test: http://ab/I06700010101675154
Merged-In: I152e005a0574e1c47f4aa0c6b6bf8c6b212d24b7
Change-Id: Iebad38da55ca450f092f4e6779a4421af2ad617c
diff --git a/tests/cts/hostsidetests/multidevices/uwb/Android.bp b/tests/cts/hostsidetests/multidevices/uwb/Android.bp
index fd8f848..e78656c 100644
--- a/tests/cts/hostsidetests/multidevices/uwb/Android.bp
+++ b/tests/cts/hostsidetests/multidevices/uwb/Android.bp
@@ -16,8 +16,24 @@
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
+python_defaults {
+    name: "CtsUwbMultiDevicePythonDefaults",
+    libs: [
+        "mobly",
+    ],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    version: {
+        py3: {
+            embedded_launcher: true,
+        },
+    },
+}
+
 python_test_host {
-    name: "CtsUwbMultiDeviceTestCases",
+    name: "CtsUwbMultiDeviceTestCase_UwbManagerTests",
     main: "uwb_manager_test.py",
     srcs: [
         "uwb_manager_test.py",
@@ -26,13 +42,7 @@
         "lib/uwb_ranging_params.py",
         "test_utils/uwb_test_utils.py",
     ],
-    libs: [
-        "mobly",
-    ],
-    test_suites: [
-        "cts",
-        "general-tests",
-    ],
+    test_config: "UwbManagerTests/AndroidTest.xml",
     test_options: {
         unit_test: false,
     },
@@ -40,9 +50,26 @@
         // Package the snippet with the mobly test
         ":uwb_snippet",
     ],
-    version: {
-        py3: {
-            embedded_launcher: true,
-        },
+    defaults: ["CtsUwbMultiDevicePythonDefaults"],
+}
+
+python_test_host {
+    name: "CtsUwbMultiDeviceTestCase_FiraRangingTests",
+    main: "ranging_test.py",
+    srcs: [
+        "ranging_test.py",
+        "lib/uwb_base_test.py",
+        "lib/uwb_ranging_decorator.py",
+        "lib/uwb_ranging_params.py",
+        "test_utils/uwb_test_utils.py",
+    ],
+    test_config: "FiraRangingTests/AndroidTest.xml",
+    test_options: {
+        unit_test: false,
     },
+    data: [
+        // Package the snippet with the mobly test
+        ":uwb_snippet",
+    ],
+    defaults: ["CtsUwbMultiDevicePythonDefaults"],
 }
diff --git a/tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml b/tests/cts/hostsidetests/multidevices/uwb/FiraRangingTests/AndroidTest.xml
similarity index 96%
copy from tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml
copy to tests/cts/hostsidetests/multidevices/uwb/FiraRangingTests/AndroidTest.xml
index 8e852a3..94ce8f1 100644
--- a/tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml
+++ b/tests/cts/hostsidetests/multidevices/uwb/FiraRangingTests/AndroidTest.xml
@@ -43,9 +43,9 @@
 
     <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
       <!-- The mobly-par-file-name should match the module name -->
-      <option name="mobly-par-file-name" value="CtsUwbMultiDeviceTestCases" />
+      <option name="mobly-par-file-name" value="CtsUwbMultiDeviceTestCase_FiraRangingTests" />
       <!-- Timeout limit in milliseconds for all test cases of the python binary -->
-      <option name="mobly-test-timeout" value="60000" />
+      <option name="mobly-test-timeout" value="900000" />
     </test>
 </configuration>
 
diff --git a/tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml b/tests/cts/hostsidetests/multidevices/uwb/UwbManagerTests/AndroidTest.xml
similarity index 98%
rename from tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml
rename to tests/cts/hostsidetests/multidevices/uwb/UwbManagerTests/AndroidTest.xml
index 8e852a3..750f6de 100644
--- a/tests/cts/hostsidetests/multidevices/uwb/AndroidTest.xml
+++ b/tests/cts/hostsidetests/multidevices/uwb/UwbManagerTests/AndroidTest.xml
@@ -43,7 +43,7 @@
 
     <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
       <!-- The mobly-par-file-name should match the module name -->
-      <option name="mobly-par-file-name" value="CtsUwbMultiDeviceTestCases" />
+      <option name="mobly-par-file-name" value="CtsUwbMultiDeviceTestCase_UwbManagerTests" />
       <!-- Timeout limit in milliseconds for all test cases of the python binary -->
       <option name="mobly-test-timeout" value="60000" />
     </test>
diff --git a/tests/cts/hostsidetests/multidevices/uwb/lib/uwb_base_test.py b/tests/cts/hostsidetests/multidevices/uwb/lib/uwb_base_test.py
index b7e67b1..bd4dac2 100644
--- a/tests/cts/hostsidetests/multidevices/uwb/lib/uwb_base_test.py
+++ b/tests/cts/hostsidetests/multidevices/uwb/lib/uwb_base_test.py
@@ -17,7 +17,8 @@
   def setup_class(self):
     """Sets up the Android devices for Uwb test."""
     super().setup_class()
-    self.android_devices = self.register_controller(android_device)
+    self.android_devices = self.register_controller(android_device,
+                                                    min_number=2)
     for ad in self.android_devices:
       ad.load_snippet("uwb", "com.google.snippet.uwb")
       ad.adb.shell(["cmd", "uwb", "force-country-code", "enabled", "US"])
diff --git a/tests/cts/hostsidetests/multidevices/uwb/ranging_test.py b/tests/cts/hostsidetests/multidevices/uwb/ranging_test.py
new file mode 100644
index 0000000..da0596e
--- /dev/null
+++ b/tests/cts/hostsidetests/multidevices/uwb/ranging_test.py
@@ -0,0 +1,1117 @@
+"""Tests for Uwb Ranging APIs."""
+
+import logging
+import random
+import sys
+from typing import List
+
+from mobly import asserts
+from mobly import config_parser
+from mobly import test_runner
+from mobly import records
+from mobly import signals
+import timeout_decorator
+
+from lib import uwb_base_test
+from lib import uwb_ranging_decorator
+from lib import uwb_ranging_params
+from test_utils import uwb_test_utils
+
+RESPONDER_STOP_CALLBACK_TIMEOUT = 60
+
+_TEST_CASES = (
+    "test_ranging_device_tracker_profile_default",
+    "test_ranging_nearby_share_profile_default",
+    "test_ranging_device_tracker_profile_reconfigure_ranging_interval",
+    "test_ranging_nearby_share_profile_reconfigure_ranging_interval",
+    "test_ranging_device_tracker_profile_no_aoa_report",
+    "test_ranging_nearby_share_profile_hopping_mode_enabled",
+    "test_ranging_rr_ss_twr_deferred_device_tracker_profile",
+    "test_ranging_rr_ss_twr_deferred_nearby_share_profile",
+    "test_stop_initiator_ranging_device_tracker_profile",
+    "test_stop_initiator_ranging_nearby_share_profile",
+    "test_stop_responder_ranging_device_tracker_profile",
+    "test_stop_responder_ranging_nearby_share_profile",
+    "test_ranging_device_tracker_profile_with_airplane_mode_toggle",
+    "test_ranging_nearby_share_profile_with_airplane_mode_toggle",
+)
+
+
+class RangingTest(uwb_base_test.UwbBaseTest):
+  """Tests for UWB Ranging APIs.
+
+  Attributes:
+    android_devices: list of android device objects.
+  """
+
+  def __init__(self, configs: config_parser.TestRunConfig):
+    """Init method for the test class.
+
+    Args:
+      configs: A config_parser.TestRunConfig object.
+    """
+    super().__init__(configs)
+    self.tests = _TEST_CASES
+
+  def setup_class(self):
+    super().setup_class()
+    self.uwb_devices = [
+        uwb_ranging_decorator.UwbRangingDecorator(ad)
+        for ad in self.android_devices
+    ]
+    self.initiator, self.responder = self.uwb_devices
+    self.device_addresses = self.user_params.get("device_addresses",
+                                                 [[1, 2], [3, 4]])
+    self.initiator_addr, self.responder_addr = self.device_addresses
+    self.new_responder_addr = [4, 5]
+    self.block_stride_length = random.randint(1, 10)
+
+  def setup_test(self):
+    super().setup_test()
+    for uwb_device in self.uwb_devices:
+      try:
+        uwb_device.close_ranging()
+      except timeout_decorator.TimeoutError:
+        uwb_device.log.warn("Failed to cleanup ranging sessions")
+    for uwb_device in self.uwb_devices:
+      uwb_test_utils.set_airplane_mode(uwb_device.ad, False)
+
+  def teardown_test(self):
+    super().teardown_test()
+    self.responder.stop_ranging()
+    self.initiator.stop_ranging()
+    self.responder.close_ranging()
+    self.initiator.close_ranging()
+
+  def teardown_class(self):
+    super().teardown_class()
+    for count, ad in enumerate(self.android_devices):
+      test_name = "initiator" if not count else "responder"
+      ad.take_bug_report(
+          test_name=test_name, destination=self.current_test_info.output_path)
+
+  ### Helper Methods ###
+
+  def _verify_one_to_one_ranging(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      responder: uwb_ranging_decorator.UwbRangingDecorator,
+      initiator_params: uwb_ranging_params.UwbRangingParams,
+      responder_params: uwb_ranging_params.UwbRangingParams,
+      peer_addr: List[int]):
+    """Verifies ranging between two uwb devices.
+
+    Args:
+      initiator: uwb device object.
+      responder: uwb device object.
+      initiator_params: ranging params for initiator.
+      responder_params: ranging params for responder.
+      peer_addr: address of uwb device.
+    """
+    initiator.open_fira_ranging(initiator_params)
+    responder.open_fira_ranging(responder_params)
+    initiator.start_fira_ranging()
+    responder.start_fira_ranging()
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  def _verify_one_to_one_ranging_reconfigured_params(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      responder: uwb_ranging_decorator.UwbRangingDecorator,
+      initiator_params: uwb_ranging_params.UwbRangingParams,
+      responder_params: uwb_ranging_params.UwbRangingParams,
+      peer_addr: List[int]):
+    """Verifies ranging between two uwb devices with reconfigured params.
+
+    Args:
+      initiator: The uwb device object.
+      responder: The uwb device object.
+      initiator_params: The ranging params for initiator.
+      responder_params: The ranging params for responder.
+      peer_addr: The new address of uwb device.
+    """
+    # change responder addr and verify peer cannot be found
+    responder_params.update(device_address=peer_addr)
+    responder.open_fira_ranging(responder_params)
+    responder.start_fira_ranging()
+    try:
+      uwb_test_utils.verify_peer_found(initiator, peer_addr)
+      asserts.fail("Peer found without reconfiguring initiator.")
+    except signals.TestFailure:
+      logging.info("Peer %s not found as expected", peer_addr)
+
+    # reconfigure initiator with new peer addr and verify peer found
+    reconfigure_params = uwb_ranging_params.UwbRangingReconfigureParams(
+        action=uwb_ranging_params.FiraParamEnums
+        .MULTICAST_LIST_UPDATE_ACTION_ADD,
+        address_list=[peer_addr])
+    initiator.reconfigure_fira_ranging(reconfigure_params)
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  def _verify_stop_initiator_callback(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      responder: uwb_ranging_decorator.UwbRangingDecorator,
+      initiator_params: uwb_ranging_params.UwbRangingParams,
+      responder_params: uwb_ranging_params.UwbRangingParams,
+      peer_addr: List[int]):
+    """Verifies stop callback on initiator.
+
+    Args:
+      initiator: uwb device object.
+      responder: uwb device object.
+      initiator_params: ranging params for initiator.
+      responder_params: ranging params for responder.
+      peer_addr: address of uwb device.
+    """
+
+    # Verify ranging
+    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
+                                    responder_params, peer_addr)
+
+    # Verify Stopped callbacks
+    initiator.stop_ranging()
+    responder.verify_callback_received(
+        "Stopped", timeout=RESPONDER_STOP_CALLBACK_TIMEOUT)
+
+    # Restart and verify ranging
+    initiator.start_fira_ranging()
+    responder.start_fira_ranging()
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  def _verify_stop_responder_callback(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      responder: uwb_ranging_decorator.UwbRangingDecorator,
+      initiator_params: uwb_ranging_params.UwbRangingParams,
+      responder_params: uwb_ranging_params.UwbRangingParams,
+      peer_addr: List[int]):
+    """Verifies stop callback on responder.
+
+    Args:
+      initiator: uwb device object.
+      responder: uwb device object.
+      initiator_params: ranging params for initiator.
+      responder_params: ranging params for responder.
+      peer_addr: address of uwb device.
+    """
+
+    # Verify ranging
+    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
+                                    responder_params, peer_addr)
+
+    # Verify Stopped callbacks
+    responder.stop_ranging()
+
+    # Restart and verify ranging
+    responder.start_fira_ranging()
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  def _verify_one_to_one_ranging_airplane_mode_toggle(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      responder: uwb_ranging_decorator.UwbRangingDecorator,
+      initiator_params: uwb_ranging_params.UwbRangingParams,
+      responder_params: uwb_ranging_params.UwbRangingParams,
+      peer_addr: List[int]):
+    """Verifies ranging with airplane mode toggle.
+
+    Args:
+      initiator: uwb device object.
+      responder: uwb device object.
+      initiator_params: ranging params for initiator.
+      responder_params: ranging params for responder.
+      peer_addr: address of uwb device.
+    """
+
+    # Verify ranging before APM toggle
+    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
+                                    responder_params, peer_addr)
+
+    # Enable APM on initiator and verify callbacks
+    initiator.clear_ranging_session_callback_events()
+    responder.clear_ranging_session_callback_events()
+    uwb_test_utils.set_airplane_mode(initiator.ad, True)
+    initiator.verify_callback_received("Closed")
+    responder.verify_callback_received(
+        "Stopped", timeout=RESPONDER_STOP_CALLBACK_TIMEOUT)
+
+    # Disable APM, restart and verify ranging
+    uwb_test_utils.set_airplane_mode(initiator.ad, False)
+    uwb_test_utils.verify_uwb_state_callback(initiator.ad, "Inactive")
+    initiator.open_fira_ranging(initiator_params)
+    initiator.start_fira_ranging()
+    responder.start_fira_ranging()
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+    # Enable APM on responder and verify callbacks
+    responder.clear_ranging_session_callback_events()
+    uwb_test_utils.set_airplane_mode(responder.ad, True)
+    responder.verify_callback_received("Closed")
+
+    # Disable APM, restart and verify ranging
+    uwb_test_utils.set_airplane_mode(responder.ad, False)
+    uwb_test_utils.verify_uwb_state_callback(responder.ad, "Inactive")
+    responder.open_fira_ranging(responder_params)
+    responder.start_fira_ranging()
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  def _verify_one_to_one_ranging_reconfigure_ranging_interval(
+      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
+      block_stride_length: int, peer_addr: List[int]):
+    """Verifies ranging with reconfigured ranging interval.
+
+    Args:
+      initiator: The uwb device object.
+      block_stride_length: The new block stride length to reconfigure.
+      peer_addr: address of the responder.
+    """
+    initiator.log.info("Reconfigure block stride length to: %s" %
+                       block_stride_length)
+    reconfigure_params = uwb_ranging_params.UwbRangingReconfigureParams(
+        block_stride_length=block_stride_length)
+    initiator.reconfigure_fira_ranging(reconfigure_params)
+    uwb_test_utils.verify_peer_found(initiator, peer_addr)
+
+  ### Test Cases ###
+
+  @records.uid("534e80d7-cfba-47c1-9ae1-62b3630458ac")
+  def test_ranging_default_params(self):
+    """Verifies ranging with default Fira parameters."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self.responder.stop_ranging()
+    self.responder.close_ranging()
+    self._verify_one_to_one_ranging_reconfigured_params(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.new_responder_addr)
+
+  @records.uid("04ec82db-be17-4aaf-911c-56e702c1ea55")
+  def test_ranging_device_tracker_profile_default(self):
+    """Verifies ranging with device tracker profile default values."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("05fa3bc8-b4c8-4bd4-a802-80250aa27a0b")
+  def test_ranging_nearby_share_profile_default(self):
+    """Verifies ranging for device nearby share with default profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self.responder.stop_ranging()
+    self.responder.close_ranging()
+    self._verify_one_to_one_ranging_reconfigured_params(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.new_responder_addr)
+
+  @records.uid("fa9b18c2-a1e1-4bf8-bc76-796700a1c2cb")
+  def test_open_ranging_with_same_session_id_nearby_share(self):
+    """Verifies ranging for device nearby share with same session id."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self.responder.close_ranging()
+    self.initiator.close_ranging()
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("973a083a-f01a-44cc-a706-3b2953ca8e22")
+  def test_open_ranging_with_same_session_id_device_tracker(self):
+    """Verifies ranging with device tracker profile with same session id."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self.responder.close_ranging()
+    self.initiator.close_ranging()
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("dff3aaff-c3ed-47fb-b99f-d47f55c06770")
+  def test_ranging_default_params_reconfigure_ranging_interval(self):
+    """Verifies ranging with default Fira parameters."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
+        self.initiator, self.block_stride_length, self.responder_addr)
+
+  @records.uid("7800a229-af09-48e1-a6f9-bdd159afc460")
+  def test_ranging_device_tracker_profile_reconfigure_ranging_interval(self):
+    """Verifies ranging with device tracker profile default values."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
+        self.initiator, self.block_stride_length, self.responder_addr)
+
+  @records.uid("c1d98ba2-93bd-4458-abfe-0194307ac2d4")
+  def test_ranging_nearby_share_profile_reconfigure_ranging_interval(self):
+    """Verifies ranging for device nearby share with default profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
+        self.initiator, self.block_stride_length, self.responder_addr)
+
+  @records.uid("19ed274a-5cb2-4210-9592-0843313cb88f")
+  def test_ranging_device_tracker_profile_ch9_pr12(self):
+    """Verifies ranging with device tracker for channel 9 and preamble 12."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("810d13ef-678f-4ee5-affc-b0b50efaafc5")
+  def test_ranging_device_tracker_profile_ch5_pr11(self):
+    """Verifies ranging with device tracker for channel 5 and preamble 11."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("90d73266-07f2-46d8-bc06-a4a1206d693a")
+  def test_ranging_device_tracker_profile_ch9_pr11(self):
+    """Verifies device tracking profile with channel 9 and preamble 11."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("827c969e-15dc-43f9-ad65-c8dbcc91dd56")
+  def test_ranging_device_tracker_profile_ch5_pr10(self):
+    """Verifies device tracking profile with channel 5 and preamble 10."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("f7a4fad5-9340-461c-bfb3-e9e530a54a97")
+  def test_ranging_device_tracker_profile_ch9_pr9(self):
+    """Verifies ranging with device tracker for channel 9 and preamble 9."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_9,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_9,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
+        multi_node_mode=uwb_ranging_params
+        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("d75d7443-904c-4ebf-9cb2-5e1df484db7a")
+  def test_ranging_device_tracker_profile_ch5_pr9(self):
+    """Verifies ranging with device tracker for channel 5 and preamble 9."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
+        multi_node_mode=uwb_ranging_params
+        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
+        multi_node_mode=uwb_ranging_params
+        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("0413d123-8578-477f-b07e-be2e8e0a8652")
+  def test_ranging_device_tracker_profile_ch5_pr12(self):
+    """Verifies ranging with device tracker for channel 5 and preamble 12."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
+        multi_node_mode=uwb_ranging_params
+        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
+        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
+        multi_node_mode=uwb_ranging_params
+        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  # disable due to b/212455943
+  @records.uid("73c9e335-c1da-432f-937a-d4bf15f6b338")
+  def _test_ranging_device_nearby_share_profile_block_stride(self):
+    """Verifies nearby share profile with block stride."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+        block_stride_length=0xFF,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+        block_stride_length=0xFF,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("cf9d3a96-433e-40d6-a74e-5413c975da78")
+  def test_ranging_device_tracker_profile_no_aoa_report(self):
+    """Verifies ranging with device tracker profile with no aoa report."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        aoa_result_request=uwb_ranging_params.FiraParamEnums
+        .AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        aoa_result_request=uwb_ranging_params.FiraParamEnums
+        .AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT,
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+    try:
+      self.initiator.get_aoa_azimuth_measurement(self.responder_addr)
+      asserts.fail("Received AoA measurement.")
+    except ValueError:
+      pass
+
+  @records.uid("68c6e10c-749f-448b-b650-a1edaa56a833")
+  def test_ranging_nearby_share_profile_hopping_mode_enabled(self):
+    """Verifies ranging with nearby share profile with hopping mode enabled."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        ranging_interval_ms=200,
+        hopping_mode=uwb_ranging_params.FiraParamEnums
+        .HOPPING_MODE_FIRA_HOPPING_ENABLE,
+        slots_per_ranging_round=20,
+        initiation_time_ms=100,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        ranging_interval_ms=200,
+        hopping_mode=uwb_ranging_params.FiraParamEnums
+        .HOPPING_MODE_FIRA_HOPPING_ENABLE,
+        slots_per_ranging_round=20,
+        initiation_time_ms=100,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("7c63291f-d610-4360-88c9-ae17c46cc0ba")
+  def test_ranging_rr_ss_twr_deferred_default_params(self):
+    """Verifies ranging with default Fira parameters and Ranging Round 1."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("cb404b61-626a-4bbe-87b2-a45bf1fa4174")
+  def test_ranging_rr_ss_twr_deferred_device_tracker_profile(self):
+    """Verifies ranging with device tracker profile and ranging round 1."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("1990b59c-dd57-4f24-8134-f1ccb2db3062")
+  def test_ranging_rr_ss_twr_deferred_nearby_share_profile(self):
+    """Verifies ranging for nearby share profile and ranging round 1."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+        ranging_round_usage=uwb_ranging_params.FiraParamEnums
+        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
+    )
+    self._verify_one_to_one_ranging(self.initiator, self.responder,
+                                    initiator_params, responder_params,
+                                    self.responder_addr)
+
+  @records.uid("ae7a95b3-e8f1-4358-b3cc-ecb10cb6d20c")
+  def test_stop_initiator_ranging_device_tracker_profile(self):
+    """Verifies initiator stop ranging callbacks with device tracker profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_stop_initiator_callback(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+  @records.uid("cd339d74-910a-49e9-9201-b4868adf6db7")
+  def test_stop_initiator_ranging_nearby_share_profile(self):
+    """Verifies initiator stop ranging callbacks for nearby share profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_stop_initiator_callback(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+  @records.uid("c7757248-362f-4efa-95f4-344360e163ad")
+  def test_stop_responder_ranging_device_tracker_profile(self):
+    """Verifies responder stop ranging callbacks with device tracker profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_stop_responder_callback(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+  @records.uid("79f9dff3-6397-495f-9a35-bc1b21b7b500")
+  def test_stop_responder_ranging_nearby_share_profile(self):
+    """Verifies responder stop ranging callbacks for nearby share profile."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_stop_responder_callback(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+  @records.uid("8109b3b3-bd2d-4d0e-be70-844d98f4d6fb")
+  def test_ranging_device_tracker_profile_with_airplane_mode_toggle(self):
+    """Verifies ranging with device tracker profile and airplane mode toggle."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        multi_node_mode=uwb_ranging_params.FiraParamEnums
+        .MULTI_NODE_MODE_UNICAST,
+        initiation_time_ms=100,
+        ranging_interval_ms=240,
+        slots_per_ranging_round=6,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging_airplane_mode_toggle(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+  @records.uid("583d3c33-d41a-4d91-93ef-19dc5e064fb7")
+  def test_ranging_nearby_share_profile_with_airplane_mode_toggle(self):
+    """Verifies ranging for nearby share profile and APM toggle."""
+    initiator_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
+        device_address=self.initiator_addr,
+        destination_addresses=[self.responder_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    responder_params = uwb_ranging_params.UwbRangingParams(
+        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
+        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
+        device_address=self.responder_addr,
+        destination_addresses=[self.initiator_addr],
+        initiation_time_ms=100,
+        ranging_interval_ms=200,
+        slots_per_ranging_round=20,
+        in_band_termination_attempt_count=3,
+    )
+    self._verify_one_to_one_ranging_airplane_mode_toggle(
+        self.initiator, self.responder, initiator_params, responder_params,
+        self.responder_addr)
+
+if __name__ == "__main__":
+  index = sys.argv.index('--')
+  sys.argv = sys.argv[:1] + sys.argv[index + 1:]
+  test_runner.main()
diff --git a/tests/cts/hostsidetests/multidevices/uwb/uwb_manager_test.py b/tests/cts/hostsidetests/multidevices/uwb/uwb_manager_test.py
index 4693110..a107d98 100644
--- a/tests/cts/hostsidetests/multidevices/uwb/uwb_manager_test.py
+++ b/tests/cts/hostsidetests/multidevices/uwb/uwb_manager_test.py
@@ -45,9 +45,9 @@
     super().setup_class()
     self.dut = self.android_devices[0]
 
-  def on_fail(self, record):
-    for ad in self.android_devices:
-      ad.take_bug_report(destination=self.current_test_info.output_path)
+  def teardown_class(self):
+    super().teardown_class()
+    self.dut.take_bug_report(destination=self.current_test_info.output_path)
 
   ### Helper methods ###