blob: 9d040882ca2999e1ca1624561b7e8f63aa233556 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright (C) 2018 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 test scenarios for connections to Bluetooth headphones.
This test script was designed with this setup in mind:
Shield box one: Android Device and 3 headset.
"""
import json
import os
import time
import sys
from acts import logger
from acts.asserts import assert_false
from acts.asserts import assert_true
from acts.keys import Config
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
from acts_contrib.test_utils.bt.bt_test_utils import bluetooth_enabled_check
from acts_contrib.test_utils.bt.bt_test_utils import clear_bonded_devices
from acts_contrib.test_utils.bt.bt_test_utils import disable_bluetooth
from acts_contrib.test_utils.bt.bt_test_utils import reset_bluetooth
from acts.controllers.relay_lib.sony_xb2_speaker import SonyXB2Speaker
class HeadphoneTest(BluetoothBaseTest):
WAIT_TIME = 10
iterations = 10
def _discover_and_pair(self, headphone):
self.ad.droid.bluetoothStartDiscovery()
time.sleep(10)
self.ad.droid.bluetoothCancelDiscovery()
for device in self.ad.droid.bluetoothGetDiscoveredDevices():
if device['address'] == headphone.mac_address:
self.ad.droid.bluetoothDiscoverAndBond(
headphone.mac_address)
end_time = time.time() + 20
self.log.info("Found the mac address")
self.log.info("Verifying devices are bonded")
while time.time() < end_time:
bonded_devices = self.ad.droid.bluetoothGetBondedDevices()
for d in bonded_devices:
if d['address'] == headphone.mac_address:
self.log.info("Successfully bonded to device.")
self.log.info(
'Bonded devices:\n%s', bonded_devices)
return True
return False
def setup_class(self):
self.ad.droid.bluetoothFactoryReset()
# Factory reset requires a short delay to take effect
time.sleep(3)
self.ad.log.info("Making sure BT phone is enabled here during setup")
if not bluetooth_enabled_check(self.ad):
self.log.error("Failed to turn Bluetooth on DUT")
# Give a breathing time of short delay to take effect
time.sleep(3)
reset_bluetooth([self.ad])
# Determine if we have a relay-based device
if hasattr(self, 'relay_devices'):
for headphone in self.relay_devices:
headphone.setup()
'''
# Turn of the Power Supply for the headphones.
if hasattr(self, 'relay_devices'):
power_supply = self.relay_devices[0]
power_supply.power_off()
'''
super(HeadphoneTest, self).setup_class()
return clear_bonded_devices(self.ad)
def teardown_class(self):
if self.headphone_list is not None:
for headphone in self.headphone_list:
headphone.power_off()
headphone.clean_up()
'''
power_supply = self.relay_devices[0]
power_supply.power_off()
'''
return clear_bonded_devices(self.ad)
@property
def ad(self):
return self.android_devices[0]
@property
def headphone_list(self):
return self.relay_devices
@BluetoothBaseTest.bt_test_wrap
@test_tracker_info(uuid='157c1fa1-3d6f-4cfc-8f86-ad267746af71')
def test_pair_and_unpair_bt_device(self):
""" Test Pairing and Unpairing Bluetooth Headphones to the Android device.
Steps:
1. Pair and Connect Bluetooth headset.
2. Disconnect Bleutooth Headset.
Expected Result: Bluetooth pairing and unpairing should succeed.
Returns:
Pass if True
Fail if False
TAGS: Classic.
Priority: 0
"""
for headphone in self.headphone_list:
self.log.info("Start testing on " + headphone.name )
if self._discover_and_pair(headphone) is False:
# The device is probably not in pairing mode, put in pairing mode.
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
if self._discover_and_pair(headphone) is False:
# Device must be on, but not in pairing mode.
headphone.power_off()
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
msg = "Unable to pair to %s", headphone.name
assert_true(self._discover_and_pair(headphone), msg)
if len(self.ad.droid.bluetoothGetConnectedDevices()) == 0:
self.log.error("Not connected to relay based device.")
return False
clear_bonded_devices(self.ad)
@BluetoothBaseTest.bt_test_wrap
@test_tracker_info(uuid='7ba73c39-2a69-4a72-b708-d603ce658740')
def test_pair_unpair_stress(self):
""" Stress Test for Pairing and Unpairing of Bluetooth Headphones.
Steps:
1. Pairing and Connect Bluetooth headset.
2. Disconnect Bleutooth Headset.
3. Repeat step 1-2 for 10 iterations.
Expected Result: Bluetooth pairing and unpairing should succeed.
Returns:
Pass if True
Fail if False
TAGS: Classic, Stress
Priority: 1
"""
for n in range(self.iterations):
self.log.info("Pair headphone iteration %s.", (n + 1))
for headphone in self.headphone_list:
if self._discover_and_pair(headphone) is False:
# The device is probably not in pairing mode, put in pairing mode.
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
if self._discover_and_pair(headphone) is False:
# Device must be on, but not in pairing mode.
headphone.power_off()
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
msg = "Unable to pair to %s", headphone.name
assert_true(self._discover_and_pair(headphone), msg)
if len(self.ad.droid.bluetoothGetConnectedDevices()) == 0:
self.log.error("Not connected to relay based device.")
return False
clear_bonded_devices(self.ad)
@BluetoothBaseTest.bt_test_wrap
@test_tracker_info(uuid='e2e5fe90-16f1-4830-9b81-6632ae5aab52')
def test_multi_a2dp_test(self):
""" Test for Pairing and Unpairing mutliple A2dp devices.
Steps:
1. Pairing and Connect multiple Bluetooth headsets.
2. Disconnect all Bleutooth Headset.
Expected Result: All headphones should be connected simultaneously.
Returns:
Pass if True
Fail if False
TAGS: Classic, Multi-A2dp.
Priority: 1
"""
for n, headphone in enumerate(self.headphone_list):
if self._discover_and_pair(headphone) is False:
# The device is probably not in pairing mode, put in pairing mode.
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
if self._discover_and_pair(headphone) is False:
# Device must be on, but not in pairing mode.
headphone.power_off()
headphone.turn_power_on_and_enter_pairing_mode()
time.sleep(6)
msg = "Unable to pair to %s", headphone.name
assert_true(self._discover_and_pair(headphone), msg)
if len(self.ad.droid.bluetoothGetConnectedDevices()) != n+1:
self.log.error("Not connected to %s", headphone.name)
return False