1 #/usr/bin/env python3.4 2 # 3 # Copyright (C) 2016 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 # use this file except in compliance with the License. You may obtain a copy of 7 # the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 # License for the specific language governing permissions and limitations under 15 # the License. 16 """ 17 This test script exercises different opportunistic scan scenarios. 18 It is expected that the second AndroidDevice is able to advertise. 19 20 This test script was designed with this setup in mind: 21 Shield box one: Android Device, Android Device 22 """ 23 24 from queue import Empty 25 26 from acts.test_decorators import test_tracker_info 27 from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest 28 from acts.test_utils.bt.bt_constants import ble_scan_settings_modes 29 from acts.test_utils.bt.bt_constants import ble_scan_settings_modes 30 from acts.test_utils.bt.bt_test_utils import batch_scan_result 31 from acts.test_utils.bt.bt_test_utils import cleanup_scanners_and_advertisers 32 from acts.test_utils.bt.bt_test_utils import generate_ble_advertise_objects 33 from acts.test_utils.bt.bt_test_utils import generate_ble_scan_objects 34 from acts.test_utils.bt.bt_test_utils import reset_bluetooth 35 from acts.test_utils.bt.bt_constants import scan_result 36 37 38 class BleOpportunisticScanTest(BluetoothBaseTest): 39 default_timeout = 10 40 max_scan_instances = 28 41 report_delay = 2000 42 scan_callbacks = [] 43 adv_callbacks = [] 44 active_scan_callback_list = [] 45 active_adv_callback_list = [] 46 47 def __init__(self, controllers): 48 BluetoothBaseTest.__init__(self, controllers) 49 self.scn_ad = self.android_devices[0] 50 self.adv_ad = self.android_devices[1] 51 52 def teardown_test(self): 53 cleanup_scanners_and_advertisers( 54 self.scn_ad, self.active_scan_callback_list, self.adv_ad, 55 self.active_adv_callback_list) 56 self.active_adv_callback_list = [] 57 self.active_scan_callback_list = [] 58 59 def on_exception(self, test_name, begin_time): 60 reset_bluetooth(self.android_devices) 61 62 def _setup_generic_advertisement(self): 63 adv_callback, adv_data, adv_settings = generate_ble_advertise_objects( 64 self.adv_ad.droid) 65 self.adv_ad.droid.bleStartBleAdvertising(adv_callback, adv_data, 66 adv_settings) 67 self.active_adv_callback_list.append(adv_callback) 68 69 def _verify_no_events_found(self, event_name): 70 try: 71 event = self.scn_ad.ed.pop_event(event_name, self.default_timeout) 72 self.log.error("Found an event when none was expected: {}".format( 73 event)) 74 return False 75 except Empty: 76 self.log.info("No scan result found as expected.") 77 return True 78 79 @BluetoothBaseTest.bt_test_wrap 80 @test_tracker_info(uuid='6bccfbea-3734-4504-8ea9-3511ad17a3e0') 81 def test_scan_result_no_advertisement(self): 82 """Test opportunistic scan with no advertisement. 83 84 Tests opportunistic scan where there are no advertisements. This should 85 not find any onScanResults. 86 87 Steps: 88 1. Initialize scanner with scan mode set to opportunistic mode. 89 2. Start scanning on dut 0 90 3. Pop onScanResults event on the scanner 91 92 Expected Result: 93 Find no advertisements with the opportunistic scan instance. 94 95 Returns: 96 Pass if True 97 Fail if False 98 99 TAGS: LE, Advertising, Scanning, Opportunistic Scan 100 Priority: 1 101 """ 102 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 103 'opportunistic']) 104 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 105 self.scn_ad.droid) 106 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 107 scan_callback) 108 self.active_scan_callback_list.append(scan_callback) 109 if not self._verify_no_events_found(scan_result.format(scan_callback)): 110 return False 111 self.scn_ad.droid.bleStopBleScan(scan_callback) 112 return True 113 114 @BluetoothBaseTest.bt_test_wrap 115 @test_tracker_info(uuid='8430bc57-925c-4b70-a62e-cd34df264ca1') 116 def test_batch_scan_result_no_advertisement(self): 117 """Test batch opportunistic scan without an advertisement. 118 119 Tests opportunistic scan where there are no advertisements. This should 120 not find any onBatchScanResult. 121 122 Steps: 123 1. Initialize scanner with scan mode set to opportunistic mode. 124 2. Set report delay seconds such that onBatchScanResult events are 125 expected 126 2. Start scanning on dut 0 127 3. Pop onBatchScanResult event on the scanner 128 129 Expected Result: 130 Find no advertisements with the opportunistic scan instance. 131 132 Returns: 133 Pass if True 134 Fail if False 135 136 TAGS: LE, Advertising, Scanning, Opportunistic Scan, Batch Scanning 137 Priority: 1 138 """ 139 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 140 'opportunistic']) 141 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 142 self.report_delay) 143 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 144 self.scn_ad.droid) 145 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 146 scan_callback) 147 self.active_scan_callback_list.append(scan_callback) 148 if not self._verify_no_events_found( 149 batch_scan_result.format(scan_callback)): 150 return False 151 self.scn_ad.droid.bleStopBleScan(scan_callback) 152 return True 153 154 @BluetoothBaseTest.bt_test_wrap 155 @test_tracker_info(uuid='4613cb67-0f54-494e-8a56-2e8ce56fad41') 156 def test_scan_result(self): 157 """Test opportunistic scan with an advertisement. 158 159 Tests opportunistic scan where it will only report scan results when 160 other registered scanners find results. 161 162 Steps: 163 1. Initialize advertiser and start advertisement on dut1 164 2. Initialize scanner with scan mode set to opportunistic mode on dut0 165 and start scanning 166 3. Try to find an event, expect none. 167 4. Start a second scanner on dut0, with any other mode set 168 5. Pop onScanResults event on the second scanner 169 6. Pop onScanResults event on the first scanner 170 171 Expected Result: 172 Scan result is found on the opportunistic scan instance. 173 174 Returns: 175 Pass if True 176 Fail if False 177 178 TAGS: LE, Advertising, Scanning, Opportunistic Scan 179 Priority: 1 180 """ 181 self._setup_generic_advertisement() 182 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 183 'opportunistic']) 184 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 185 self.scn_ad.droid) 186 187 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 188 scan_callback) 189 self.active_scan_callback_list.append(scan_callback) 190 if not self._verify_no_events_found(scan_result.format(scan_callback)): 191 return False 192 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 193 'low_latency']) 194 filter_list2, scan_settings2, scan_callback2 = ( 195 generate_ble_scan_objects(self.scn_ad.droid)) 196 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 197 scan_callback2) 198 self.active_scan_callback_list.append(scan_callback2) 199 try: 200 self.scn_ad.ed.pop_event( 201 scan_result.format(scan_callback2), self.default_timeout) 202 except Empty: 203 self.log.error("Non-Opportunistic scan found no scan results.") 204 return False 205 try: 206 self.scn_ad.ed.pop_event( 207 scan_result.format(scan_callback), self.default_timeout) 208 except Empty: 209 self.log.error("Opportunistic scan found no scan results.") 210 return False 211 return True 212 213 @BluetoothBaseTest.bt_test_wrap 214 @test_tracker_info(uuid='5b46fefc-70ef-48a0-acf4-35077cd72202') 215 def test_batch_scan_result(self): 216 """Test batch opportunistic scan with advertisement. 217 218 Tests opportunistic scan where it will only report scan results when 219 other registered scanners find results. Set the report delay millis such 220 that an onBatchScanResult is expected. 221 222 Steps: 223 1. Initialize advertiser and start advertisement on dut1 224 2. Initialize scanner with scan mode set to opportunistic mode and 225 set scan settings report delay seconds such that a batch scan is 226 expected 227 3. Start scanning on dut 0 228 4. Try to find an event, expect none. 229 5. Start a second scanner on dut0, with any other mode set and set scan 230 settings report delay millis such that an onBatchScanResult is expected 231 6. Pop onBatchScanResult event on the second scanner 232 7. Pop onBatchScanResult event on the first scanner 233 234 Expected Result: 235 Find a batch scan result on both opportunistic scan instances. 236 237 Returns: 238 Pass if True 239 Fail if False 240 241 TAGS: LE, Advertising, Scanning, Opportunistic Scan, Batch Scanning 242 Priority: 1 243 """ 244 self._setup_generic_advertisement() 245 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 246 'opportunistic']) 247 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 248 self.report_delay) 249 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 250 self.scn_ad.droid) 251 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 252 scan_callback) 253 self.active_scan_callback_list.append(scan_callback) 254 if not self._verify_no_events_found( 255 batch_scan_result.format(scan_callback)): 256 return False 257 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 258 self.report_delay) 259 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 260 'low_latency']) 261 filter_list2, scan_settings2, scan_callback2 = generate_ble_scan_objects( 262 self.scn_ad.droid) 263 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 264 scan_callback2) 265 self.active_scan_callback_list.append(scan_callback2) 266 try: 267 self.scn_ad.ed.pop_event( 268 batch_scan_result.format(scan_callback2), self.default_timeout) 269 except Empty: 270 self.log.error("Non-Opportunistic scan found no scan results.") 271 return False 272 try: 273 self.scn_ad.ed.pop_event( 274 batch_scan_result.format(scan_callback), self.default_timeout) 275 except Empty: 276 self.log.error("Opportunistic scan found no scan results.") 277 return False 278 return True 279 280 @BluetoothBaseTest.bt_test_wrap 281 @test_tracker_info(uuid='fd85d95e-dc8c-48c1-8d8a-83c3475755ff') 282 def test_batch_scan_result_not_expected(self): 283 """Test opportunistic batch scan without expecting an event. 284 285 Tests opportunistic scan where it will only report scan results when 286 other registered scanners find results. Set the report delay millis such 287 that a batch scan is not expected. 288 289 Steps: 290 1. Initialize advertiser and start advertisement on dut1 291 2. Initialize scanner with scan mode set to opportunistic mode and 292 set scan settings report delay seconds such that a batch scan is 293 expected. 294 3. Start scanning on dut 0 295 4. Try to find an event, expect none. 296 5. Start a second scanner on dut0, with any other mode set and set scan 297 settings report delay millis to 0 such that an onBatchScanResult is not 298 expected. 299 6. Pop onScanResults event on the second scanner 300 7. Pop onBatchScanResult event on the first scanner 301 302 Expected Result: 303 Batch scan result is not expected on opportunistic scan instance. 304 305 Returns: 306 Pass if True 307 Fail if False 308 309 TAGS: LE, Advertising, Scanning, Opportunistic Scan, Batch Scanning 310 Priority: 1 311 """ 312 self._setup_generic_advertisement() 313 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 314 'opportunistic']) 315 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 316 self.report_delay) 317 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 318 self.scn_ad.droid) 319 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 320 scan_callback) 321 self.active_scan_callback_list.append(scan_callback) 322 if not self._verify_no_events_found( 323 batch_scan_result.format(scan_callback)): 324 325 return False 326 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 327 'low_latency']) 328 filter_list2, scan_settings2, scan_callback2 = ( 329 generate_ble_scan_objects(self.scn_ad.droid)) 330 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 331 scan_callback2) 332 self.active_scan_callback_list.append(scan_callback2) 333 try: 334 self.scn_ad.ed.pop_event( 335 scan_result.format(scan_callback2), self.default_timeout) 336 except Empty: 337 self.log.error("Non-Opportunistic scan found no scan results.") 338 return False 339 return self._verify_no_events_found( 340 batch_scan_result.format(scan_callback)) 341 342 @BluetoothBaseTest.bt_test_wrap 343 @test_tracker_info(uuid='6138592e-8fd5-444f-9a7c-25cd9695644a') 344 def test_scan_result_not_expected(self): 345 """Test opportunistic scan without expecting an event. 346 347 Tests opportunistic scan where it will only report batch scan results 348 when other registered scanners find results. 349 350 Steps: 351 1. Initialize advertiser and start advertisement on dut1 352 2. Initialize scanner with scan mode set to opportunistic mode. 353 3. Start scanning on dut 0 354 4. Try to find an event, expect none. 355 5. Start a second scanner on dut0, with any other mode set and set scan 356 settings 357 report delay millis such that an onBatchScanResult is expected 358 6. Pop onBatchScanResult event on the second scanner 359 7. Pop onScanResults event on the first scanner 360 361 Expected Result: 362 Scan result is not expected on opportunistic scan instance. 363 364 Returns: 365 Pass if True 366 Fail if False 367 368 TAGS: LE, Advertising, Scanning, Opportunistic Scan 369 Priority: 1 370 """ 371 self._setup_generic_advertisement() 372 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 373 'opportunistic']) 374 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 375 self.scn_ad.droid) 376 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 377 scan_callback) 378 self.active_scan_callback_list.append(scan_callback) 379 if not self._verify_no_events_found(scan_result.format(scan_callback)): 380 return False 381 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 382 self.report_delay) 383 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 384 'low_latency']) 385 filter_list2, scan_settings2, scan_callback2 = ( 386 generate_ble_scan_objects(self.scn_ad.droid)) 387 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 388 scan_callback2) 389 self.active_scan_callback_list.append(scan_callback2) 390 try: 391 self.scn_ad.ed.pop_event( 392 batch_scan_result.format(scan_callback2), self.default_timeout) 393 except Empty: 394 self.log.error("Non-Opportunistic scan found no scan results.") 395 return False 396 return self._verify_no_events_found(scan_result.format(scan_callback)) 397 398 @BluetoothBaseTest.bt_test_wrap 399 @test_tracker_info(uuid='f7aba3d9-d3f7-4b2f-976e-441772705613') 400 def test_max_opportunistic_scan_instances(self): 401 """Test max number of opportunistic scan instances. 402 403 Tests max instances of opportunistic scans. Each instances should 404 find an onScanResults event. 405 406 Steps: 407 1. Initialize advertiser and start advertisement on dut1 408 2. Set scan settings to opportunistic scan on dut0 scan instance 409 3. Start scan scan from step 2 410 4. Repeat step two and three until there are max_scan_instances-1 scan 411 instances 412 5. Start a regular ble scan on dut0 with the last available scan 413 instance 414 6. Pop onScanResults event on all scan instances 415 416 Expected Result: 417 Each opportunistic scan instance finds a advertisement. 418 419 Returns: 420 Pass if True 421 Fail if False 422 423 TAGS: LE, Advertising, Scanning, Opportunistic Scan 424 Priority: 1 425 """ 426 self._setup_generic_advertisement() 427 for _ in range(self.max_scan_instances - 1): 428 self.scn_ad.droid.bleSetScanSettingsScanMode( 429 ble_scan_settings_modes['opportunistic']) 430 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 431 self.scn_ad.droid) 432 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 433 scan_callback) 434 self.active_scan_callback_list.append(scan_callback) 435 436 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 437 'low_latency']) 438 filter_list2, scan_settings2, scan_callback2 = ( 439 generate_ble_scan_objects(self.scn_ad.droid)) 440 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 441 scan_callback2) 442 self.active_scan_callback_list.append(scan_callback2) 443 444 for callback in self.active_scan_callback_list: 445 try: 446 self.scn_ad.ed.pop_event( 447 scan_result.format(callback), self.default_timeout) 448 except Empty: 449 self.log.error("No scan results found for callback {}".format( 450 callback)) 451 return False 452 return True 453 454 @BluetoothBaseTest.bt_test_wrap 455 @test_tracker_info(uuid='cf971f08-4d92-4046-bba6-b86a75aa773c') 456 def test_max_opportunistic_batch_scan_instances(self): 457 """Test max opportunistic batch scan instances. 458 459 Tests max instances of opportunistic batch scans. Each instances should 460 find an onBatchScanResult event. 461 462 Steps: 463 1. Initialize advertiser and start advertisement on dut1 464 2. Set scan settings to opportunistic scan on dut0 scan instance and 465 set report delay seconds such that an onBatchScanResult is expected 466 3. Start scan scan from step 2 467 4. Repeat step two and three until there are max_scan_instances-1 scan 468 instances 469 5. Start a regular ble scan on dut0 with the last available scan 470 instance 471 6. Pop onBatchScanResult event on all scan instances 472 473 Expected Result: 474 Each opportunistic scan instance finds an advertisement. 475 476 Returns: 477 Pass if True 478 Fail if False 479 480 TAGS: LE, Advertising, Scanning, Opportunistic Scan, Batch Scanning 481 Priority: 1 482 """ 483 self._setup_generic_advertisement() 484 for _ in range(self.max_scan_instances - 1): 485 self.scn_ad.droid.bleSetScanSettingsScanMode( 486 ble_scan_settings_modes['opportunistic']) 487 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 488 self.report_delay) 489 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 490 self.scn_ad.droid) 491 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 492 scan_callback) 493 self.active_scan_callback_list.append(scan_callback) 494 495 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 496 'low_latency']) 497 self.scn_ad.droid.bleSetScanSettingsReportDelayMillis( 498 self.report_delay) 499 filter_list2, scan_settings2, scan_callback2 = ( 500 generate_ble_scan_objects(self.scn_ad.droid)) 501 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 502 scan_callback2) 503 self.active_scan_callback_list.append(scan_callback2) 504 505 for callback in self.active_scan_callback_list: 506 try: 507 self.scn_ad.ed.pop_event( 508 batch_scan_result.format(callback), self.default_timeout) 509 except Empty: 510 self.log.error("No scan results found for callback {}".format( 511 callback)) 512 return True 513 514 @BluetoothBaseTest.bt_test_wrap 515 @test_tracker_info(uuid='965d84ef-11a7-418a-97e9-2a441c6de776') 516 def test_discover_opportunistic_scan_result_off_secondary_scan_filter( 517 self): 518 """Test opportunistic scan result from secondary scan filter. 519 520 Tests opportunistic scan where the secondary scan instance does not find 521 an advertisement but the scan instance with scan mode set to 522 opportunistic scan will find an advertisement. 523 524 Steps: 525 1. Initialize advertiser and start advertisement on dut1 (make sure the 526 advertisement is not advertising the device name) 527 2. Set scan settings to opportunistic scan on dut0 scan instance 528 3. Start scan scan from step 2 529 4. Try to find an event, expect none 530 5. Start a second scanner on dut0, with any other mode set and set the 531 scan filter device name to "opp_test" 532 6. Pop onScanResults from the second scanner 533 7. Expect no events 534 8. Pop onScanResults from the first scanner 535 536 Expected Result: 537 Opportunistic scan instance finds an advertisement. 538 539 Returns: 540 Pass if True 541 Fail if False 542 543 TAGS: LE, Advertising, Scanning, Opportunistic Scan 544 Priority: 1 545 """ 546 self._setup_generic_advertisement() 547 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 548 'opportunistic']) 549 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 550 self.scn_ad.droid) 551 552 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 553 scan_callback) 554 self.active_scan_callback_list.append(scan_callback) 555 if not self._verify_no_events_found(scan_result.format(scan_callback)): 556 return False 557 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 558 'low_latency']) 559 self.scn_ad.droid.bleSetScanFilterDeviceName("opp_test") 560 filter_list2, scan_settings2, scan_callback2 = ( 561 generate_ble_scan_objects(self.scn_ad.droid)) 562 self.scn_ad.droid.bleBuildScanFilter(filter_list2) 563 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 564 scan_callback2) 565 self.active_scan_callback_list.append(scan_callback2) 566 if not self._verify_no_events_found( 567 scan_result.format(scan_callback2)): 568 return False 569 try: 570 self.scn_ad.ed.pop_event( 571 scan_result.format(scan_callback), self.default_timeout) 572 except Empty: 573 self.log.error("Opportunistic scan found no scan results.") 574 return False 575 return True 576 577 @BluetoothBaseTest.bt_test_wrap 578 @test_tracker_info(uuid='13b0a83f-e96e-4d64-84ef-66351ec5054c') 579 def test_negative_opportunistic_scan_filter_result_off_secondary_scan_result( 580 self): 581 """Test opportunistic scan not found scenario. 582 583 Tests opportunistic scan where the secondary scan instance does find an 584 advertisement but the scan instance with scan mode set to opportunistic 585 scan does not find an advertisement due to mismatched scan filters. 586 587 Steps: 588 1. Initialize advertiser and start advertisement on dut1 (make sure the 589 advertisement is not advertising the device name) 590 2. Set scan settings to opportunistic scan on dut0 scan instance and set 591 the scan filter device name to "opp_test" 592 3. Start scan scan from step 2 593 4. Try to find an event, expect none 594 5. Start a second scanner on dut0, with any other mode set 595 6. Pop onScanResults from the second scanner 596 7. Pop onScanResults from the first scanner 597 8. Expect no events 598 599 Expected Result: 600 Opportunistic scan instance doesn't find any advertisements. 601 602 Returns: 603 Pass if True 604 Fail if False 605 606 TAGS: LE, Advertising, Scanning, Opportunistic Scan 607 Priority: 1 608 """ 609 self._setup_generic_advertisement() 610 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 611 'opportunistic']) 612 self.scn_ad.droid.bleSetScanFilterDeviceName("opp_test") 613 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 614 self.scn_ad.droid) 615 self.scn_ad.droid.bleBuildScanFilter(filter_list) 616 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 617 scan_callback) 618 self.active_scan_callback_list.append(scan_callback) 619 if not self._verify_no_events_found(scan_result.format(scan_callback)): 620 return False 621 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 622 'low_latency']) 623 filter_list2, scan_settings2, scan_callback2 = ( 624 generate_ble_scan_objects(self.scn_ad.droid)) 625 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 626 scan_callback2) 627 self.active_scan_callback_list.append(scan_callback2) 628 try: 629 self.scn_ad.ed.pop_event( 630 scan_result.format(scan_callback2), self.default_timeout) 631 except Empty: 632 self.log.error("Non-Opportunistic scan found no scan results.") 633 return False 634 return self._verify_no_events_found(scan_result.format(scan_callback)) 635 636 @BluetoothBaseTest.bt_test_wrap 637 @test_tracker_info(uuid='087f60b2-f6a1-4919-b4c5-cdf3debcfeff') 638 def test_opportunistic_scan_filter_result_off_secondary_scan_result(self): 639 """Test opportunistic scan from a secondary scan result. 640 641 Tests opportunistic scan where the scan filters are the same between the 642 first scan instance with opportunistic scan set and the second instance 643 with any other mode set. 644 645 Steps: 646 1. Initialize advertiser and start advertisement on dut1 647 2. On dut0, set the scan settings mode to opportunistic scan and set 648 the scan filter device name to the advertiser's device name 649 3. Start scan scan from step 2 650 4. Try to find an event, expect none 651 5. Start a second scanner on dut0, with any other mode set and set the 652 scan filter device name to the advertiser's device name 653 6. Pop onScanResults from the second scanner 654 7. Pop onScanResults from the first scanner 655 656 Expected Result: 657 Opportunistic scan instance finds a advertisement. 658 659 Returns: 660 Pass if True 661 Fail if False 662 663 TAGS: LE, Advertising, Scanning, Opportunistic Scan 664 Priority: 1 665 """ 666 self.adv_ad.droid.bleSetAdvertiseDataIncludeDeviceName(True) 667 self._setup_generic_advertisement() 668 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName() 669 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 670 'opportunistic']) 671 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name) 672 filter_list, scan_settings, scan_callback = generate_ble_scan_objects( 673 self.scn_ad.droid) 674 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, 675 scan_callback) 676 self.active_scan_callback_list.append(scan_callback) 677 if not self._verify_no_events_found(scan_result.format(scan_callback)): 678 return False 679 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 680 'low_latency']) 681 filter_list2, scan_settings2, scan_callback2 = ( 682 generate_ble_scan_objects(self.scn_ad.droid)) 683 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name) 684 self.scn_ad.droid.bleBuildScanFilter(filter_list2) 685 self.scn_ad.droid.bleStartBleScan(filter_list2, scan_settings2, 686 scan_callback2) 687 self.active_scan_callback_list.append(scan_callback2) 688 try: 689 self.scn_ad.ed.pop_event( 690 scan_result.format(scan_callback2), self.default_timeout) 691 except Empty: 692 self.log.error("Opportunistic scan found no scan results.") 693 return False 694 try: 695 self.scn_ad.ed.pop_event( 696 scan_result.format(scan_callback), self.default_timeout) 697 except Empty: 698 self.log.error("Non-Opportunistic scan found no scan results.") 699 return False 700 return True 701