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