1"""Tests for Uwb Ranging APIs."""
2
3import random
4import sys
5import threading
6import time
7from typing import List, Optional
8
9from lib import uwb_base_test
10from lib import uwb_ranging_decorator
11from lib import uwb_ranging_params
12from mobly import asserts
13from mobly import config_parser
14from mobly import signals
15from mobly import suite_runner
16from test_utils import uwb_test_utils
17
18RESPONDER_STOP_CALLBACK_TIMEOUT = 60
19
20_TEST_CASES = (
21    "test_ranging_device_tracker_profile_default",
22    "test_ranging_device_tracker_profile_p_sts_default",
23    "test_ranging_nearby_share_profile_default",
24    "test_ranging_nearby_share_profile_p_sts_default",
25    "test_ranging_nearby_share_profile_reconfigure_controlee",
26    # (TODO: ziyiw) Re-enable this test after fix b/360248188
27    # "test_ranging_nearby_share_profile_p_sts_add_controlee",
28    "test_ranging_nearby_share_profile_add_remove_controlee",
29    "test_ranging_device_tracker_profile_reconfigure_ranging_interval",
30    "test_ranging_nearby_share_profile_reconfigure_ranging_interval",
31    "test_ranging_device_tracker_profile_no_aoa_report",
32    "test_ranging_nearby_share_profile_hopping_mode_disabled",
33    "test_ranging_rr_ss_twr_deferred_device_tracker_profile",
34    "test_ranging_rr_ss_twr_deferred_nearby_share_profile",
35    "test_stop_initiator_ranging_device_tracker_profile",
36    "test_stop_initiator_ranging_nearby_share_profile",
37    "test_stop_responder_ranging_device_tracker_profile",
38    "test_stop_responder_ranging_nearby_share_profile",
39    # (TODO: gmoturu) Re-enable tests after adding fix - b/339139695
40    # "test_ranging_device_tracker_profile_with_airplane_mode_toggle",
41    # "test_ranging_nearby_share_profile_with_airplane_mode_toggle",
42    "test_ranging_nearby_share_profile_move_to_bg_and_fg",
43    "test_ranging_nearby_share_profile_verify_app_in_bg_stops_session",
44    "test_ranging_nearby_share_profile_bg_fails",
45    "test_ranging_nearby_share_profile_no_valid_reports_stops_session",
46    "test_ranging_device_tracker_profile_max_sessions_reject",
47)
48
49
50class RangingTest(uwb_base_test.UwbBaseTest):
51  """Tests for UWB Ranging APIs.
52
53  Attributes:
54    android_devices: list of android device objects.
55  """
56
57  def __init__(self, configs: config_parser.TestRunConfig):
58    """Init method for the test class.
59
60    Args:
61      configs: A config_parser.TestRunConfig object.
62    """
63    super().__init__(configs)
64    self.tests = _TEST_CASES
65
66  def setup_class(self):
67    super().setup_class()
68    self.uwb_devices = [
69        uwb_ranging_decorator.UwbRangingDecorator(ad)
70        for ad in self.android_devices
71    ]
72    self.initiator, self.responder = self.uwb_devices
73    self.device_addresses = self.user_params.get("device_addresses",
74                                                 [[1, 2], [3, 4]])
75    self.initiator_addr, self.responder_addr = self.device_addresses
76    self.new_responder_addr = [4, 5]
77    self.p_sts_sub_session_id = 11
78    self.p_sts_sub_session_key = [
79        8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8]
80    self.block_stride_length = random.randint(1, 10)
81
82  def setup_test(self):
83    super().setup_test()
84    for uwb_device in self.uwb_devices:
85      try:
86        uwb_device.close_ranging()
87      except TimeoutError:
88        uwb_device.log.warn("Failed to cleanup ranging sessions")
89    for uwb_device in self.uwb_devices:
90      uwb_test_utils.set_airplane_mode(uwb_device.ad, False)
91      self._reset_snippet_fg_bg_state(uwb_device)
92
93  def teardown_test(self):
94    super().teardown_test()
95    self.responder.close_all_ranging_sessions()
96    self.initiator.close_all_ranging_sessions()
97
98  ### Helper Methods ###
99
100  def _verify_one_to_one_ranging(
101      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
102      responder: uwb_ranging_decorator.UwbRangingDecorator,
103      initiator_params: uwb_ranging_params.UwbRangingParams,
104      responder_params: uwb_ranging_params.UwbRangingParams,
105      peer_addr: List[int],
106      session: int = 0):
107    """Verifies ranging between two uwb devices.
108
109    Args:
110      initiator: uwb device object.
111      responder: uwb device object.
112      initiator_params: ranging params for initiator.
113      responder_params: ranging params for responder.
114      peer_addr: address of uwb device.
115      session: Session key to use.
116    """
117    initiator.open_fira_ranging(initiator_params, session=session)
118    responder.open_fira_ranging(responder_params, session=session)
119    initiator.start_fira_ranging(session=session)
120    responder.start_fira_ranging(session=session)
121    uwb_test_utils.verify_peer_found(initiator, peer_addr, session=session)
122
123  def _verify_one_to_one_ranging_reconfigured_controlee_params(
124      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
125      responder: uwb_ranging_decorator.UwbRangingDecorator,
126      initiator_params: uwb_ranging_params.UwbRangingParams,
127      responder_params: uwb_ranging_params.UwbRangingParams,
128      peer_addr: List[int],
129      sub_session_id: Optional[int] = None,
130      sub_session_key: Optional[List[int]] = None):
131    """Verifies ranging between two uwb devices with reconfigured params.
132
133    Args:
134      initiator: The uwb device object.
135      responder: The uwb device object.
136      initiator_params: The ranging params for initiator.
137      responder_params: The ranging params for responder.
138      peer_addr: The new address of uwb device.
139      sub_session_id: Sub session id for p-sts with individual controlee keys.
140      sub_session_key: Sub session key for p-sts with individual controlee keys.
141    """
142    initiator.open_fira_ranging(initiator_params)
143    initiator.start_fira_ranging()
144
145    # change responder addr and verify peer cannot be found
146    responder_params.update(device_address=peer_addr)
147    if sub_session_id is not None:
148      responder_params.update(sub_session_id=sub_session_id)
149    if sub_session_key is not None:
150      responder_params.update(sub_session_key=sub_session_key)
151    responder.open_fira_ranging(responder_params)
152    responder.start_fira_ranging()
153    try:
154      uwb_test_utils.verify_peer_found(initiator, peer_addr)
155      asserts.fail("Peer found without reconfiguring initiator.")
156    except signals.TestFailure:
157      self.initiator.log.info("Peer %s not found as expected", peer_addr)
158
159    # reconfigure initiator with new peer addr and verify peer found
160    sub_session_id_list = None
161    sub_session_key_list = None
162    if sub_session_id is not None:
163      sub_session_id_list = [sub_session_id]
164    if sub_session_key is not None:
165      sub_session_key_list = sub_session_key
166    action = uwb_ranging_params.FiraParamEnums.MULTICAST_LIST_UPDATE_ACTION_ADD
167    if sub_session_id is not None and sub_session_key is not None:
168        action = uwb_ranging_params.FiraParamEnums.P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE
169    reconfigure_params = uwb_ranging_params.UwbRangingReconfigureParams(
170        action=action,
171        address_list=[peer_addr], sub_session_id_list=sub_session_id_list,
172        sub_session_key_list=sub_session_key_list)
173    initiator.reconfigure_fira_ranging(reconfigure_params)
174    uwb_test_utils.verify_peer_found(initiator, peer_addr)
175
176  def _verify_one_to_one_ranging_add_remove_controlee(
177      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
178      responder: uwb_ranging_decorator.UwbRangingDecorator,
179      initiator_params: uwb_ranging_params.UwbRangingParams,
180      responder_params: uwb_ranging_params.UwbRangingParams,
181      peer_addr: List[int],
182      sub_session_id: Optional[int] = None,
183      sub_session_key: Optional[List[int]] = None):
184    """Verifies ranging between two uwb devices with dynamically added controlee.
185
186    Args:
187      initiator: The uwb device object.
188      responder: The uwb device object.
189      initiator_params: The ranging params for initiator.
190      responder_params: The ranging params for responder.
191      peer_addr: The new address of uwb device.
192      sub_session_id: Sub session id for p-sts with individual controlee keys.
193      sub_session_key: Sub session key for p-sts with individual controlee keys.
194    """
195    initiator.open_fira_ranging(initiator_params)
196    initiator.start_fira_ranging()
197
198    # change responder addr and verify peer cannot be found
199    responder_params.update(device_address=peer_addr)
200    if sub_session_id is not None:
201      responder_params.update(sub_session_id=sub_session_id)
202    if sub_session_key is not None:
203      responder_params.update(sub_session_key=sub_session_key)
204    responder.open_fira_ranging(responder_params)
205    responder.start_fira_ranging()
206    try:
207      uwb_test_utils.verify_peer_found(initiator, peer_addr)
208      asserts.fail("Peer found without reconfiguring initiator.")
209    except signals.TestFailure:
210      self.initiator.log.info("Peer %s not found as expected", peer_addr)
211
212    # reconfigure initiator with new peer addr and verify peer found
213    sub_session_id_list = None
214    sub_session_key_list = None
215    if sub_session_id is not None:
216      sub_session_id_list = [sub_session_id]
217    if sub_session_key is not None:
218      sub_session_key_list = sub_session_key
219    action = uwb_ranging_params.FiraParamEnums.MULTICAST_LIST_UPDATE_ACTION_ADD
220    if sub_session_id is not None and sub_session_key is not None:
221        action = uwb_ranging_params.FiraParamEnums.P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE
222    controlee_params = uwb_ranging_params.UwbRangingControleeParams(
223        action=action,
224        address_list=[peer_addr],
225        sub_session_id_list=sub_session_id_list,
226        sub_session_key_list=sub_session_key_list)
227    initiator.add_controlee_fira_ranging(controlee_params)
228    uwb_test_utils.verify_peer_found(initiator, peer_addr)
229    controlee_params = uwb_ranging_params.UwbRangingControleeParams(
230        action=uwb_ranging_params.FiraParamEnums
231        .MULTICAST_LIST_UPDATE_ACTION_DELETE,
232        address_list=[peer_addr])
233    initiator.remove_controlee_fira_ranging(controlee_params)
234    try:
235      uwb_test_utils.verify_peer_found(initiator, peer_addr)
236      asserts.fail("Peer found after removing responder.")
237    except signals.TestFailure:
238      self.initiator.log.info("Peer %s not found as expected", peer_addr)
239
240  def _verify_stop_initiator_callback(
241      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
242      responder: uwb_ranging_decorator.UwbRangingDecorator,
243      initiator_params: uwb_ranging_params.UwbRangingParams,
244      responder_params: uwb_ranging_params.UwbRangingParams,
245      peer_addr: List[int]):
246    """Verifies stop callback on initiator.
247
248    Args:
249      initiator: uwb device object.
250      responder: uwb device object.
251      initiator_params: ranging params for initiator.
252      responder_params: ranging params for responder.
253      peer_addr: address of uwb device.
254    """
255
256    # Verify ranging
257    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
258                                    responder_params, peer_addr)
259
260    # Verify Stopped callbacks
261    initiator.stop_ranging()
262    responder.verify_callback_received(
263        "Stopped", timeout=RESPONDER_STOP_CALLBACK_TIMEOUT)
264
265    # Restart and verify ranging
266    initiator.start_fira_ranging()
267    responder.start_fira_ranging()
268    uwb_test_utils.verify_peer_found(initiator, peer_addr)
269
270  def _verify_stop_responder_callback(
271      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
272      responder: uwb_ranging_decorator.UwbRangingDecorator,
273      initiator_params: uwb_ranging_params.UwbRangingParams,
274      responder_params: uwb_ranging_params.UwbRangingParams,
275      peer_addr: List[int]):
276    """Verifies stop callback on responder.
277
278    Args:
279      initiator: uwb device object.
280      responder: uwb device object.
281      initiator_params: ranging params for initiator.
282      responder_params: ranging params for responder.
283      peer_addr: address of uwb device.
284    """
285
286    # Verify ranging
287    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
288                                    responder_params, peer_addr)
289
290    # Verify Stopped callbacks
291    responder.stop_ranging()
292
293    # Restart and verify ranging
294    responder.start_fira_ranging()
295    uwb_test_utils.verify_peer_found(initiator, peer_addr)
296
297  def _is_bg_ranging_supported(
298      self, device: uwb_ranging_decorator.UwbRangingDecorator):
299    """Checks if device supports bg ranging.
300
301    Args:
302      device: uwb device object.
303    """
304    return device.ad.uwb.getSpecificationInfo()["fira"]["background_ranging_support"]
305
306  def _get_uci_version(
307      self, device: uwb_ranging_decorator.UwbRangingDecorator):
308    """Gets uci version from device.
309
310    Args:
311      device: uwb device object.
312    """
313    return device.ad.uwb.getSpecificationInfo()["fira"]["uci_version"]
314
315  def _verify_one_to_one_ranging_airplane_mode_toggle(
316      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
317      responder: uwb_ranging_decorator.UwbRangingDecorator,
318      initiator_params: uwb_ranging_params.UwbRangingParams,
319      responder_params: uwb_ranging_params.UwbRangingParams,
320      peer_addr: List[int]):
321    """Verifies ranging with airplane mode toggle.
322
323    Args:
324      initiator: uwb device object.
325      responder: uwb device object.
326      initiator_params: ranging params for initiator.
327      responder_params: ranging params for responder.
328      peer_addr: address of uwb device.
329
330    """
331
332    # Verify ranging before APM toggle
333    self._verify_one_to_one_ranging(initiator, responder, initiator_params,
334                                    responder_params, peer_addr)
335
336    # Enable APM on initiator and verify callbacks
337    initiator.clear_ranging_session_callback_events()
338    responder.clear_ranging_session_callback_events()
339    callback = "uwb_state_%s" % random.randint(1, 100)
340    handler = initiator.ad.uwb.registerUwbAdapterStateCallback(callback)
341    uwb_test_utils.set_airplane_mode(initiator.ad, True)
342    uwb_test_utils.verify_uwb_state_callback(initiator.ad, "Disabled", handler)
343    initiator.verify_callback_received("Closed")
344    responder.verify_callback_received(
345        "Stopped", timeout=RESPONDER_STOP_CALLBACK_TIMEOUT)
346
347    # Disable APM, restart and verify ranging
348    handler.getAll("UwbAdapterStateCallback")
349    uwb_test_utils.set_airplane_mode(initiator.ad, False)
350    uwb_test_utils.verify_uwb_state_callback(initiator.ad, "Inactive", handler)
351    initiator.ad.uwb.unregisterUwbAdapterStateCallback(callback)
352    initiator.open_fira_ranging(initiator_params)
353    initiator.start_fira_ranging()
354    responder.start_fira_ranging()
355    uwb_test_utils.verify_peer_found(initiator, peer_addr)
356
357    # Enable APM on responder and verify callbacks
358    responder.clear_ranging_session_callback_events()
359    callback = "uwb_state_%s" % random.randint(1, 100)
360    handler = responder.ad.uwb.registerUwbAdapterStateCallback(callback)
361    uwb_test_utils.set_airplane_mode(responder.ad, True)
362    uwb_test_utils.verify_uwb_state_callback(responder.ad, "Disabled", handler)
363    responder.verify_callback_received("Closed")
364
365    # Disable APM, restart and verify ranging
366    handler.getAll("UwbAdapterStateCallback")
367    uwb_test_utils.set_airplane_mode(responder.ad, False)
368    uwb_test_utils.verify_uwb_state_callback(responder.ad, "Inactive", handler)
369    responder.ad.uwb.unregisterUwbAdapterStateCallback(callback)
370    responder.open_fira_ranging(responder_params)
371    responder.start_fira_ranging()
372    uwb_test_utils.verify_peer_found(initiator, peer_addr)
373
374  def _verify_one_to_one_ranging_reconfigure_ranging_interval(
375      self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
376      block_stride_length: int, peer_addr: List[int]):
377    """Verifies ranging with reconfigured ranging interval.
378
379    Args:
380      initiator: The uwb device object.
381      block_stride_length: The new block stride length to reconfigure.
382      peer_addr: address of the responder.
383    """
384    initiator.log.info("Reconfigure block stride length to: %s" %
385                       block_stride_length)
386    reconfigure_params = uwb_ranging_params.UwbRangingReconfigureParams(
387        block_stride_length=block_stride_length)
388    initiator.reconfigure_fira_ranging(reconfigure_params)
389    uwb_test_utils.verify_peer_found(initiator, peer_addr)
390
391  def _verify_add_controlee_when_opened_ranging_with_no_controlee(
392        self, initiator: uwb_ranging_decorator.UwbRangingDecorator,
393        responder: uwb_ranging_decorator.UwbRangingDecorator,
394        initiator_params: uwb_ranging_params.UwbRangingParams,
395        responder_params: uwb_ranging_params.UwbRangingParams,
396        peer_addr: List[int],
397        sub_session_id: Optional[int] = None,
398        sub_session_key: Optional[List[int]] = None):
399    """Verifies ranging between two uwb devices with dynamically added controlee.
400
401    Args:
402      initiator: The uwb device object.
403      responder: The uwb device object.
404      initiator_params: The ranging params for initiator.
405      responder_params: The ranging params for responder.
406      peer_addr: The new address of uwb device.
407      sub_session_id: Sub session id for p-sts with individual controlee keys.
408      sub_session_key: Sub session key for p-sts with individual controlee keys.
409    """
410    initiator.open_fira_ranging(initiator_params)
411
412    if sub_session_id is not None:
413        initiator_params.update(sub_session_id=sub_session_id)
414        responder_params.update(sub_session_id=sub_session_id)
415    if sub_session_key is not None:
416        initiator_params.update(sub_session_key=sub_session_key)
417        responder_params.update(sub_session_key=sub_session_key)
418    responder.open_fira_ranging(responder_params)
419    responder.start_fira_ranging()
420
421    # reconfigure initiator with new peer addr and verify peer found
422    sub_session_id_list = None
423    sub_session_key_list = None
424    if sub_session_id is not None:
425        sub_session_id_list = [sub_session_id]
426    if sub_session_key is not None:
427        sub_session_key_list = sub_session_key
428    action = uwb_ranging_params.FiraParamEnums.MULTICAST_LIST_UPDATE_ACTION_ADD
429    if sub_session_id is not None and sub_session_key is not None:
430        action = uwb_ranging_params.FiraParamEnums.P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE
431    controlee_params = uwb_ranging_params.UwbRangingControleeParams(
432        action=action,
433        address_list=[peer_addr],
434        sub_session_id_list=sub_session_id_list,
435        sub_session_key_list=sub_session_key_list)
436    initiator.add_controlee_fira_ranging(controlee_params)
437
438    initiator.start_fira_ranging()
439    uwb_test_utils.verify_peer_found(initiator, peer_addr)
440
441  @staticmethod
442  def _reset_snippet_fg_bg_state(
443      device: uwb_ranging_decorator.UwbRangingDecorator,
444  ):
445    """Resets snippet app foreground/background state.
446
447    Args:
448      device: The uwb device object.
449    """
450    device.ad.adb.shell(
451        ["cmd", "uwb", "simulate-app-state-change", "com.google.snippet.uwb"]
452    )
453
454  @staticmethod
455  def _move_snippet_to_bg(device: uwb_ranging_decorator.UwbRangingDecorator):
456    """Simulates moving snippet app to background.
457
458    Args:
459      device: The uwb device object.
460    """
461    device.ad.adb.shell([
462        "cmd",
463        "uwb",
464        "simulate-app-state-change",
465        "com.google.snippet.uwb",
466        "background",
467    ])
468
469  @staticmethod
470  def _move_snippet_to_fg(device: uwb_ranging_decorator.UwbRangingDecorator):
471    """Simulates moving snippet app to foreground.
472
473    Args:
474      device: The uwb device object.
475    """
476    device.ad.adb.shell([
477        "cmd",
478        "uwb",
479        "simulate-app-state-change",
480        "com.google.snippet.uwb",
481        "foreground",
482    ])
483
484  ### Test Cases ###
485
486  def test_ranging_device_tracker_profile_default(self):
487    """Verifies ranging with device tracker profile default values."""
488    initiator_params = uwb_ranging_params.UwbRangingParams(
489        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
490        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
491        device_address=self.initiator_addr,
492        destination_addresses=[self.responder_addr],
493        multi_node_mode=uwb_ranging_params.FiraParamEnums
494        .MULTI_NODE_MODE_UNICAST,
495        ranging_interval_ms=240,
496        slots_per_ranging_round=6,
497        in_band_termination_attempt_count=3,
498    )
499    responder_params = uwb_ranging_params.UwbRangingParams(
500        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
501        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
502        device_address=self.responder_addr,
503        destination_addresses=[self.initiator_addr],
504        multi_node_mode=uwb_ranging_params.FiraParamEnums
505        .MULTI_NODE_MODE_UNICAST,
506        ranging_interval_ms=240,
507        slots_per_ranging_round=6,
508        in_band_termination_attempt_count=3,
509    )
510    self._verify_one_to_one_ranging(self.initiator, self.responder,
511                                    initiator_params, responder_params,
512                                    self.responder_addr)
513    self.responder.stop_ranging()
514    self.initiator.stop_ranging()
515
516  def test_ranging_device_tracker_profile_p_sts_default(self):
517    """Verifies ranging with device tracker profile default values."""
518    initiator_params = uwb_ranging_params.UwbRangingParams(
519        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
520        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
521        device_address=self.initiator_addr,
522        destination_addresses=[self.responder_addr],
523        multi_node_mode=uwb_ranging_params.FiraParamEnums
524        .MULTI_NODE_MODE_UNICAST,
525        ranging_interval_ms=240,
526        slots_per_ranging_round=6,
527        in_band_termination_attempt_count=3,
528        sts_config=uwb_ranging_params.FiraParamEnums.STS_CONFIG_PROVISIONED,
529    )
530    responder_params = uwb_ranging_params.UwbRangingParams(
531        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
532        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
533        device_address=self.responder_addr,
534        destination_addresses=[self.initiator_addr],
535        multi_node_mode=uwb_ranging_params.FiraParamEnums
536        .MULTI_NODE_MODE_UNICAST,
537        ranging_interval_ms=240,
538        slots_per_ranging_round=6,
539        in_band_termination_attempt_count=3,
540        sts_config=uwb_ranging_params.FiraParamEnums.STS_CONFIG_PROVISIONED,
541    )
542    self._verify_one_to_one_ranging(self.initiator, self.responder,
543                                    initiator_params, responder_params,
544                                    self.responder_addr)
545    self.responder.stop_ranging()
546    self.initiator.stop_ranging()
547
548  def test_ranging_nearby_share_profile_default(self):
549    """Verifies ranging for device nearby share with default profile."""
550    initiator_params = uwb_ranging_params.UwbRangingParams(
551        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
552        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
553        device_address=self.initiator_addr,
554        destination_addresses=[self.responder_addr],
555        ranging_interval_ms=200,
556        slots_per_ranging_round=20,
557        in_band_termination_attempt_count=3,
558    )
559    responder_params = uwb_ranging_params.UwbRangingParams(
560        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
561        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
562        device_address=self.responder_addr,
563        destination_addresses=[self.initiator_addr],
564        ranging_interval_ms=200,
565        slots_per_ranging_round=20,
566        in_band_termination_attempt_count=3,
567    )
568    self._verify_one_to_one_ranging(self.initiator, self.responder,
569                                    initiator_params, responder_params,
570                                    self.responder_addr)
571    self.responder.stop_ranging()
572    self.initiator.stop_ranging()
573
574  def test_ranging_nearby_share_profile_p_sts_default(self):
575    """Verifies ranging for device nearby share with default profile."""
576    initiator_params = uwb_ranging_params.UwbRangingParams(
577        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
578        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
579        device_address=self.initiator_addr,
580        destination_addresses=[self.responder_addr],
581        ranging_interval_ms=200,
582        slots_per_ranging_round=20,
583        in_band_termination_attempt_count=3,
584        sts_config=uwb_ranging_params.FiraParamEnums.STS_CONFIG_PROVISIONED,
585    )
586    responder_params = uwb_ranging_params.UwbRangingParams(
587        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
588        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
589        device_address=self.responder_addr,
590        destination_addresses=[self.initiator_addr],
591        ranging_interval_ms=200,
592        slots_per_ranging_round=20,
593        in_band_termination_attempt_count=3,
594        sts_config=uwb_ranging_params.FiraParamEnums.STS_CONFIG_PROVISIONED,
595    )
596    self._verify_one_to_one_ranging(self.initiator, self.responder,
597                                    initiator_params, responder_params,
598                                    self.responder_addr)
599    self.responder.stop_ranging()
600    self.initiator.stop_ranging()
601
602  def test_ranging_nearby_share_profile_reconfigure_controlee(self):
603    """Verifies ranging for device nearby share with default profile."""
604    initiator_params = uwb_ranging_params.UwbRangingParams(
605        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
606        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
607        device_address=self.initiator_addr,
608        destination_addresses=[self.responder_addr],
609        ranging_interval_ms=200,
610        slots_per_ranging_round=20,
611        in_band_termination_attempt_count=3,
612    )
613    responder_params = uwb_ranging_params.UwbRangingParams(
614        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
615        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
616        device_address=self.responder_addr,
617        destination_addresses=[self.initiator_addr],
618        ranging_interval_ms=200,
619        slots_per_ranging_round=20,
620        in_band_termination_attempt_count=3,
621    )
622    self._verify_one_to_one_ranging_reconfigured_controlee_params(
623        self.initiator, self.responder, initiator_params, responder_params,
624        self.new_responder_addr)
625    self.responder.stop_ranging()
626    self.initiator.stop_ranging()
627
628  def test_ranging_nearby_share_profile_p_sts_add_controlee(self):
629    """Verifies ranging for device nearby share with default profile."""
630    asserts.skip_if(
631        self._get_uci_version(self.initiator) & 0xFF < 2
632        or self._get_uci_version(self.responder) & 0xFF < 2,
633        f"Provisioned STS individual key case is not supported",
634    )
635    initiator_params = uwb_ranging_params.UwbRangingParams(
636        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
637        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
638        device_address=self.initiator_addr,
639        destination_addresses=[],
640        ranging_interval_ms=200,
641        slots_per_ranging_round=20,
642        in_band_termination_attempt_count=3,
643        sts_config=uwb_ranging_params.FiraParamEnums
644        .STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY,
645    )
646    responder_params = uwb_ranging_params.UwbRangingParams(
647        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
648        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
649        device_address=self.responder_addr,
650        destination_addresses=[self.initiator_addr],
651        ranging_interval_ms=200,
652        slots_per_ranging_round=20,
653        in_band_termination_attempt_count=3,
654        sts_config=uwb_ranging_params.FiraParamEnums
655        .STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY,
656    )
657    self._verify_add_controlee_when_opened_ranging_with_no_controlee(
658        self.initiator, self.responder, initiator_params, responder_params,
659        self.responder_addr, self.p_sts_sub_session_id,
660        self.p_sts_sub_session_key)
661    self.responder.stop_ranging()
662    self.initiator.stop_ranging()
663
664  def test_ranging_nearby_share_profile_add_remove_controlee(self):
665    """Verifies ranging for device nearby share with default profile."""
666    initiator_params = uwb_ranging_params.UwbRangingParams(
667        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
668        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
669        device_address=self.initiator_addr,
670        destination_addresses=[self.responder_addr],
671        ranging_interval_ms=200,
672        slots_per_ranging_round=20,
673        in_band_termination_attempt_count=3,
674    )
675    responder_params = uwb_ranging_params.UwbRangingParams(
676        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
677        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
678        device_address=self.responder_addr,
679        destination_addresses=[self.initiator_addr],
680        ranging_interval_ms=200,
681        slots_per_ranging_round=20,
682        in_band_termination_attempt_count=3,
683    )
684    self._verify_one_to_one_ranging_add_remove_controlee(
685        self.initiator, self.responder, initiator_params, responder_params,
686        self.new_responder_addr)
687    # Verify session is stopped on the responder because removal of controlee from controller
688    # should result in the controlee automatically stopping.
689    try:
690        self.responder.verify_callback_received("Stopped", timeout=60 * 1)
691    except TimeoutError:
692        asserts.fail(
693            "Should receive ranging stop when the controlee is removed from session"
694        )
695    self.initiator.stop_ranging()
696
697  def test_open_ranging_with_same_session_id_nearby_share(self):
698    """Verifies ranging for device nearby share with same session id."""
699    initiator_params = uwb_ranging_params.UwbRangingParams(
700        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
701        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
702        device_address=self.initiator_addr,
703        destination_addresses=[self.responder_addr],
704        ranging_interval_ms=200,
705        slots_per_ranging_round=20,
706        in_band_termination_attempt_count=3,
707    )
708    responder_params = uwb_ranging_params.UwbRangingParams(
709        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
710        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
711        device_address=self.responder_addr,
712        destination_addresses=[self.initiator_addr],
713        ranging_interval_ms=200,
714        slots_per_ranging_round=20,
715        in_band_termination_attempt_count=3,
716    )
717    self._verify_one_to_one_ranging(self.initiator, self.responder,
718                                    initiator_params, responder_params,
719                                    self.responder_addr)
720    self.responder.close_ranging()
721    self.initiator.close_ranging()
722    self._verify_one_to_one_ranging(self.initiator, self.responder,
723                                    initiator_params, responder_params,
724                                    self.responder_addr)
725    self.responder.stop_ranging()
726    self.initiator.stop_ranging()
727
728  def test_open_ranging_with_same_session_id_device_tracker(self):
729    """Verifies ranging with device tracker profile with same session id."""
730    initiator_params = uwb_ranging_params.UwbRangingParams(
731        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
732        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
733        device_address=self.initiator_addr,
734        destination_addresses=[self.responder_addr],
735        multi_node_mode=uwb_ranging_params.FiraParamEnums
736        .MULTI_NODE_MODE_UNICAST,
737        ranging_interval_ms=240,
738        slots_per_ranging_round=6,
739        in_band_termination_attempt_count=3,
740    )
741    responder_params = uwb_ranging_params.UwbRangingParams(
742        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
743        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
744        device_address=self.responder_addr,
745        destination_addresses=[self.initiator_addr],
746        multi_node_mode=uwb_ranging_params.FiraParamEnums
747        .MULTI_NODE_MODE_UNICAST,
748        ranging_interval_ms=240,
749        slots_per_ranging_round=6,
750        in_band_termination_attempt_count=3,
751    )
752    self._verify_one_to_one_ranging(self.initiator, self.responder,
753                                    initiator_params, responder_params,
754                                    self.responder_addr)
755    self.responder.close_ranging()
756    self.initiator.close_ranging()
757    self._verify_one_to_one_ranging(self.initiator, self.responder,
758                                    initiator_params, responder_params,
759                                    self.responder_addr)
760    self.responder.stop_ranging()
761    self.initiator.stop_ranging()
762
763  def test_ranging_nearby_share_reconfigure_ranging_interval(self):
764    """Verifies ranging with default Fira parameters."""
765    initiator_params = uwb_ranging_params.UwbRangingParams(
766        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
767        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
768        device_address=self.initiator_addr,
769        destination_addresses=[self.responder_addr],
770    )
771    responder_params = uwb_ranging_params.UwbRangingParams(
772        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
773        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
774        device_address=self.responder_addr,
775        destination_addresses=[self.initiator_addr],
776    )
777    self._verify_one_to_one_ranging(self.initiator, self.responder,
778                                    initiator_params, responder_params,
779                                    self.responder_addr)
780    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
781        self.initiator, self.block_stride_length, self.responder_addr)
782    self.responder.stop_ranging()
783    self.initiator.stop_ranging()
784
785  def test_ranging_device_tracker_profile_reconfigure_ranging_interval(self):
786    """Verifies ranging with device tracker profile default values."""
787    initiator_params = uwb_ranging_params.UwbRangingParams(
788        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
789        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
790        device_address=self.initiator_addr,
791        destination_addresses=[self.responder_addr],
792        multi_node_mode=uwb_ranging_params.FiraParamEnums
793        .MULTI_NODE_MODE_UNICAST,
794        ranging_interval_ms=240,
795        slots_per_ranging_round=6,
796        in_band_termination_attempt_count=3,
797    )
798    responder_params = uwb_ranging_params.UwbRangingParams(
799        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
800        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
801        device_address=self.responder_addr,
802        destination_addresses=[self.initiator_addr],
803        multi_node_mode=uwb_ranging_params.FiraParamEnums
804        .MULTI_NODE_MODE_UNICAST,
805        ranging_interval_ms=240,
806        slots_per_ranging_round=6,
807        in_band_termination_attempt_count=3,
808    )
809    self._verify_one_to_one_ranging(self.initiator, self.responder,
810                                    initiator_params, responder_params,
811                                    self.responder_addr)
812    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
813        self.initiator, self.block_stride_length, self.responder_addr)
814    self.responder.stop_ranging()
815    self.initiator.stop_ranging()
816
817  def test_ranging_nearby_share_profile_reconfigure_ranging_interval(self):
818    """Verifies ranging for device nearby share with default profile."""
819    initiator_params = uwb_ranging_params.UwbRangingParams(
820        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
821        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
822        device_address=self.initiator_addr,
823        destination_addresses=[self.responder_addr],
824        ranging_interval_ms=200,
825        slots_per_ranging_round=20,
826        in_band_termination_attempt_count=3,
827    )
828    responder_params = uwb_ranging_params.UwbRangingParams(
829        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
830        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
831        device_address=self.responder_addr,
832        destination_addresses=[self.initiator_addr],
833        ranging_interval_ms=200,
834        slots_per_ranging_round=20,
835        in_band_termination_attempt_count=3,
836    )
837    self._verify_one_to_one_ranging(self.initiator, self.responder,
838                                    initiator_params, responder_params,
839                                    self.responder_addr)
840    self._verify_one_to_one_ranging_reconfigure_ranging_interval(
841        self.initiator, self.block_stride_length, self.responder_addr)
842    self.responder.stop_ranging()
843    self.initiator.stop_ranging()
844
845  def test_ranging_device_tracker_profile_ch9_pr12(self):
846    """Verifies ranging with device tracker for channel 9 and preamble 12."""
847    initiator_params = uwb_ranging_params.UwbRangingParams(
848        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
849        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
850        device_address=self.initiator_addr,
851        destination_addresses=[self.responder_addr],
852        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
853        multi_node_mode=uwb_ranging_params.FiraParamEnums
854        .MULTI_NODE_MODE_UNICAST,
855        ranging_interval_ms=240,
856        slots_per_ranging_round=6,
857        in_band_termination_attempt_count=3,
858    )
859    responder_params = uwb_ranging_params.UwbRangingParams(
860        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
861        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
862        device_address=self.responder_addr,
863        destination_addresses=[self.initiator_addr],
864        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
865        multi_node_mode=uwb_ranging_params.FiraParamEnums
866        .MULTI_NODE_MODE_UNICAST,
867        ranging_interval_ms=240,
868        slots_per_ranging_round=6,
869        in_band_termination_attempt_count=3,
870    )
871    self._verify_one_to_one_ranging(self.initiator, self.responder,
872                                    initiator_params, responder_params,
873                                    self.responder_addr)
874    self.responder.stop_ranging()
875    self.initiator.stop_ranging()
876
877  def test_ranging_device_tracker_profile_ch5_pr11(self):
878    """Verifies ranging with device tracker for channel 5 and preamble 11."""
879    initiator_params = uwb_ranging_params.UwbRangingParams(
880        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
881        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
882        device_address=self.initiator_addr,
883        destination_addresses=[self.responder_addr],
884        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
885        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
886        multi_node_mode=uwb_ranging_params.FiraParamEnums
887        .MULTI_NODE_MODE_UNICAST,
888        ranging_interval_ms=240,
889        slots_per_ranging_round=6,
890        in_band_termination_attempt_count=3,
891    )
892    responder_params = uwb_ranging_params.UwbRangingParams(
893        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
894        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
895        device_address=self.responder_addr,
896        destination_addresses=[self.initiator_addr],
897        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
898        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
899        multi_node_mode=uwb_ranging_params.FiraParamEnums
900        .MULTI_NODE_MODE_UNICAST,
901        ranging_interval_ms=240,
902        slots_per_ranging_round=6,
903        in_band_termination_attempt_count=3,
904    )
905    self._verify_one_to_one_ranging(self.initiator, self.responder,
906                                    initiator_params, responder_params,
907                                    self.responder_addr)
908    self.responder.stop_ranging()
909    self.initiator.stop_ranging()
910
911  def test_ranging_device_tracker_profile_ch9_pr11(self):
912    """Verifies device tracking profile with channel 9 and preamble 11."""
913    initiator_params = uwb_ranging_params.UwbRangingParams(
914        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
915        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
916        device_address=self.initiator_addr,
917        destination_addresses=[self.responder_addr],
918        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
919        multi_node_mode=uwb_ranging_params.FiraParamEnums
920        .MULTI_NODE_MODE_UNICAST,
921        ranging_interval_ms=240,
922        slots_per_ranging_round=6,
923        in_band_termination_attempt_count=3,
924    )
925    responder_params = uwb_ranging_params.UwbRangingParams(
926        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
927        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
928        device_address=self.responder_addr,
929        destination_addresses=[self.initiator_addr],
930        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11,
931        multi_node_mode=uwb_ranging_params.FiraParamEnums
932        .MULTI_NODE_MODE_UNICAST,
933        ranging_interval_ms=240,
934        slots_per_ranging_round=6,
935        in_band_termination_attempt_count=3,
936    )
937    self._verify_one_to_one_ranging(self.initiator, self.responder,
938                                    initiator_params, responder_params,
939                                    self.responder_addr)
940    self.responder.stop_ranging()
941    self.initiator.stop_ranging()
942
943  def test_ranging_device_tracker_profile_ch5_pr10(self):
944    """Verifies device tracking profile with channel 5 and preamble 10."""
945    initiator_params = uwb_ranging_params.UwbRangingParams(
946        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
947        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
948        device_address=self.initiator_addr,
949        destination_addresses=[self.responder_addr],
950        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
951        multi_node_mode=uwb_ranging_params.FiraParamEnums
952        .MULTI_NODE_MODE_UNICAST,
953        ranging_interval_ms=240,
954        slots_per_ranging_round=6,
955        in_band_termination_attempt_count=3,
956    )
957    responder_params = uwb_ranging_params.UwbRangingParams(
958        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
959        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
960        device_address=self.responder_addr,
961        destination_addresses=[self.initiator_addr],
962        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
963        multi_node_mode=uwb_ranging_params.FiraParamEnums
964        .MULTI_NODE_MODE_UNICAST,
965        ranging_interval_ms=240,
966        slots_per_ranging_round=6,
967        in_band_termination_attempt_count=3,
968    )
969    self._verify_one_to_one_ranging(self.initiator, self.responder,
970                                    initiator_params, responder_params,
971                                    self.responder_addr)
972    self.responder.stop_ranging()
973    self.initiator.stop_ranging()
974
975  def test_ranging_device_tracker_profile_ch9_pr9(self):
976    """Verifies ranging with device tracker for channel 9 and preamble 9."""
977    initiator_params = uwb_ranging_params.UwbRangingParams(
978        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
979        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
980        device_address=self.initiator_addr,
981        destination_addresses=[self.responder_addr],
982        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_9,
983        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
984        multi_node_mode=uwb_ranging_params.FiraParamEnums
985        .MULTI_NODE_MODE_UNICAST,
986        ranging_interval_ms=240,
987        slots_per_ranging_round=6,
988        in_band_termination_attempt_count=3,
989    )
990    responder_params = uwb_ranging_params.UwbRangingParams(
991        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
992        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
993        device_address=self.responder_addr,
994        destination_addresses=[self.initiator_addr],
995        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_9,
996        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
997        multi_node_mode=uwb_ranging_params
998        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
999        ranging_interval_ms=240,
1000        slots_per_ranging_round=6,
1001        in_band_termination_attempt_count=3,
1002    )
1003    self._verify_one_to_one_ranging(self.initiator, self.responder,
1004                                    initiator_params, responder_params,
1005                                    self.responder_addr)
1006    self.responder.stop_ranging()
1007    self.initiator.stop_ranging()
1008
1009  def test_ranging_device_tracker_profile_ch5_pr9(self):
1010    """Verifies ranging with device tracker for channel 5 and preamble 9."""
1011    initiator_params = uwb_ranging_params.UwbRangingParams(
1012        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1013        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1014        device_address=self.initiator_addr,
1015        destination_addresses=[self.responder_addr],
1016        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
1017        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
1018        multi_node_mode=uwb_ranging_params
1019        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
1020        ranging_interval_ms=240,
1021        slots_per_ranging_round=6,
1022        in_band_termination_attempt_count=3,
1023    )
1024    responder_params = uwb_ranging_params.UwbRangingParams(
1025        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1026        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1027        device_address=self.responder_addr,
1028        destination_addresses=[self.initiator_addr],
1029        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
1030        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_9,
1031        multi_node_mode=uwb_ranging_params
1032        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
1033        ranging_interval_ms=240,
1034        slots_per_ranging_round=6,
1035        in_band_termination_attempt_count=3,
1036    )
1037    self._verify_one_to_one_ranging(self.initiator, self.responder,
1038                                    initiator_params, responder_params,
1039                                    self.responder_addr)
1040    self.responder.stop_ranging()
1041    self.initiator.stop_ranging()
1042
1043  def test_ranging_device_tracker_profile_ch5_pr12(self):
1044    """Verifies ranging with device tracker for channel 5 and preamble 12."""
1045    initiator_params = uwb_ranging_params.UwbRangingParams(
1046        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1047        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1048        device_address=self.initiator_addr,
1049        destination_addresses=[self.responder_addr],
1050        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
1051        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
1052        multi_node_mode=uwb_ranging_params
1053        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
1054        ranging_interval_ms=240,
1055        slots_per_ranging_round=6,
1056        in_band_termination_attempt_count=3,
1057    )
1058    responder_params = uwb_ranging_params.UwbRangingParams(
1059        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1060        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1061        device_address=self.responder_addr,
1062        destination_addresses=[self.initiator_addr],
1063        channel=uwb_ranging_params.FiraParamEnums.UWB_CHANNEL_5,
1064        preamble=uwb_ranging_params.FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_12,
1065        multi_node_mode=uwb_ranging_params
1066        .FiraParamEnums.MULTI_NODE_MODE_UNICAST,
1067        ranging_interval_ms=240,
1068        slots_per_ranging_round=6,
1069        in_band_termination_attempt_count=3,
1070    )
1071    self._verify_one_to_one_ranging(self.initiator, self.responder,
1072                                    initiator_params, responder_params,
1073                                    self.responder_addr)
1074    self.responder.stop_ranging()
1075    self.initiator.stop_ranging()
1076
1077  def test_ranging_device_tracker_profile_no_aoa_report(self):
1078    """Verifies ranging with device tracker profile with no aoa report."""
1079    initiator_params = uwb_ranging_params.UwbRangingParams(
1080        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1081        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1082        device_address=self.initiator_addr,
1083        destination_addresses=[self.responder_addr],
1084        aoa_result_request=uwb_ranging_params.FiraParamEnums
1085        .AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT,
1086        multi_node_mode=uwb_ranging_params.FiraParamEnums
1087        .MULTI_NODE_MODE_UNICAST,
1088        ranging_interval_ms=240,
1089        slots_per_ranging_round=6,
1090        in_band_termination_attempt_count=3,
1091    )
1092    responder_params = uwb_ranging_params.UwbRangingParams(
1093        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1094        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1095        device_address=self.responder_addr,
1096        destination_addresses=[self.initiator_addr],
1097        aoa_result_request=uwb_ranging_params.FiraParamEnums
1098        .AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT,
1099        multi_node_mode=uwb_ranging_params.FiraParamEnums
1100        .MULTI_NODE_MODE_UNICAST,
1101        ranging_interval_ms=240,
1102        slots_per_ranging_round=6,
1103        in_band_termination_attempt_count=3,
1104    )
1105    self._verify_one_to_one_ranging(self.initiator, self.responder,
1106                                    initiator_params, responder_params,
1107                                    self.responder_addr)
1108    try:
1109      self.initiator.get_aoa_azimuth_measurement(self.responder_addr)
1110      asserts.fail("Received AoA measurement.")
1111    except ValueError:
1112      pass
1113    self.responder.stop_ranging()
1114    self.initiator.stop_ranging()
1115
1116  def test_ranging_nearby_share_profile_hopping_mode_disabled(self):
1117    """Verifies ranging with nearby share profile with hopping mode disabled."""
1118    initiator_params = uwb_ranging_params.UwbRangingParams(
1119        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1120        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1121        device_address=self.initiator_addr,
1122        destination_addresses=[self.responder_addr],
1123        ranging_interval_ms=200,
1124        hopping_mode=uwb_ranging_params.FiraParamEnums.HOPPING_MODE_DISABLE,
1125        slots_per_ranging_round=20,
1126        in_band_termination_attempt_count=3,
1127    )
1128    responder_params = uwb_ranging_params.UwbRangingParams(
1129        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1130        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1131        device_address=self.responder_addr,
1132        destination_addresses=[self.initiator_addr],
1133        ranging_interval_ms=200,
1134        hopping_mode=uwb_ranging_params.FiraParamEnums.HOPPING_MODE_DISABLE,
1135        slots_per_ranging_round=20,
1136        in_band_termination_attempt_count=3,
1137    )
1138    self._verify_one_to_one_ranging(self.initiator, self.responder,
1139                                    initiator_params, responder_params,
1140                                    self.responder_addr)
1141    self.responder.stop_ranging()
1142    self.initiator.stop_ranging()
1143
1144  def test_ranging_rr_ss_twr_deferred_default_params(self):
1145    """Verifies ranging with default Fira parameters and Ranging Round 1."""
1146    initiator_params = uwb_ranging_params.UwbRangingParams(
1147        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1148        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1149        device_address=self.initiator_addr,
1150        destination_addresses=[self.responder_addr],
1151        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1152        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1153    )
1154    responder_params = uwb_ranging_params.UwbRangingParams(
1155        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1156        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1157        device_address=self.responder_addr,
1158        destination_addresses=[self.initiator_addr],
1159        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1160        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1161    )
1162    self._verify_one_to_one_ranging(self.initiator, self.responder,
1163                                    initiator_params, responder_params,
1164                                    self.responder_addr)
1165    self.responder.stop_ranging()
1166    self.initiator.stop_ranging()
1167
1168  def test_ranging_rr_ss_twr_deferred_device_tracker_profile(self):
1169    """Verifies ranging with device tracker profile and ranging round 1."""
1170    initiator_params = uwb_ranging_params.UwbRangingParams(
1171        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1172        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1173        device_address=self.initiator_addr,
1174        destination_addresses=[self.responder_addr],
1175        multi_node_mode=uwb_ranging_params.FiraParamEnums
1176        .MULTI_NODE_MODE_UNICAST,
1177        ranging_interval_ms=240,
1178        slots_per_ranging_round=6,
1179        in_band_termination_attempt_count=3,
1180        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1181        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1182    )
1183    responder_params = uwb_ranging_params.UwbRangingParams(
1184        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1185        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1186        device_address=self.responder_addr,
1187        destination_addresses=[self.initiator_addr],
1188        multi_node_mode=uwb_ranging_params.FiraParamEnums
1189        .MULTI_NODE_MODE_UNICAST,
1190        ranging_interval_ms=240,
1191        slots_per_ranging_round=6,
1192        in_band_termination_attempt_count=3,
1193        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1194        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1195    )
1196    self._verify_one_to_one_ranging(self.initiator, self.responder,
1197                                    initiator_params, responder_params,
1198                                    self.responder_addr)
1199    self.responder.stop_ranging()
1200    self.initiator.stop_ranging()
1201
1202  def test_ranging_rr_ss_twr_deferred_nearby_share_profile(self):
1203    """Verifies ranging for nearby share profile and ranging round 1."""
1204    initiator_params = uwb_ranging_params.UwbRangingParams(
1205        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1206        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1207        device_address=self.initiator_addr,
1208        destination_addresses=[self.responder_addr],
1209        ranging_interval_ms=200,
1210        slots_per_ranging_round=20,
1211        in_band_termination_attempt_count=3,
1212        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1213        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1214    )
1215    responder_params = uwb_ranging_params.UwbRangingParams(
1216        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1217        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1218        device_address=self.responder_addr,
1219        destination_addresses=[self.initiator_addr],
1220        ranging_interval_ms=200,
1221        slots_per_ranging_round=20,
1222        in_band_termination_attempt_count=3,
1223        ranging_round_usage=uwb_ranging_params.FiraParamEnums
1224        .RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
1225    )
1226    self._verify_one_to_one_ranging(self.initiator, self.responder,
1227                                    initiator_params, responder_params,
1228                                    self.responder_addr)
1229    self.responder.stop_ranging()
1230    self.initiator.stop_ranging()
1231
1232  def test_stop_initiator_ranging_device_tracker_profile(self):
1233    """Verifies initiator stop ranging callbacks with device tracker profile."""
1234    initiator_params = uwb_ranging_params.UwbRangingParams(
1235        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1236        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1237        device_address=self.initiator_addr,
1238        destination_addresses=[self.responder_addr],
1239        multi_node_mode=uwb_ranging_params.FiraParamEnums
1240        .MULTI_NODE_MODE_UNICAST,
1241        ranging_interval_ms=240,
1242        slots_per_ranging_round=6,
1243        in_band_termination_attempt_count=3,
1244    )
1245    responder_params = uwb_ranging_params.UwbRangingParams(
1246        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1247        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1248        device_address=self.responder_addr,
1249        destination_addresses=[self.initiator_addr],
1250        multi_node_mode=uwb_ranging_params.FiraParamEnums
1251        .MULTI_NODE_MODE_UNICAST,
1252        ranging_interval_ms=240,
1253        slots_per_ranging_round=6,
1254        in_band_termination_attempt_count=3,
1255    )
1256    self._verify_stop_initiator_callback(
1257        self.initiator, self.responder, initiator_params, responder_params,
1258        self.responder_addr)
1259    self.responder.stop_ranging()
1260    self.initiator.stop_ranging()
1261
1262  def test_stop_initiator_ranging_nearby_share_profile(self):
1263    """Verifies initiator stop ranging callbacks for nearby share profile."""
1264    initiator_params = uwb_ranging_params.UwbRangingParams(
1265        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1266        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1267        device_address=self.initiator_addr,
1268        destination_addresses=[self.responder_addr],
1269        ranging_interval_ms=200,
1270        slots_per_ranging_round=20,
1271        in_band_termination_attempt_count=3,
1272    )
1273    responder_params = uwb_ranging_params.UwbRangingParams(
1274        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1275        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1276        device_address=self.responder_addr,
1277        destination_addresses=[self.initiator_addr],
1278        ranging_interval_ms=200,
1279        slots_per_ranging_round=20,
1280        in_band_termination_attempt_count=3,
1281    )
1282    self._verify_stop_initiator_callback(
1283        self.initiator, self.responder, initiator_params, responder_params,
1284        self.responder_addr)
1285    self.responder.stop_ranging()
1286    self.initiator.stop_ranging()
1287
1288  def test_stop_responder_ranging_device_tracker_profile(self):
1289    """Verifies responder stop ranging callbacks with device tracker profile."""
1290    initiator_params = uwb_ranging_params.UwbRangingParams(
1291        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1292        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1293        device_address=self.initiator_addr,
1294        destination_addresses=[self.responder_addr],
1295        multi_node_mode=uwb_ranging_params.FiraParamEnums
1296        .MULTI_NODE_MODE_UNICAST,
1297        ranging_interval_ms=240,
1298        slots_per_ranging_round=6,
1299        in_band_termination_attempt_count=3,
1300    )
1301    responder_params = uwb_ranging_params.UwbRangingParams(
1302        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1303        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1304        device_address=self.responder_addr,
1305        destination_addresses=[self.initiator_addr],
1306        multi_node_mode=uwb_ranging_params.FiraParamEnums
1307        .MULTI_NODE_MODE_UNICAST,
1308        ranging_interval_ms=240,
1309        slots_per_ranging_round=6,
1310        in_band_termination_attempt_count=3,
1311    )
1312    self._verify_stop_responder_callback(
1313        self.initiator, self.responder, initiator_params, responder_params,
1314        self.responder_addr)
1315    self.responder.stop_ranging()
1316    self.initiator.stop_ranging()
1317
1318  def test_stop_responder_ranging_nearby_share_profile(self):
1319    """Verifies responder stop ranging callbacks for nearby share profile."""
1320    initiator_params = uwb_ranging_params.UwbRangingParams(
1321        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1322        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1323        device_address=self.initiator_addr,
1324        destination_addresses=[self.responder_addr],
1325        ranging_interval_ms=200,
1326        slots_per_ranging_round=20,
1327        in_band_termination_attempt_count=3,
1328    )
1329    responder_params = uwb_ranging_params.UwbRangingParams(
1330        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1331        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1332        device_address=self.responder_addr,
1333        destination_addresses=[self.initiator_addr],
1334        ranging_interval_ms=200,
1335        slots_per_ranging_round=20,
1336        in_band_termination_attempt_count=3,
1337    )
1338    self._verify_stop_responder_callback(
1339        self.initiator, self.responder, initiator_params, responder_params,
1340        self.responder_addr)
1341    self.responder.stop_ranging()
1342    self.initiator.stop_ranging()
1343
1344  def test_ranging_device_tracker_profile_with_airplane_mode_toggle(self):
1345    """Verifies ranging with device tracker profile and airplane mode toggle."""
1346    initiator_params = uwb_ranging_params.UwbRangingParams(
1347        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1348        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1349        device_address=self.initiator_addr,
1350        destination_addresses=[self.responder_addr],
1351        multi_node_mode=uwb_ranging_params.FiraParamEnums
1352        .MULTI_NODE_MODE_UNICAST,
1353        ranging_interval_ms=240,
1354        slots_per_ranging_round=6,
1355        in_band_termination_attempt_count=3,
1356    )
1357    responder_params = uwb_ranging_params.UwbRangingParams(
1358        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1359        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1360        device_address=self.responder_addr,
1361        destination_addresses=[self.initiator_addr],
1362        multi_node_mode=uwb_ranging_params.FiraParamEnums
1363        .MULTI_NODE_MODE_UNICAST,
1364        ranging_interval_ms=240,
1365        slots_per_ranging_round=6,
1366        in_band_termination_attempt_count=3,
1367    )
1368    self._verify_one_to_one_ranging_airplane_mode_toggle(
1369        self.initiator, self.responder, initiator_params, responder_params,
1370        self.responder_addr)
1371    self.responder.stop_ranging()
1372    self.initiator.stop_ranging()
1373
1374  def test_ranging_nearby_share_profile_with_airplane_mode_toggle(self):
1375    """Verifies ranging for nearby share profile and APM toggle."""
1376    initiator_params = uwb_ranging_params.UwbRangingParams(
1377        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1378        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1379        device_address=self.initiator_addr,
1380        destination_addresses=[self.responder_addr],
1381        ranging_interval_ms=200,
1382        slots_per_ranging_round=20,
1383        in_band_termination_attempt_count=3,
1384    )
1385    responder_params = uwb_ranging_params.UwbRangingParams(
1386        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1387        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1388        device_address=self.responder_addr,
1389        destination_addresses=[self.initiator_addr],
1390        ranging_interval_ms=200,
1391        slots_per_ranging_round=20,
1392        in_band_termination_attempt_count=3,
1393    )
1394    self._verify_one_to_one_ranging_airplane_mode_toggle(
1395        self.initiator, self.responder, initiator_params, responder_params,
1396        self.responder_addr)
1397    self.responder.stop_ranging()
1398    self.initiator.stop_ranging()
1399
1400  def test_ranging_nearby_share_profile_move_to_bg_and_fg(self):
1401    """Verifies ranging with app moving background and foreground.
1402
1403    Steps:
1404      1. Verifies ranging with default Fira parameters.
1405      2. Move app to background.
1406      3. Ensures the app does not receive range data notifications
1407      4. Move app to foreground.
1408      5. Ensures the app starts receiving range data notifications
1409    """
1410    initiator_params = uwb_ranging_params.UwbRangingParams(
1411        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1412        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1413        device_address=self.initiator_addr,
1414        destination_addresses=[self.responder_addr],
1415        ranging_interval_ms=200,
1416        slots_per_ranging_round=20,
1417        in_band_termination_attempt_count=3,
1418    )
1419    responder_params = uwb_ranging_params.UwbRangingParams(
1420        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1421        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1422        device_address=self.responder_addr,
1423        destination_addresses=[self.initiator_addr],
1424        ranging_interval_ms=200,
1425        slots_per_ranging_round=20,
1426        in_band_termination_attempt_count=3,
1427    )
1428    self._verify_one_to_one_ranging(
1429        self.initiator,
1430        self.responder,
1431        initiator_params,
1432        responder_params,
1433        self.responder_addr,
1434    )
1435
1436    self._move_snippet_to_bg(self.initiator)
1437    time.sleep(0.75)
1438    self.initiator.clear_ranging_session_callback_events()
1439    try:
1440      self.initiator.verify_callback_received("ReportReceived")
1441      asserts.fail(
1442          "Should not receive ranging reports when the app is in background"
1443      )
1444    except TimeoutError:
1445      # Expect to get a timeout error
1446      self.initiator.log.info("Did not get any ranging reports as expected")
1447
1448    self._move_snippet_to_fg(self.initiator)
1449    self.initiator.clear_ranging_session_callback_events()
1450    try:
1451      self.initiator.verify_callback_received("ReportReceived")
1452    except TimeoutError:
1453      asserts.fail(
1454          "Should receive ranging reports when the app is in foreground"
1455      )
1456    self.responder.stop_ranging()
1457    self.initiator.stop_ranging()
1458
1459  def test_ranging_nearby_share_profile_verify_app_in_bg_stops_session(self):
1460    """Verifies stop session callback with app staying in the background.
1461
1462    Steps:
1463      1. Verifies ranging with default Fira parameters.
1464      2. Move app to background.
1465      3. Ensures the app does not receive range data notifications
1466      4. Remain in background.
1467      5. Ensures the session is stopped within 4 mins.
1468    """
1469    asserts.skip_if(
1470        self._is_bg_ranging_supported(self.initiator),
1471        f"Bg ranging is supported on {self.initiator}",
1472    )
1473    initiator_params = uwb_ranging_params.UwbRangingParams(
1474        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1475        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1476        device_address=self.initiator_addr,
1477        destination_addresses=[self.responder_addr],
1478        ranging_interval_ms=200,
1479        slots_per_ranging_round=20,
1480        in_band_termination_attempt_count=3,
1481    )
1482    responder_params = uwb_ranging_params.UwbRangingParams(
1483        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1484        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1485        device_address=self.responder_addr,
1486        destination_addresses=[self.initiator_addr],
1487        ranging_interval_ms=200,
1488        slots_per_ranging_round=20,
1489        in_band_termination_attempt_count=3,
1490    )
1491    self._verify_one_to_one_ranging(
1492        self.initiator,
1493        self.responder,
1494        initiator_params,
1495        responder_params,
1496        self.responder_addr,
1497    )
1498
1499    self._move_snippet_to_bg(self.initiator)
1500    time.sleep(0.75)
1501    self.initiator.clear_ranging_session_callback_events()
1502    try:
1503      self.initiator.verify_callback_received("ReportReceived")
1504      asserts.fail(
1505          "Should not receive ranging reports when the app is in background"
1506      )
1507    except TimeoutError:
1508      # Expect to get a timeout error
1509      self.initiator.log.info("Did not get any ranging reports as expected")
1510
1511    # Verify session is stopped in the next 4 minutes.
1512    try:
1513      self.initiator.verify_callback_received("Stopped", timeout=60 * 4)
1514    except TimeoutError:
1515      asserts.fail(
1516          "Should receive ranging stop when the app is in background"
1517      )
1518
1519  def test_ranging_nearby_share_profile_bg_fails(self):
1520    """Verifies opening a ranging session fails if app is in background.
1521
1522    Steps:
1523      1. Move app to background.
1524      2. Ensures the app cannot open session.
1525    """
1526    asserts.skip_if(
1527        self._is_bg_ranging_supported(self.initiator),
1528        f"Bg ranging is supported on {self.initiator}",
1529    )
1530    initiator_params = uwb_ranging_params.UwbRangingParams(
1531        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1532        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1533        device_address=self.initiator_addr,
1534        destination_addresses=[self.responder_addr],
1535        ranging_interval_ms=200,
1536        slots_per_ranging_round=20,
1537        in_band_termination_attempt_count=3,
1538    )
1539    self._move_snippet_to_bg(self.initiator)
1540    self.initiator.open_fira_ranging(initiator_params, expect_to_succeed=False)
1541
1542  def test_ranging_nearby_share_profile_no_valid_reports_stops_session(self):
1543    """Verifies ranging reports not received if peer not available.
1544
1545    Steps:
1546      1. Verifies ranging with default Fira parameters.
1547      2. Reboot the responder to terminate session and cause report errors.
1548      3. Ensures the session is stopped within 2 mins.
1549    """
1550    initiator_params = uwb_ranging_params.UwbRangingParams(
1551        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1552        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1553        device_address=self.initiator_addr,
1554        destination_addresses=[self.responder_addr],
1555        ranging_interval_ms=200,
1556        slots_per_ranging_round=20,
1557        in_band_termination_attempt_count=3,
1558    )
1559    responder_params = uwb_ranging_params.UwbRangingParams(
1560        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1561        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1562        device_address=self.responder_addr,
1563        destination_addresses=[self.initiator_addr],
1564        ranging_interval_ms=200,
1565        slots_per_ranging_round=20,
1566        in_band_termination_attempt_count=3,
1567    )
1568    self._verify_one_to_one_ranging(self.initiator, self.responder,
1569                                    initiator_params, responder_params,
1570                                    self.responder_addr)
1571
1572    # Reboot responder and ensure peer is no longer seen in ranging reports
1573    def reboot_responder():
1574      self.responder.ad.reboot()
1575      self.responder.clear_all_ranging_sessions()
1576      uwb_test_utils.initialize_uwb_country_code_if_not_set(self.responder.ad)
1577
1578    # create a thread to reboot the responder and not block the main test.
1579    thread = threading.Thread(target=reboot_responder)
1580    thread.start()
1581
1582    time.sleep(0.75)
1583    self.initiator.clear_ranging_session_callback_events()
1584    try:
1585      uwb_test_utils.verify_peer_found(self.initiator, self.responder_addr)
1586      asserts.fail("Peer found even though it was rebooted.")
1587    except signals.TestFailure:
1588      self.initiator.log.info("Peer %s not found as expected",
1589                              self.responder_addr)
1590
1591    # Wait for 2 mins to stop the session.
1592    try:
1593      self.initiator.verify_callback_received("Stopped", timeout=60*2)
1594    except TimeoutError:
1595       asserts.fail(
1596           "Should receive ranging stop when peer is no longer present")
1597
1598    # Ensure the responder is back after reboot.
1599    thread.join()
1600
1601  def test_ranging_device_tracker_profile_max_sessions_reject(self):
1602    """Verifies opening session fails after max sessions opened.
1603
1604    Steps:
1605      1. Retrieves the max # of FIRA ranging sessions supported - X.
1606      2. Starts X sessions between the 2 devices are successful.
1607      3. Ensure that X + 1 session is rejected.
1608    """
1609    initiator_max_fira_ranging_sessions = (
1610        self.initiator.ad.uwb
1611        .getSpecificationInfo()["fira"]["max_ranging_session_number"])
1612    responder_max_fira_ranging_sessions = (
1613        self.responder.ad.uwb
1614        .getSpecificationInfo()["fira"]["max_ranging_session_number"])
1615    max_fira_ranging_sessions = min(initiator_max_fira_ranging_sessions,
1616                                    responder_max_fira_ranging_sessions)
1617    initiator_params = uwb_ranging_params.UwbRangingParams(
1618        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_INITIATOR,
1619        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLLER,
1620        device_address=self.initiator_addr,
1621        destination_addresses=[self.responder_addr],
1622        multi_node_mode=uwb_ranging_params.FiraParamEnums
1623        .MULTI_NODE_MODE_UNICAST,
1624        ranging_interval_ms=240,
1625        slots_per_ranging_round=6,
1626        in_band_termination_attempt_count=3,
1627    )
1628    responder_params = uwb_ranging_params.UwbRangingParams(
1629        device_role=uwb_ranging_params.FiraParamEnums.DEVICE_ROLE_RESPONDER,
1630        device_type=uwb_ranging_params.FiraParamEnums.DEVICE_TYPE_CONTROLEE,
1631        device_address=self.responder_addr,
1632        destination_addresses=[self.initiator_addr],
1633        multi_node_mode=uwb_ranging_params.FiraParamEnums
1634        .MULTI_NODE_MODE_UNICAST,
1635        ranging_interval_ms=240,
1636        slots_per_ranging_round=6,
1637        in_band_termination_attempt_count=3,
1638    )
1639    for i in range(max_fira_ranging_sessions):
1640      initiator_params.update(session_id=10+i)
1641      responder_params.update(session_id=10+i)
1642      self._verify_one_to_one_ranging(self.initiator, self.responder,
1643                                      initiator_params, responder_params,
1644                                      self.responder_addr, session=i)
1645    # This should fail.
1646    if max_fira_ranging_sessions == initiator_max_fira_ranging_sessions:
1647      initiator_params.update(session_id=10+max_fira_ranging_sessions)
1648      self.initiator.open_fira_ranging(initiator_params,
1649                                       session=max_fira_ranging_sessions,
1650                                       expect_to_succeed=False)
1651    if max_fira_ranging_sessions == responder_max_fira_ranging_sessions:
1652      responder_params.update(session_id=10+max_fira_ranging_sessions)
1653      self.responder.open_fira_ranging(responder_params,
1654                                       session=max_fira_ranging_sessions,
1655                                       expect_to_succeed=False)
1656
1657    for i in range(max_fira_ranging_sessions):
1658      self.responder.stop_ranging(session=i)
1659      self.initiator.stop_ranging(session=i)
1660
1661
1662if __name__ == "__main__":
1663  if "--" in sys.argv:
1664    index = sys.argv.index("--")
1665    sys.argv = sys.argv[:1] + sys.argv[index + 1:]
1666  suite_runner.run_suite([RangingTest])
1667