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