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