blob: 7f7b7dcd0d2d931db61bcccf51868d51efcb3eba [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
tturney57b14ef2017-07-21 15:42:59 -070029from acts.test_utils.bt.bt_constants import ble_scan_settings_phys
30from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
Jakub Pawlowskie6578d92017-03-09 15:29:59 -080031from 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
tturney57b14ef2017-07-21 15:42:59 -070036from acts.test_utils.bt.bt_constants import scan_result
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -070037from acts.test_utils.bt.bt_test_utils import advertising_set_on_own_address_read
38from acts.test_utils.bt.bt_test_utils import advertising_set_started
Jakub Pawlowskie6578d92017-03-09 15:29:59 -080039from acts import signals
40
41
42class Bt5ScanTest(BluetoothBaseTest):
43 default_timeout = 10
44 max_scan_instances = 28
45 report_delay = 2000
46 scan_callbacks = []
47 adv_callbacks = []
48 active_scan_callback_list = []
49 big_adv_data = {
50 "includeDeviceName": True,
51 "manufacturerData": [0x0123, "00112233445566778899AABBCCDDEE"],
tturney79b11a12017-06-09 12:59:15 -070052 "manufacturerData2":
53 [0x2540, [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xFF]],
54 "serviceData": [
55 "b19d42dc-58ba-4b20-b6c1-6628e7d21de4",
56 "00112233445566778899AABBCCDDEE"
57 ],
58 "serviceData2": [
59 "000042dc-58ba-4b20-b6c1-6628e7d21de4",
60 [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xFF]
61 ]
Jakub Pawlowskie6578d92017-03-09 15:29:59 -080062 }
63
64 def __init__(self, controllers):
65 BluetoothBaseTest.__init__(self, controllers)
66 self.scn_ad = self.android_devices[0]
67 self.adv_ad = self.android_devices[1]
68
69 def setup_class(self):
70 if not self.scn_ad.droid.bluetoothIsLeExtendedAdvertisingSupported():
71 raise signals.TestSkipClass(
72 "Scanner does not support LE Extended Advertising")
73
74 if not self.adv_ad.droid.bluetoothIsLeExtendedAdvertisingSupported():
75 raise signals.TestSkipClass(
76 "Advertiser does not support LE Extended Advertising")
77
78 def teardown_test(self):
79 cleanup_scanners_and_advertisers(
80 self.scn_ad, self.active_scan_callback_list, self.adv_ad, [])
81 self.active_scan_callback_list = []
82
83 def on_exception(self, test_name, begin_time):
84 reset_bluetooth(self.android_devices)
85
86 # This one does not relly test anything, but display very helpful
87 # information that might help with debugging.
88 @BluetoothBaseTest.bt_test_wrap
tturney79b11a12017-06-09 12:59:15 -070089 @test_tracker_info(uuid='787e0877-269f-4b9b-acb0-b98a8bb3770a')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -080090 def test_capabilities(self):
tturney79b11a12017-06-09 12:59:15 -070091 """Test capabilities
92
93 Test BT 5.0 scan scapabilities
94
95 Steps:
96 1. Test various vapabilities.
97
98 Expected Result:
99 Pass
100
101 Returns:
102 Pass if True
103 Fail if False
104
105 TAGS: BT5.0, Scanning
106 Priority: 2
107 """
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800108 d = self.scn_ad.droid
109 sup2M = d.bluetoothIsLe2MPhySupported()
110 supCoded = d.bluetoothIsLeCodedPhySupported()
111 supExt = d.bluetoothIsLeExtendedAdvertisingSupported()
112 supPeriodic = d.bluetoothIsLePeriodicAdvertisingSupported()
113 maxDataLen = d.bluetoothGetLeMaximumAdvertisingDataLength()
114 self.log.info("Scanner capabilities:")
tturney79b11a12017-06-09 12:59:15 -0700115 self.log.info("LE 2M: " + str(sup2M) + ", LE Coded: " + str(
116 supCoded) + ", LE Extended Advertising: " + str(
117 supExt) + ", LE Periodic Advertising: " + str(supPeriodic) +
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800118 ", maximum advertising data length: " + str(maxDataLen))
119 d = self.adv_ad.droid
120 sup2M = d.bluetoothIsLe2MPhySupported()
121 supCoded = d.bluetoothIsLeCodedPhySupported()
122 supExt = d.bluetoothIsLeExtendedAdvertisingSupported()
123 supPeriodic = d.bluetoothIsLePeriodicAdvertisingSupported()
124 maxDataLen = d.bluetoothGetLeMaximumAdvertisingDataLength()
125 self.log.info("Advertiser capabilities:")
tturney79b11a12017-06-09 12:59:15 -0700126 self.log.info("LE 2M: " + str(sup2M) + ", LE Coded: " + str(
127 supCoded) + ", LE Extended Advertising: " + str(
128 supExt) + ", LE Periodic Advertising: " + str(supPeriodic) +
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800129 ", maximum advertising data length: " + str(maxDataLen))
130 return True
131
tturney79b11a12017-06-09 12:59:15 -0700132 @BluetoothBaseTest.bt_test_wrap
133 @test_tracker_info(uuid='62d36679-bb91-465e-897f-2635433aac2f')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800134 def test_1m_1m_extended_scan(self):
135 """Test scan on LE 1M PHY using LE 1M PHY as secondary.
136
137 Tests test verify that device is able to receive extended advertising
138 on 1M PHY when secondary is 1M PHY.
139
140 Steps:
141 1. Start advertising set on dut1
142 2. Start scanning on dut0, scan filter set to advertiser's device name
143 3. Try to find an event, expect found
144 4. Stop advertising
145
146 Expected Result:
147 Scan finds a advertisement.
148
149 Returns:
150 Pass if True
151 Fail if False
152
153 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
154 Priority: 1
155 """
156 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700157 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
158 "connectable": True,
159 "legacyMode": False,
160 "primaryPhy": "PHY_LE_1M",
161 "secondaryPhy": "PHY_LE_1M",
162 "interval": 320
163 }, self.big_adv_data, None, None, None, 0, 0, adv_callback)
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800164
165 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
tturney57b14ef2017-07-21 15:42:59 -0700166 self.scn_ad.droid.bleSetScanSettingsPhy(ble_scan_settings_phys['1m'])
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800167
168 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
169 self.scn_ad.droid)
170
171 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
172 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
173 self.scn_ad.droid.bleBuildScanFilter(filter_list)
174 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
175 scan_callback)
176 self.active_scan_callback_list.append(scan_callback)
177
178 try:
179 self.scn_ad.ed.pop_event(
180 scan_result.format(scan_callback), self.default_timeout)
181 except Empty:
182 self.log.error("Scan result not found")
183 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
184 return False
185
186 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
187 return True
188
tturney79b11a12017-06-09 12:59:15 -0700189 @BluetoothBaseTest.bt_test_wrap
190 @test_tracker_info(uuid='3e3c9757-f7b6-4d1d-a2d6-8e2330d1a18e')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800191 def test_1m_2m_extended_scan(self):
192 """Test scan on LE 1M PHY using LE 2M PHY as secondary.
193
194 Tests test verify that device is able to receive extended advertising
195 on 1M PHY when secondary is 2M PHY.
196
197 Steps:
198 1. Start advertising set on dut1
199 2. Start scanning on dut0, scan filter set to advertiser's device name
200 3. Try to find an event, expect found
201 4. Stop advertising
202
203 Expected Result:
204 Scan finds a advertisement.
205
206 Returns:
207 Pass if True
208 Fail if False
209
210 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
211 Priority: 1
212 """
213 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700214 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
215 "connectable": True,
216 "legacyMode": False,
217 "primaryPhy": "PHY_LE_1M",
218 "secondaryPhy": "PHY_LE_2M",
219 "interval": 320
220 }, self.big_adv_data, None, None, None, 0, 0, adv_callback)
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800221
222 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
tturney57b14ef2017-07-21 15:42:59 -0700223 self.scn_ad.droid.bleSetScanSettingsPhy(ble_scan_settings_phys['1m'])
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800224
225 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
226 self.scn_ad.droid)
227
228 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
229 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
230 self.scn_ad.droid.bleBuildScanFilter(filter_list)
231 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
232 scan_callback)
233 self.active_scan_callback_list.append(scan_callback)
234
235 try:
236 self.scn_ad.ed.pop_event(
237 scan_result.format(scan_callback), self.default_timeout)
238 except Empty:
239 self.log.error("Scan result not found")
240 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
241 return False
242
243 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
244 return True
245
tturney79b11a12017-06-09 12:59:15 -0700246 @BluetoothBaseTest.bt_test_wrap
247 @test_tracker_info(uuid='236e9e5b-3853-4762-81ae-e88db03d74f3')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800248 def test_legacy_scan_result_raw_length(self):
tturney79b11a12017-06-09 12:59:15 -0700249 """Test that raw scan record data in legacy scan is 62 bytes long.
250
251 This is required for compability with older apps that make this
252 assumption.
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800253
254 Steps:
255 1. Start legacy advertising set on dut1
256 2. Start scanning on dut0, scan filter set to advertiser's device name
257 3. Try to find an event, expect found, verify scan recurd data length
258 4. Stop advertising
259
260 Expected Result:
261 Scan finds a legacy advertisement of proper size
262
263 Returns:
264 Pass if True
265 Fail if False
266
267 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
268 Priority: 1
269 """
270 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700271 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
272 "connectable": True,
273 "scannable": True,
274 "legacyMode": True,
275 "interval": 320
276 }, {"includeDeviceName": True}, None, None, None, 0, 0, adv_callback)
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800277
278 self.scn_ad.droid.bleSetScanSettingsLegacy(True)
tturney57b14ef2017-07-21 15:42:59 -0700279 self.scn_ad.droid.bleSetScanSettingsPhy(ble_scan_settings_phys['1m'])
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800280
281 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
282 self.scn_ad.droid)
283
284 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
285 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
286 self.scn_ad.droid.bleBuildScanFilter(filter_list)
287 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
288 scan_callback)
289 self.active_scan_callback_list.append(scan_callback)
290
291 try:
292 evt = self.scn_ad.ed.pop_event(
293 scan_result.format(scan_callback), self.default_timeout)
294 rawData = evt['data']['Result']['scanRecord']
tturney79b11a12017-06-09 12:59:15 -0700295 asserts.assert_true(62 == len(rawData.split(",")),
296 "Raw data should be 62 bytes long.")
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800297 except Empty:
298 self.log.error("Scan result not found")
299 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
300 return False
301
302 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
303 return True
304
tturney79b11a12017-06-09 12:59:15 -0700305 @BluetoothBaseTest.bt_test_wrap
306 @test_tracker_info(uuid='04632d8d-4303-476f-8f83-52c16be3713a')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800307 def test_duration(self):
tturney79b11a12017-06-09 12:59:15 -0700308 """Test scanning duration
309
310 Tests BT5.0 scanning duration
311
312 Steps:
313 1. Start advertising set
314 2. Start 5.0 scan
315 3. Scan for advertisement event
316
317 Expected Result:
318 Scan finds a legacy advertisement of proper size
319
320 Returns:
321 Pass if True
322 Fail if False
323
324 TAGS: BT5.0, LE, Advertising, Scanning
325 Priority: 1
326 """
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800327 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700328 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
329 "connectable": True,
330 "legacyMode": False,
331 "primaryPhy": "PHY_LE_1M",
332 "secondaryPhy": "PHY_LE_2M",
333 "interval": 320
334 }, self.big_adv_data, None, None, None, 0, 0, adv_callback)
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800335
336 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
tturney57b14ef2017-07-21 15:42:59 -0700337 self.scn_ad.droid.bleSetScanSettingsPhy(ble_scan_settings_phys['1m'])
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800338
339 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
340 self.scn_ad.droid)
341
342 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
343 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
344 self.scn_ad.droid.bleBuildScanFilter(filter_list)
345 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
346 scan_callback)
347 self.active_scan_callback_list.append(scan_callback)
348
349 try:
350 self.scn_ad.ed.pop_event(
351 scan_result.format(scan_callback), self.default_timeout)
352 except Empty:
353 self.log.error("Scan result not found")
354 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
355 return False
356
357 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
358 return True
359
tturney79b11a12017-06-09 12:59:15 -0700360 @BluetoothBaseTest.bt_test_wrap
361 @test_tracker_info(uuid='a3704083-0f5c-4a46-b979-32ebc594d6ee')
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800362 def test_anonymous_advertising(self):
363 """Test anonymous advertising.
364
365 Tests test verify that device is able to receive anonymous advertising
366 on 1M PHY when secondary is 2M PHY.
367
368 Steps:
369 1. Start anonymous advertising set on dut1
370 2. Start scanning on dut0, scan filter set to advertiser's device name
371 3. Try to find an event, expect found
372 4. Stop advertising
373
374 Expected Result:
375 Scan finds a advertisement.
376
377 Returns:
378 Pass if True
379 Fail if False
380
381 TAGS: LE Advertising Extension, BT5, LE, Advertising, Scanning
382 Priority: 1
383 """
384 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700385 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
386 "connectable": False,
387 "anonymous": True,
388 "legacyMode": False,
389 "primaryPhy": "PHY_LE_1M",
390 "secondaryPhy": "PHY_LE_2M",
391 "interval": 320
392 }, self.big_adv_data, None, None, None, 0, 0, adv_callback)
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800393
394 self.scn_ad.droid.bleSetScanSettingsLegacy(False)
tturney57b14ef2017-07-21 15:42:59 -0700395 self.scn_ad.droid.bleSetScanSettingsPhy(ble_scan_settings_phys['1m'])
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800396
397 filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
398 self.scn_ad.droid)
399
400 adv_device_name = self.adv_ad.droid.bluetoothGetLocalName()
401 self.scn_ad.droid.bleSetScanFilterDeviceName(adv_device_name)
402 self.scn_ad.droid.bleBuildScanFilter(filter_list)
403 self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings,
404 scan_callback)
405 self.active_scan_callback_list.append(scan_callback)
406
407 try:
408 evt = self.scn_ad.ed.pop_event(
409 scan_result.format(scan_callback), self.default_timeout)
410 address = evt['data']['Result']['deviceInfo']['address']
411 asserts.assert_true(
412 '00:00:00:00:00:00' == address,
tturney79b11a12017-06-09 12:59:15 -0700413 "Anonymous address should be 00:00:00:00:00:00, but was " +
414 str(address))
Jakub Pawlowskie6578d92017-03-09 15:29:59 -0800415 except Empty:
416 self.log.error("Scan result not found")
417 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
418 return False
419
420 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
421 return True
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700422
423 @BluetoothBaseTest.bt_test_wrap
tturney79b11a12017-06-09 12:59:15 -0700424 @test_tracker_info(uuid='e3277355-eebf-4760-9502-e49a9289f6ab')
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700425 def test_get_own_address(self):
426 """Test obtaining own address for PTS.
427
tturney79b11a12017-06-09 12:59:15 -0700428 Test obtaining own address.
429
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700430 Steps:
431 1. Start advertising set dut1
432 2. Grab address
433 3. Stop advertising
434
435 Expected Result:
436 Callback with address is received.
437
438 Returns:
439 Pass if True
440 Fail if False
441
442 TAGS: LE Advertising Extension, BT5, LE, Advertising
443 Priority: 1
444 """
445 adv_callback = self.adv_ad.droid.bleAdvSetGenCallback()
tturney79b11a12017-06-09 12:59:15 -0700446 self.adv_ad.droid.bleAdvSetStartAdvertisingSet({
447 "connectable": False,
448 "anonymous": True,
449 "legacyMode": False,
450 "primaryPhy": "PHY_LE_1M",
451 "secondaryPhy": "PHY_LE_2M",
452 "interval": 320
453 }, self.big_adv_data, None, None, None, 0, 0, adv_callback)
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700454
455 set_id = -1
456
457 try:
458 evt = self.adv_ad.ed.pop_event(
tturney79b11a12017-06-09 12:59:15 -0700459 advertising_set_started.format(adv_callback),
460 self.default_timeout)
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700461 self.log.info("data: " + str(evt['data']))
462 set_id = evt['data']['setId']
463 except Empty:
464 self.log.error("did not receive the set started event!")
465 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
466 return False
467
468 self.adv_ad.droid.bleAdvSetGetOwnAddress(set_id)
469
470 try:
471 evt = self.adv_ad.ed.pop_event(
tturney79b11a12017-06-09 12:59:15 -0700472 advertising_set_on_own_address_read.format(set_id),
473 self.default_timeout)
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700474 address = evt['data']['address']
475 self.log.info("Advertiser address is: " + str(address))
476 except Empty:
477 self.log.error("onOwnAddressRead not received.")
478 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
479 return False
480
Jakub Pawlowski2cc87a22017-04-24 08:33:27 -0700481 self.adv_ad.droid.bleAdvSetStopAdvertisingSet(adv_callback)
482 return True