#/usr/bin/env python3.4 # # Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. """ This test script exercises background scan test scenarios. """ from queue import Empty from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest from acts.test_utils.bt.BleEnum import BluetoothAdapterState from acts.test_utils.bt.bt_test_utils import bluetooth_off from acts.test_utils.bt.bt_test_utils import bluetooth_on from acts.test_utils.bt.bt_test_utils import cleanup_scanners_and_advertisers from acts.test_utils.bt.bt_test_utils import log_energy_info from acts.test_utils.bt.bt_test_utils import generate_ble_advertise_objects from acts.test_utils.bt.bt_test_utils import generate_ble_scan_objects from acts.test_utils.bt.bt_test_utils import get_advanced_droid_list from acts.test_utils.bt.bt_test_utils import scan_result class BleBackgroundScanTest(BluetoothBaseTest): default_timeout = 10 max_scan_instances = 28 report_delay = 2000 scan_callbacks = [] adv_callbacks = [] active_scan_callback_list = [] active_adv_callback_list = [] def __init__(self, controllers): BluetoothBaseTest.__init__(self, controllers) self.droid_list = get_advanced_droid_list(self.android_devices) self.scn_ad = self.android_devices[0] self.adv_ad = self.android_devices[1] if self.droid_list[1]['max_advertisements'] == 0: self.tests = () return def setup_test(self): self.log.debug(log_energy_info(self.android_devices, "Start")) if (self.scn_ad.droid.bluetoothGetLeState() == BluetoothAdapterState.STATE_OFF.value): self.scn_ad.droid.bluetoothEnableBLE() self.scn_ad.ed.pop_event("BleStateChangedOn") for a in self.android_devices: a.ed.clear_all_events() return True def teardown_test(self): self.log.debug(log_energy_info(self.android_devices, "End")) cleanup_scanners_and_advertisers( self.scn_ad, self.active_adv_callback_list, self.adv_ad, self.active_adv_callback_list) self.active_adv_callback_list = [] self.active_scan_callback_list = [] def _setup_generic_advertisement(self): adv_callback, adv_data, adv_settings = generate_ble_advertise_objects( self.adv_ad.droid) self.adv_ad.droid.bleStartBleAdvertising(adv_callback, adv_data, adv_settings) self.active_adv_callback_list.append(adv_callback) def _verify_no_events_found(self, event_name): try: self.scn_ad.ed.pop_event(event_name, self.default_timeout) self.log.error("Found an event when none was expected.") return False except Empty: self.log.info("No scan result found as expected.") return True @BluetoothBaseTest.bt_test_wrap def test_background_scan(self): """Test generic background scan. Tests LE background scan. The goal is to find scan results even though Bluetooth is turned off. Steps: 1. Setup an advertisement on dut1 2. Enable LE on the Bluetooth Adapter on dut0 3. Toggle BT off on dut1 4. Start a LE scan on dut0 5. Find the advertisement from dut1 Expected Result: Find a advertisement from the scan instance. Returns: Pass if True Fail if False TAGS: LE, Advertising, Scanning, Background Scanning Priority: 0 """ import time self._setup_generic_advertisement() self.scn_ad.droid.bluetoothToggleState(False) try: self.scn_ad.ed.pop_event(bluetooth_off, self.default_timeout) except Empty: self.log.error("Bluetooth Off event not found. Expected {}".format( bluetooth_off)) return False self.scn_ad.droid.bluetoothDisableBLE() try: self.scn_ad.ed.pop_event(bluetooth_off, self.default_timeout) except Empty: self.log.error("Bluetooth Off event not found. Expected {}".format( bluetooth_off)) return False self.scn_ad.droid.bluetoothEnableBLE() try: self.scn_ad.ed.pop_event(bluetooth_off, self.default_timeout*2) except Empty: self.log.error("Bluetooth On event not found. Expected {}".format( bluetooth_on)) return False filter_list, scan_settings, scan_callback = generate_ble_scan_objects( self.scn_ad.droid) self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, scan_callback) expected_event = scan_result.format(scan_callback) try: self.scn_ad.ed.pop_event(expected_event, self.default_timeout) except Empty: self.log.error("Scan Result event not found. Expected {}".format(expected_event)) return False return True @BluetoothBaseTest.bt_test_wrap def test_background_scan_ble_disabled(self): """Test background LE scanning with LE disabled. Tests LE background scan. The goal is to find scan results even though Bluetooth is turned off. Steps: 1. Setup an advertisement on dut1 2. Enable LE on the Bluetooth Adapter on dut0 3. Toggle BT off on dut1 4. Start a LE scan on dut0 5. Find the advertisement from dut1 Expected Result: Find a advertisement from the scan instance. Returns: Pass if True Fail if False TAGS: LE, Advertising, Scanning, Background Scanning Priority: 0 """ self._setup_generic_advertisement() self.scn_ad.droid.bluetoothEnableBLE() self.scn_ad.droid.bluetoothToggleState(False) try: self.scn_ad.ed.pop_event(bluetooth_off, self.default_timeout) except Empty: self.log.error("Bluetooth Off event not found. Expected {}".format( bluetooth_off)) return False filter_list, scan_settings, scan_callback = generate_ble_scan_objects( self.scn_ad.droid) try: self.scn_ad.droid.bleStartBleScan(filter_list, scan_settings, scan_callback) expected_event = scan_result.format(scan_callback) try: self.scn_ad.ed.pop_event(expected_event, self.default_timeout) except Empty: self.log.error("Scan Result event not found. Expected {}".format(expected_event)) return False self.log.info("Was able to start background scan even though ble " "was disabled.") return False except Exception: self.log.info( "Was not able to start a background scan as expected.") return True