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 onLost/onFound scenarios.
     18 """
     19 
     20 from queue import Empty
     21 from acts.test_decorators import test_tracker_info
     22 from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
     23 from acts.test_utils.bt.bt_constants import ble_advertise_settings_modes
     24 from acts.test_utils.bt.bt_constants import ble_scan_settings_callback_types
     25 from acts.test_utils.bt.BleEnum import ScanSettingsMatchMode
     26 from acts.test_utils.bt.BleEnum import ScanSettingsMatchNum
     27 from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
     28 from acts.test_utils.bt.bt_constants import ble_scan_settings_match_modes
     29 from acts.test_utils.bt.bt_constants import ble_scan_settings_match_nums
     30 from acts.test_utils.bt.bt_constants import adv_succ
     31 from acts.test_utils.bt.bt_test_utils import cleanup_scanners_and_advertisers
     32 from acts.test_utils.bt.bt_test_utils import reset_bluetooth
     33 from acts.test_utils.bt.bt_constants import scan_result
     34 
     35 
     36 class BleOnLostOnFoundTest(BluetoothBaseTest):
     37     default_timeout = 10
     38     max_scan_instances = 28
     39     active_scan_callback_list = []
     40     active_adv_callback_list = []
     41 
     42     def __init__(self, controllers):
     43         BluetoothBaseTest.__init__(self, controllers)
     44         self.scn_ad = self.android_devices[0]
     45         self.adv_ad = self.android_devices[1]
     46 
     47     def teardown_test(self):
     48         cleanup_scanners_and_advertisers(
     49             self.scn_ad, self.active_adv_callback_list, self.adv_ad,
     50             self.active_adv_callback_list)
     51         self.active_adv_callback_list = []
     52         self.active_scan_callback_list = []
     53 
     54     def on_exception(self, test_name, begin_time):
     55         reset_bluetooth(self.android_devices)
     56 
     57     def _start_generic_advertisement_include_device_name(self):
     58         self.adv_ad.droid.bleSetAdvertiseDataIncludeDeviceName(True)
     59         self.adv_ad.droid.bleSetAdvertiseSettingsAdvertiseMode(
     60             ble_advertise_settings_modes['low_latency'])
     61         advertise_data = self.adv_ad.droid.bleBuildAdvertiseData()
     62         advertise_settings = self.adv_ad.droid.bleBuildAdvertiseSettings()
     63         advertise_callback = self.adv_ad.droid.bleGenBleAdvertiseCallback()
     64         self.adv_ad.droid.bleStartBleAdvertising(
     65             advertise_callback, advertise_data, advertise_settings)
     66         self.adv_ad.ed.pop_event(
     67             adv_succ.format(advertise_callback), self.default_timeout)
     68         self.active_adv_callback_list.append(advertise_callback)
     69         return advertise_callback
     70 
     71     def _verify_no_events_found(self, event_name):
     72         try:
     73             self.scn_ad.ed.pop_event(event_name, self.default_timeout)
     74             self.log.error("Found an event when none was expected.")
     75             return False
     76         except Empty:
     77             self.log.info("No scan result found as expected.")
     78             return True
     79 
     80     @BluetoothBaseTest.bt_test_wrap
     81     @test_tracker_info(uuid='9bd7fd09-71c9-4623-90f0-9a895eb37409')
     82     def test_onlost_onfound_defaults(self):
     83         """Test generic onlost/onfound defaults.
     84 
     85         Tests basic onFound/onLost functionality.
     86 
     87         Steps:
     88         1. Setup dut0 scanner and start scan with this setup:
     89           Scan Mode: SCAN_MODE_LOW_LATENCY
     90           Callback Type: CALLBACK_TYPE_FOUND_AND_LOST
     91           Match Mode: AGGRESSIVE
     92           Num of Matches: MATCH_NUM_ONE_ADVERTISEMENT
     93           Filter: Device name of dut1
     94         2. Start an advertisement on dut1, include device name
     95         3. Find an onFound event
     96         4. Stop the advertisement on dut1
     97         5. Find an onLost event
     98 
     99         Expected Result:
    100         Find an onLost and an onFound event successfully.
    101 
    102         Returns:
    103           Pass if True
    104           Fail if False
    105 
    106         TAGS: LE, Advertising, Scanning, onLost, onFound
    107         Priority: 0
    108         """
    109         filter_list = self.scn_ad.droid.bleGenFilterList()
    110         self.scn_ad.droid.bleSetScanFilterDeviceName(
    111             self.adv_ad.droid.bluetoothGetLocalName())
    112         self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
    113             'low_latency'])
    114         self.scn_ad.droid.bleSetScanSettingsCallbackType(
    115             ble_scan_settings_callback_types['found_and_lost'])
    116         self.scn_ad.droid.bleSetScanSettingsMatchMode(
    117             ble_scan_settings_match_modes['aggresive'])
    118         self.scn_ad.droid.bleSetScanSettingsNumOfMatches(
    119             ble_scan_settings_match_nums['one'])
    120         scan_settings = self.scn_ad.droid.bleBuildScanSetting()
    121         scan_callback = self.scn_ad.droid.bleGenScanCallback()
    122         self.scn_ad.droid.bleBuildScanFilter(filter_list)
    123         self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
    124                                           scan_callback)
    125         self.active_scan_callback_list.append(scan_callback)
    126         adv_callback = self._start_generic_advertisement_include_device_name()
    127         event = self.scn_ad.ed.pop_event(
    128             scan_result.format(scan_callback), self.default_timeout * 3)
    129         found_callback_type = event['data']['CallbackType']
    130         if event['data']['CallbackType'] != ble_scan_settings_callback_types[
    131                 'first_match']:
    132             self.log.info(
    133                 "Found Callbacreset_bluetoothkType:{}, Expected CallbackType:{}".
    134                 format(found_callback_type, ble_scan_settings_callback_types[
    135                     'first_match']))
    136             return False
    137         self.adv_ad.droid.bleStopBleAdvertising(adv_callback)
    138         event = self.scn_ad.ed.pop_event(
    139             scan_result.format(scan_callback), self.default_timeout * 4)
    140         found_callback_type = event['data']['CallbackType']
    141         if found_callback_type != ble_scan_settings_callback_types[
    142                 'match_lost']:
    143             self.log.info(
    144                 "Found CallbackType:{}, Expected CallbackType:{}".format(
    145                     found_callback_type, ble_scan_settings_callback_types[
    146                         'match_lost']))
    147             return False
    148         return True
    149 
    150     @BluetoothBaseTest.bt_test_wrap
    151     @test_tracker_info(uuid='10b48dc9-0c2a-46a3-8890-5cde3004a996')
    152     def test_onlost_onfound_match_mode_sticky(self):
    153         """Test generic onlost/onfound in sticky mode.
    154 
    155         Tests basic onFound/onLost functionality.
    156 
    157         Steps:
    158         1. Setup dut0 scanner and start scan with this setup:
    159           Scan Mode: SCAN_MODE_LOW_LATENCY
    160           Callback Type: CALLBACK_TYPE_FOUND_AND_LOST
    161           Match Mode: STICKY
    162           Num of Matches: MATCH_NUM_ONE_ADVERTISEMENT
    163           Filter: Device name of dut1
    164         2. Start an advertisement on dut1, include device name
    165         3. Find an onFound event
    166         4. Stop the advertisement on dut1
    167         5. Find an onLost event
    168 
    169         Expected Result:
    170         Find an onLost and an onFound event successfully.
    171 
    172         Returns:
    173           Pass if True
    174           Fail if False
    175 
    176         TAGS: LE, Advertising, Scanning, onLost, onFound
    177         Priority: 1
    178         """
    179         filter_list = self.scn_ad.droid.bleGenFilterList()
    180         self.scn_ad.droid.bleSetScanFilterDeviceName(
    181             self.adv_ad.droid.bluetoothGetLocalName())
    182         self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
    183             'low_latency'])
    184         self.scn_ad.droid.bleSetScanSettingsCallbackType(
    185             ble_scan_settings_callback_types['found_and_lost'])
    186         self.scn_ad.droid.bleSetScanSettingsMatchMode(
    187             ble_scan_settings_match_modes['sticky'])
    188         self.scn_ad.droid.bleSetScanSettingsNumOfMatches(
    189             ble_scan_settings_match_nums['one'])
    190         scan_settings = self.scn_ad.droid.bleBuildScanSetting()
    191         scan_callback = self.scn_ad.droid.bleGenScanCallback()
    192         self.scn_ad.droid.bleBuildScanFilter(filter_list)
    193         self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
    194                                           scan_callback)
    195         self.active_scan_callback_list.append(scan_callback)
    196         adv_callback = self._start_generic_advertisement_include_device_name()
    197         event = self.scn_ad.ed.pop_event(
    198             scan_result.format(scan_callback), self.default_timeout * 3)
    199         found_callback_type = event['data']['CallbackType']
    200         if event['data']['CallbackType'] != ble_scan_settings_callback_types[
    201                 'first_match']:
    202             self.log.info(
    203                 "Found CallbackType:{}, Expected CallbackType:{}".format(
    204                     found_callback_type, ble_scan_settings_callback_types[
    205                         'first_match']))
    206             return False
    207         self.adv_ad.droid.bleStopBleAdvertising(adv_callback)
    208         event = self.scn_ad.ed.pop_event(
    209             scan_result.format(scan_callback), self.default_timeout * 4)
    210         found_callback_type = event['data']['CallbackType']
    211         if found_callback_type != ble_scan_settings_callback_types[
    212                 'match_lost']:
    213             self.log.info(
    214                 "Found CallbackType:{}, Expected CallbackType:{}".format(
    215                     found_callback_type, ble_scan_settings_callback_types[
    216                         'match_lost']))
    217             return False
    218         return True
    219 
    220     @BluetoothBaseTest.bt_test_wrap
    221     @test_tracker_info(uuid='4fefed82-7800-41be-8272-aac076640fed')
    222     def test_onlost_onfound_match_num_few(self):
    223         """Test generic onlost/onfound num few.
    224 
    225         Tests basic onFound/onLost functionality.
    226 
    227         Steps:
    228         1. Setup dut0 scanner and start scan with this setup:
    229           Scan Mode: SCAN_MODE_LOW_LATENCY
    230           Callback Type: CALLBACK_TYPE_FOUND_AND_LOST
    231           Match Mode: AGGRESSIVE
    232           Num of Matches: MATCH_NUM_FEW_ADVERTISEMENT
    233           Filter: Device name of dut1
    234         2. Start an advertisement on dut1, include device name
    235         3. Find an onFound event
    236         4. Stop the advertisement on dut1
    237         5. Find an onLost event
    238 
    239         Expected Result:
    240         Find an onLost and an onFound event successfully.
    241 
    242         Returns:
    243           Pass if True
    244           Fail if False
    245 
    246         TAGS: LE, Advertising, Scanning, onLost, onFound
    247         Priority: 1
    248         """
    249         filter_list = self.scn_ad.droid.bleGenFilterList()
    250         self.scn_ad.droid.bleSetScanFilterDeviceName(
    251             self.adv_ad.droid.bluetoothGetLocalName())
    252         self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
    253             'low_latency'])
    254         self.scn_ad.droid.bleSetScanSettingsCallbackType(
    255             ble_scan_settings_callback_types['found_and_lost'])
    256         self.scn_ad.droid.bleSetScanSettingsMatchMode(
    257             ble_scan_settings_match_modes['aggresive'])
    258         self.scn_ad.droid.bleSetScanSettingsNumOfMatches(
    259             ble_scan_settings_match_nums['few'])
    260         scan_settings = self.scn_ad.droid.bleBuildScanSetting()
    261         scan_callback = self.scn_ad.droid.bleGenScanCallback()
    262         self.scn_ad.droid.bleBuildScanFilter(filter_list)
    263         self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
    264                                           scan_callback)
    265         self.active_scan_callback_list.append(scan_callback)
    266         adv_callback = self._start_generic_advertisement_include_device_name()
    267         event = self.scn_ad.ed.pop_event(
    268             scan_result.format(scan_callback), self.default_timeout * 3)
    269         found_callback_type = event['data']['CallbackType']
    270         if event['data']['CallbackType'] != ble_scan_settings_callback_types[
    271                 'first_match']:
    272             self.log.info(
    273                 "Found CallbackType:{}, Expected CallbackType:{}".format(
    274                     found_callback_type, ble_scan_settings_callback_types[
    275                         'first_match']))
    276             return False
    277         self.adv_ad.droid.bleStopBleAdvertising(adv_callback)
    278         event = self.scn_ad.ed.pop_event(
    279             scan_result.format(scan_callback), self.default_timeout * 4)
    280         found_callback_type = event['data']['CallbackType']
    281         if found_callback_type != ble_scan_settings_callback_types[
    282                 'match_lost']:
    283             self.log.info(
    284                 "Found CallbackType:{}, Expected CallbackType:{}".format(
    285                     found_callback_type, ble_scan_settings_callback_types[
    286                         'match_lost']))
    287             return False
    288         return True
    289