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