| #!/usr/bin/env python3 |
| # |
| # 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.test_decorators import test_tracker_info |
| from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest |
| from acts.base_test import BaseTestClass |
| from acts_contrib.test_utils.bt import bt_test_utils |
| from acts_contrib.test_utils.bt import BtEnum |
| from acts import asserts |
| |
| |
| class BtCarPairedConnectDisconnectTest(BluetoothBaseTest): |
| def setup_class(self): |
| self.car = self.android_devices[0] |
| self.ph = self.android_devices[1] |
| self.car_bt_addr = self.car.droid.bluetoothGetLocalAddress() |
| self.ph_bt_addr = self.ph.droid.bluetoothGetLocalAddress() |
| |
| bt_test_utils.setup_multiple_devices_for_bt_test([self.car, self.ph]) |
| |
| # 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.car, self.ph, auto_confirm=False) |
| |
| asserts.assert_true(result, "pair_pri_to_sec returned false.") |
| |
| # Check for successful setup of test. |
| devices = self.car.droid.bluetoothGetBondedDevices() |
| asserts.assert_equal( |
| len(devices), 1, |
| "pair_pri_to_sec succeeded but no bonded devices.") |
| |
| @test_tracker_info(uuid='b0babf3b-8049-4b64-9125-408efb1bbcd2') |
| @BluetoothBaseTest.bt_test_wrap |
| def test_pairing(self): |
| """ |
| Tests if we can connect two devices over A2dp and then disconnect |
| |
| Precondition: |
| 1. Devices are paired. |
| |
| Steps: |
| 1. Set the priority to OFF for all profiles. |
| 2. Initiate connection over A2dp Sink client profile. |
| |
| Returns: |
| Pass if True |
| Fail if False |
| |
| """ |
| # Set the priority to OFF for all profiles. |
| self.car.droid.bluetoothHfpClientSetPriority( |
| self.ph.droid.bluetoothGetLocalAddress(), |
| BtEnum.BluetoothPriorityLevel.PRIORITY_OFF.value) |
| self.ph.droid.bluetoothHspSetConnectionPolicy( |
| self.car.droid.bluetoothGetLocalAddress(), |
| BtEnum.BluetoothConnectionPolicy.CONNECTION_POLICY_FORBIDDEN.value) |
| addr = self.ph.droid.bluetoothGetLocalAddress() |
| if not bt_test_utils.connect_pri_to_sec( |
| self.car, self.ph, |
| set([BtEnum.BluetoothProfile.A2DP_SINK.value])): |
| if not bt_test_utils.is_a2dp_snk_device_connected(self.car, addr): |
| return False |
| return True |
| |
| @test_tracker_info(uuid='a44f13e2-c012-4292-8dd5-9f32a023e297') |
| @BluetoothBaseTest.bt_test_wrap |
| def test_connect_disconnect_paired(self): |
| """ |
| Tests if we can connect two devices over Headset, A2dp and then disconnect them with success |
| |
| Precondition: |
| 1. Devices are paired. |
| |
| Steps: |
| 1. Initiate connection over A2dp Sink and Headset client profiles. |
| 2. Check if the connection succeeded. |
| |
| Returns: |
| Pass if True |
| Fail if False |
| |
| Priority: 0 |
| """ |
| |
| NUM_TEST_RUNS = 2 |
| failure = 0 |
| addr = self.ph.droid.bluetoothGetLocalAddress() |
| for i in range(NUM_TEST_RUNS): |
| self.log.info("Running test [" + str(i) + "/" + str(NUM_TEST_RUNS) |
| + "]") |
| success = bt_test_utils.connect_pri_to_sec( |
| self.car, self.ph, |
| set([ |
| BtEnum.BluetoothProfile.HEADSET_CLIENT.value, |
| BtEnum.BluetoothProfile.A2DP_SINK.value |
| ])) |
| |
| # Check if we got connected. |
| if not success: |
| self.car.log.info("Not all profiles connected.") |
| if (bt_test_utils.is_hfp_client_device_connected(self.car, |
| addr) and |
| bt_test_utils.is_a2dp_snk_device_connected(self.car, |
| addr)): |
| self.car.log.info( |
| "HFP Client or A2DP SRC connected successfully.") |
| else: |
| failure = failure + 1 |
| continue |
| |
| # Disconnect the devices. |
| success = bt_test_utils.disconnect_pri_from_sec( |
| self.car, self.ph, [ |
| BtEnum.BluetoothProfile.HEADSET_CLIENT.value, |
| BtEnum.BluetoothProfile.A2DP_SINK.value |
| ]) |
| |
| if success is False: |
| self.car.log.info("Disconnect failed.") |
| if (bt_test_utils.is_hfp_client_device_connected(self.car, |
| addr) or |
| bt_test_utils.is_a2dp_snk_device_connected(self.car, |
| addr)): |
| self.car.log.info( |
| "HFP Client or A2DP SRC failed to disconnect.") |
| failure = failure + 1 |
| continue |
| |
| self.log.info("Failure {} total tests {}".format(failure, |
| NUM_TEST_RUNS)) |
| if failure > 0: |
| return False |
| return True |