Home | History | Annotate | Download | only in scan
      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