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