#/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. """ Test script to test connect and disconnect sequence between two devices which can run SL4A. The script does the following: Setup: Clear up the bonded devices on both bluetooth adapters and bond the DUTs to each other. Test (NUM_TEST_RUNS times): 1. Connect A2dpSink and HeadsetClient 1.1. Check that devices are connected. 2. Disconnect A2dpSink and HeadsetClient 2.1 Check that devices are disconnected. """ import time from acts.base_test import BaseTestClass from acts.test_utils.bt import bt_test_utils from acts import asserts class BtCarPairedConnectDisconnectTest(BaseTestClass): def setup_class(self): self.droid_ad = self.android_devices[0] self.droid1_ad = self.android_devices[1] def setup_test(self): # Reset the devices in a clean state. bt_test_utils.setup_multiple_devices_for_bt_test(self.android_devices) bt_test_utils.reset_bluetooth(self.android_devices) for a in self.android_devices: a.ed.clear_all_events() # Pair the devices. # This call may block until some specified timeout in bt_test_utils.py. result = bt_test_utils.pair_pri_to_sec(self.droid_ad.droid, self.droid1_ad.droid) asserts.assert_true(result, "pair_pri_to_sec returned false."); # Check for successful setup of test. devices = self.droid_ad.droid.bluetoothGetBondedDevices() asserts.assert_equal(len(devices), 1, "pair_pri_to_sec succeeded but no bonded devices.") def on_fail(self, test_name, begin_time): bt_test_utils.take_btsnoop_logs(self.android_devices, self, test_name) def test_connect_disconnect_paired(self): NUM_TEST_RUNS = 2 failure = 0 for i in range(NUM_TEST_RUNS): self.log.info("Running test [" + str(i) + "/" + str(NUM_TEST_RUNS) + "]") # Connect the device. devices = self.droid_ad.droid.bluetoothGetBondedDevices() if (len(devices) == 0): self.log.info("No bonded devices.") failure = failure + 1 continue self.log.info("Attempting to connect.") self.droid_ad.droid.bluetoothConnectBonded(devices[0]['address']) end_time = time.time() + 20 expected_address = self.droid1_ad.droid.bluetoothGetLocalAddress() connected = False a2dp_sink_connected = False pbap_client_connected = False hfp_client_connected = False # Busy loop to check if we found a matching device. while time.time() < end_time: connected_devices = self.droid_ad.droid.bluetoothGetConnectedDevices() for d in connected_devices: if d['address'] == expected_address: connected = True break a2dp_sink_connected_devices = (self.droid_ad.droid .bluetoothGetConnectedDevicesOnProfile(11)) for d in a2dp_sink_connected_devices: if d['address'] == expected_address: a2dp_sink_connected = True break hfp_client_connected_devices = (self.droid_ad.droid. bluetoothGetConnectedDevicesOnProfile(16)) for d in hfp_client_connected_devices: if d['address'] == expected_address: hfp_client_connected = True break pbap_client_connected_devices = (self.droid_ad.droid. bluetoothGetConnectedDevicesOnProfile(17)) for d in hfp_client_connected_devices: if d['address'] == expected_address: pbap_client_connected = True break time.sleep(5) self.log.info("Connected " + str(connected)) self.log.info("A2DP Sink Connected " + str(a2dp_sink_connected)) self.log.info("HFP client connected " + str(hfp_client_connected)) self.log.info("PBAP Client connected " + str(pbap_client_connected)) if (all([connected, a2dp_sink_connected, hfp_client_connected, pbap_client_connected])): break # Try again to overcome occasional throw away by bluetooth self.droid_ad.droid.bluetoothConnectBonded(devices[0]['address']) # Check if we got connected. if (not all([connected, a2dp_sink_connected, pbap_client_connected, hfp_client_connected])): self.log.info("Not all profiles connected.") failure = failure + 1 continue # Disconnect the devices. self.log.info("Attempt to disconnect.") self.droid_ad.droid.bluetoothDisconnectConnected(expected_address) end_time = time.time() + 10 disconnected = False # Busy loop to check if we have successfully disconnected from the # device while time.time() < end_time: connectedDevices = self.droid_ad.droid.bluetoothGetConnectedDevices() exists = False connected_devices = self.droid_ad.droid.bluetoothGetConnectedDevices() for d in connected_devices: if d['address'] == expected_address: exists = True break if exists is False: disconnected = True break time.sleep(1) if disconnected is False: self.log.info("Still connected devices.") failure = failure + 1 continue self.log.info("Failure {} total tests {}".format(failure, NUM_TEST_RUNS)) asserts.assert_equal(failure, 0, "")