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""" 17Test script to test the integrity of LE scan results upon resetting the 18Bluetooth stack. 19""" 20 21import concurrent 22import os 23import time 24 25from queue import Empty 26from acts.test_decorators import test_tracker_info 27from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest 28from acts.test_utils.bt.bt_constants import ble_advertise_settings_modes 29from acts.test_utils.bt.bt_constants import ble_scan_settings_callback_types 30from acts.test_utils.bt.bt_constants import ble_scan_settings_modes 31from acts.test_utils.bt.bt_constants import adv_succ 32from acts.test_utils.bt.bt_constants import scan_result 33from acts.test_utils.bt.bt_test_utils import BtTestUtilsError 34from acts.test_utils.bt.bt_test_utils import generate_ble_advertise_objects 35from acts.test_utils.bt.bt_test_utils import generate_ble_scan_objects 36from acts.test_utils.bt.bt_test_utils import get_advanced_droid_list 37from acts.test_utils.bt.bt_test_utils import reset_bluetooth 38from acts.test_utils.bt.bt_test_utils import setup_n_advertisements 39from acts.test_utils.bt.bt_test_utils import take_btsnoop_logs 40from acts.test_utils.bt.bt_test_utils import teardown_n_advertisements 41from acts.test_utils.bt.bt_test_utils import scan_and_verify_n_advertisements 42 43 44class ConcurrentBleAdvertisementDiscoveryTest(BluetoothBaseTest): 45 default_timeout = 10 46 max_advertisements = -1 47 advertise_callback_list = [] 48 49 def __init__(self, controllers): 50 BluetoothBaseTest.__init__(self, controllers) 51 self.droid_list = get_advanced_droid_list(self.android_devices) 52 self.scn_ad = self.android_devices[0] 53 self.adv_ad = self.android_devices[1] 54 self.max_advertisements = self.droid_list[1]['max_advertisements'] 55 56 def setup_test(self): 57 return reset_bluetooth(self.android_devices) 58 59 def setup_test(self): 60 super(BluetoothBaseTest, self).setup_test() 61 self.log.info("Setting up advertisements") 62 try: 63 self.advertise_callback_list = setup_n_advertisements( 64 self.adv_ad, self.max_advertisements) 65 except BtTestUtilsError: 66 return False 67 return True 68 69 def teardown_test(self): 70 super(BluetoothBaseTest, self).teardown_test() 71 self.log.info("Tearing down advertisements") 72 teardown_n_advertisements(self.adv_ad, 73 len(self.advertise_callback_list), 74 self.advertise_callback_list) 75 return True 76 77 @BluetoothBaseTest.bt_test_wrap 78 @test_tracker_info(uuid='e02d6ca6-4db3-4a1d-adaf-98db7c7c2c7a') 79 def test_max_advertisements_defaults(self): 80 """Test scan integrity after BT state is reset 81 82 This test is to verify that LE devices are found 83 successfully after the Bluetooth stack is 84 reset. This is repeated multiple times in order 85 to verify that LE devices are not lost in scanning 86 when the stack is brought back up. 87 88 Steps: 89 1. Pre-Condition: Max advertisements are active 90 2. With the DUT android device, scan for all advertisements 91 and verify that all expected advertisements are found. 92 3. Reset Bluetooth on DUT. 93 4. Repeat steps 2-3 for defined iterations 94 95 Expected Result: 96 All expected advertisements should be found on all iterations. 97 98 Returns: 99 Pass if True 100 Fail if False 101 102 TAGS: LE, Advertising, Concurrency, Scanning 103 Priority: 2 104 """ 105 filter_list = self.scn_ad.droid.bleGenFilterList() 106 self.scn_ad.droid.bleBuildScanFilter(filter_list) 107 self.scn_ad.droid.bleSetScanSettingsCallbackType( 108 ble_scan_settings_callback_types['all_matches']) 109 self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[ 110 'low_latency']) 111 iterations = 20 112 for _ in range(iterations): 113 self.log.info("Verify all advertisements found") 114 try: 115 if not scan_and_verify_n_advertisements( 116 self.scn_ad, self.max_advertisements): 117 self.log.error("Failed to find all advertisements") 118 return False 119 except BtTestUtilsError: 120 return False 121 if not reset_bluetooth([self.scn_ad]): 122 self.log.error("Failed to reset Bluetooth state") 123 return False 124 return True 125