#/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, "")