blob: c67a04a98c203bfa6d95d0871f419e90d05c9842 [file] [log] [blame]
Jakub Pawlowskie6578d92017-03-09 15:29:59 -08001#/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"""
17This test script exercises different Bluetooth 5 specific scan scenarios.
18It is expected that the second AndroidDevice is able to advertise.
19
20This test script was designed with this setup in mind:
21Shield box one: Android Device, Android Device
22"""
23
24from queue import Empty
25
26from acts import asserts
27from acts.test_decorators import test_tracker_info
28from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
29from acts.test_utils.bt.BleEnum import ScanSettingsPhy
30from acts.test_utils.bt.BleEnum import ScanSettingsScanMode
31from acts.test_utils.bt.bt_test_utils import batch_scan_result
32from acts.test_utils.bt.bt_test_utils import cleanup_scanners_and_advertisers
33from acts.test_utils.bt.bt_test_utils import generate_ble_advertise_objects
34from acts.test_utils.bt.bt_test_utils import generate_ble_scan_objects
35from acts.test_utils.bt.bt_test_utils import reset_bluetooth
36from acts.test_utils.bt.bt_test_utils import scan_result
37from acts import signals
38
39
40class Bt5ScanTest(BluetoothBaseTest):
41 default_timeout = 10
42 max_scan_instances = 28
43 report_delay = 2000
44 scan_callbacks = []
45 adv_callbacks = []
46 active_scan_callback_list = []
47 big_adv_data = {
48 "includeDeviceName": True,
49 "manufacturerData": [0x0123, "00112233445566778899AABBCCDDEE"],
50 "manufacturerData2": [0x2540, [0x00, 0x11, 0x22, 0x33, 0x44, 0x55,
51 0x66, 0x77, 0x88, 0xFF]],
52 "serviceData": ["b19d42dc-58ba-4b20-b6c1-6628e7d21de4",
53 "00112233445566778899AABBCCDDEE"],
54 "serviceData2":
55 ["000042dc-58ba-4b20-b6c1-6628e7d21de4",
56 [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xFF]]
57 }
58
59 def __init__(self, controllers):
60 BluetoothBaseTest.__init__(self, controllers)
61 self.scn_ad = self.android_devices[0]
62 self.adv_ad = self.android_devices[1]
63
64 def setup_class(self):
65 if not self.scn_ad.droid.bluetoothIsLeExtendedAdvertisingSupported():
66 raise signals.TestSkipClass(
67 "Scanner does not support LE Extended Advertising")
68
69 if not self.adv_ad.droid.bluetoothIsLeExtendedAdvertisingSupported():
70 raise signals.TestSkipClass(
71 "Advertiser does not support LE Extended Advertising")
72
73 def teardown_test(self):
74 cleanup_scanners_and_advertisers(
75 self.scn_ad, self.active_scan_callback_list, self.adv_ad, [])
76 self.active_scan_callback_list = []
77
78 def on_exception(self, test_name, begin_time):
79 reset_bluetooth(self.android_devices)
80
81 # This one does not relly test anything, but display very helpful
82 # information that might help with debugging.
83 @BluetoothBaseTest.bt_test_wrap
84 def test_capabilities(self):
85 d = self.scn_ad.droid
86 sup2M = d.bluetoothIsLe2MPhySupported()
87 supCoded = d.bluetoothIsLeCodedPhySupported()
88 supExt = d.bluetoothIsLeExtendedAdvertisingSupported()
89 supPeriodic = d.bluetoothIsLePeriodicAdvertisingSupported()
90 maxDataLen = d.bluetoothGetLeMaximumAdvertisingDataLength()
91 self.log.info("Scanner capabilities:")
92 self.log.info("LE 2M: " + str(sup2M) + ", LE Coded: " + str(supCoded) +
93 ", LE Extended Advertising: " + str(supExt) +
94 ", LE Periodic Advertising: " + str(supPeriodic) +
95 ", maximum advertising data length: " + str(maxDataLen))
96 d = self.adv_ad.droid
97 sup2M = d.bluetoothIsLe2MPhySupported()
98 supCoded = d.bluetoothIsLeCodedPhySupported()
99 supExt = d.bluetoothIsLeExtendedAdvertisingSupported()
100 supPeriodic = d.bluetoothIsLePeriodicAdvertisingSupported()
101 maxDataLen = d.bluetoothGetLeMaximumAdvertisingDataLength()
102 self.log.info("Advertiser capabilities:")
103 self.log.info("LE 2M: " + str(sup2M) + ", LE Coded: " + str(supCoded) +
104 ", LE Extended Advertising: " + str(supExt) +
105 ", LE Periodic Advertising: " + str(supPeriodic) +
106 ", maximum advertising data length: " + str(maxDataLen))
107 return True
108
109 def test_1m_1m_extended_scan(self):
110 """Test scan on LE 1M PHY using LE 1M PHY as secondary.
111
112 Tests test verify that device is able to receive extended advertising
113 on 1M PHY when secondary is 1M PHY.
114
115 Steps:
116 1. Start advertising set on dut1
117 2. Start scanning on dut0, scan filter set to advertiser's device name
118 3. Try to find an event, expect found
119 4. Stop advertising
120
121 Expected Result:
122 Scan finds a advertisement.
123
124 Returns:
125 Pass if True
126 Fail if False
127
128 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
129 Priority: 1
130 """
131 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
132 self.adv_ad.droid.bleAdvSetStartAdvertisingSet(
133 {"connectable": True,
134 "legacyMode": False,
135 "primaryPhy": "PHY_LE_1M",
136 "secondaryPhy": "PHY_LE_1M",
137 "interval": 320}, self.big_adv_data, None, None, None, 0, 0,
138 adv_callback)
139
140 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
141 self.scn_ad.droid.bleSetScanSettingsPhy(
142 ScanSettingsPhy.PHY_LE_1M.value)
143
144 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
145 self.scn_ad.droid)
146
147 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
148 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
149 self.scn_ad.droid.bleBuildScanFilter(filter_list)
150 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
151 scan_callback)
152 self.active_scan_callback_list.append(scan_callback)
153
154 try:
155 self.scn_ad.ed.pop_event(
156 scan_result.format(scan_callback), self.default_timeout)
157 except Empty:
158 self.log.error("Scan result not found")
159 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
160 return False
161
162 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
163 return True
164
165 def test_1m_2m_extended_scan(self):
166 """Test scan on LE 1M PHY using LE 2M PHY as secondary.
167
168 Tests test verify that device is able to receive extended advertising
169 on 1M PHY when secondary is 2M PHY.
170
171 Steps:
172 1. Start advertising set on dut1
173 2. Start scanning on dut0, scan filter set to advertiser's device name
174 3. Try to find an event, expect found
175 4. Stop advertising
176
177 Expected Result:
178 Scan finds a advertisement.
179
180 Returns:
181 Pass if True
182 Fail if False
183
184 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
185 Priority: 1
186 """
187 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
188 self.adv_ad.droid.bleAdvSetStartAdvertisingSet(
189 {"connectable": True,
190 "legacyMode": False,
191 "primaryPhy": "PHY_LE_1M",
192 "secondaryPhy": "PHY_LE_2M",
193 "interval": 320}, self.big_adv_data, None, None, None, 0, 0,
194 adv_callback)
195
196 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
197 self.scn_ad.droid.bleSetScanSettingsPhy(
198 ScanSettingsPhy.PHY_LE_1M.value)
199
200 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
201 self.scn_ad.droid)
202
203 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
204 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
205 self.scn_ad.droid.bleBuildScanFilter(filter_list)
206 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
207 scan_callback)
208 self.active_scan_callback_list.append(scan_callback)
209
210 try:
211 self.scn_ad.ed.pop_event(
212 scan_result.format(scan_callback), self.default_timeout)
213 except Empty:
214 self.log.error("Scan result not found")
215 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
216 return False
217
218 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
219 return True
220
221
222 def test_legacy_scan_result_raw_length(self):
223 """Test that raw scan record data in legacy scan is 62 bytes long. This is required for compability with older apps that make this assumption.
224
225 Steps:
226 1. Start legacy advertising set on dut1
227 2. Start scanning on dut0, scan filter set to advertiser's device name
228 3. Try to find an event, expect found, verify scan recurd data length
229 4. Stop advertising
230
231 Expected Result:
232 Scan finds a legacy advertisement of proper size
233
234 Returns:
235 Pass if True
236 Fail if False
237
238 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
239 Priority: 1
240 """
241 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
242 self.adv_ad.droid.bleAdvSetStartAdvertisingSet(
243 {"connectable": True,
244 "scannable": True,
245 "legacyMode": True,
246 "interval": 320}, {"includeDeviceName": True}, None, None, None, 0, 0,
247 adv_callback)
248
249 self.scn_ad.droid.bleSetScanSettingsLegacy(True)
250 self.scn_ad.droid.bleSetScanSettingsPhy(
251 ScanSettingsPhy.PHY_LE_1M.value)
252
253 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
254 self.scn_ad.droid)
255
256 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
257 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
258 self.scn_ad.droid.bleBuildScanFilter(filter_list)
259 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
260 scan_callback)
261 self.active_scan_callback_list.append(scan_callback)
262
263 try:
264 evt = self.scn_ad.ed.pop_event(
265 scan_result.format(scan_callback), self.default_timeout)
266 rawData = evt['data']['Result']['scanRecord']
267 asserts.assert_true(
268 62 == len(rawData.split(",")),
269 "Raw data should be 62 bytes long.")
270 except Empty:
271 self.log.error("Scan result not found")
272 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
273 return False
274
275 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
276 return True
277
278
279 def test_duration(self):
280 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
281 self.adv_ad.droid.bleAdvSetStartAdvertisingSet(
282 {"connectable": True,
283 "legacyMode": False,
284 "primaryPhy": "PHY_LE_1M",
285 "secondaryPhy": "PHY_LE_2M",
286 "interval": 320}, self.big_adv_data, None, None, None, 0, 0,
287 adv_callback)
288
289 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
290 self.scn_ad.droid.bleSetScanSettingsPhy(
291 ScanSettingsPhy.PHY_LE_1M.value)
292
293 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
294 self.scn_ad.droid)
295
296 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
297 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
298 self.scn_ad.droid.bleBuildScanFilter(filter_list)
299 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
300 scan_callback)
301 self.active_scan_callback_list.append(scan_callback)
302
303 try:
304 self.scn_ad.ed.pop_event(
305 scan_result.format(scan_callback), self.default_timeout)
306 except Empty:
307 self.log.error("Scan result not found")
308 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
309 return False
310
311 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
312 return True
313
314
315 def test_anonymous_advertising(self):
316 """Test anonymous advertising.
317
318 Tests test verify that device is able to receive anonymous advertising
319 on 1M PHY when secondary is 2M PHY.
320
321 Steps:
322 1. Start anonymous advertising set on dut1
323 2. Start scanning on dut0, scan filter set to advertiser's device name
324 3. Try to find an event, expect found
325 4. Stop advertising
326
327 Expected Result:
328 Scan finds a advertisement.
329
330 Returns:
331 Pass if True
332 Fail if False
333
334 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
335 Priority: 1
336 """
337 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
338 self.adv_ad.droid.bleAdvSetStartAdvertisingSet(
339 {"connectable": False,
340 "anonymous": True,
341 "legacyMode": False,
342 "primaryPhy": "PHY_LE_1M",
343 "secondaryPhy": "PHY_LE_2M",
344 "interval": 320}, self.big_adv_data, None, None, None, 0, 0,
345 adv_callback)
346
347 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
348 self.scn_ad.droid.bleSetScanSettingsPhy(
349 ScanSettingsPhy.PHY_LE_1M.value)
350
351 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
352 self.scn_ad.droid)
353
354 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
355 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
356 self.scn_ad.droid.bleBuildScanFilter(filter_list)
357 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
358 scan_callback)
359 self.active_scan_callback_list.append(scan_callback)
360
361 try:
362 evt = self.scn_ad.ed.pop_event(
363 scan_result.format(scan_callback), self.default_timeout)
364 address = evt['data']['Result']['deviceInfo']['address']
365 asserts.assert_true(
366 '00:00:00:00:00:00' == address,
367 "Anonymous address should be 00:00:00:00:00:00, but was " + str(address))
368 except Empty:
369 self.log.error("Scan result not found")
370 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
371 return False
372
373 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
374 return True