#!/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. from acts_contrib.test_utils.bt import BtEnum from acts_contrib.test_utils.bt.bt_test_utils import clear_bonded_devices from acts_contrib.test_utils.coex.CoexBaseTest import CoexBaseTest from acts_contrib.test_utils.coex.coex_test_utils import connect_dev_to_headset from acts_contrib.test_utils.coex.coex_test_utils import connect_wlan_profile from acts_contrib.test_utils.coex.coex_test_utils import initiate_disconnect_from_hf from acts_contrib.test_utils.coex.coex_test_utils import initiate_disconnect_call_dut from acts_contrib.test_utils.coex.coex_test_utils import multithread_func from acts_contrib.test_utils.coex.coex_test_utils import pair_and_connect_headset from acts_contrib.test_utils.coex.coex_test_utils import perform_classic_discovery from acts_contrib.test_utils.coex.coex_test_utils import toggle_screen_state from acts_contrib.test_utils.coex.coex_test_utils import setup_tel_config from acts_contrib.test_utils.coex.coex_test_utils import start_fping from acts_contrib.test_utils.tel.tel_voice_utils import hangup_call from acts_contrib.test_utils.tel.tel_voice_utils import initiate_call BLUETOOTH_WAIT_TIME = 2 class WlanWithHfpFunctionalityTest(CoexBaseTest): def setup_class(self): super().setup_class() req_params = ["sim_conf_file", "fping_drop_tolerance"] self.unpack_userparams(req_params) self.ag_phone_number, self.re_phone_number = setup_tel_config( self.pri_ad, self.sec_ad, self.sim_conf_file) def setup_test(self): super().setup_test() self.audio_receiver.enter_pairing_mode() if not pair_and_connect_headset( self.pri_ad, self.audio_receiver.mac_address, set([BtEnum.BluetoothProfile.HEADSET.value])): self.log.error("Failed to pair and connect to headset.") return False def teardown_test(self): clear_bonded_devices(self.pri_ad) super().teardown_test() self.audio_receiver.clean_up() def call_from_sec_ad_to_pri_ad(self): """Initiates the call from secondary device and accepts the call from HF. Steps: 1. Initiate call from secondary device to primary device. 2. Accept the call from HF. 3. Hangup the call from primary device. Returns: True if successful, False otherwise. """ if not initiate_call(self.log, self.sec_ad, self.ag_phone_number): self.log.error("Failed to initiate call") return False if not self.audio_receiver.press_accept_call(): self.log.error("Failed to answer call from HF.") return False if not hangup_call(self.log, self.pri_ad): self.log.error("Failed to hangup call.") return False return False def connect_to_headset_when_turned_off_with_iperf(self): """Wrapper function to start iperf and test connection to headset when it is turned off. Returns: True if successful, False otherwise. """ self.run_iperf_and_get_result() self.audio_receiver.clean_up() if not connect_dev_to_headset( self.pri_ad, self.audio_receiver.mac_address, set([BtEnum.BluetoothProfile.HEADSET.value])): self.log.error("Failed to connect to headset.") return True return False def check_headset_reconnection_with_iperf(self): """Wrapper function to start iperf and check behaviour of hfp reconnection.""" self.run_iperf_and_get_result() self.audio_receiver.clean_up() self.audio_receiver.power_on() if not self.pri_ad.droid.bluetoothIsDeviceConnected( self.audio_receiver.mac_address): self.log.error("Device not found in connected list") return False return self.teardown_result() def initiate_call_from_hf_with_iperf(self): """Wrapper function to start iperf and initiate call""" self.run_iperf_and_get_result() if not initiate_disconnect_from_hf(self.audio_receiver, self.pri_ad, self.sec_ad, self.iperf["duration"]): return False return self.teardown_result() def initiate_call_from_hf_bt_discovery_with_iperf(self): """Wrapper function to start iperf, initiate call and perform classic discovery. """ self.run_iperf_and_get_result() tasks = [(initiate_disconnect_from_hf, (self.audio_receiver, self.pri_ad, self.sec_ad, self.iperf["duration"])), (perform_classic_discovery, (self.pri_ad, self.iperf["duration"], self.json_file, self.dev_list))] if not multithread_func(self.log, tasks): return False return self.teardown_result() def initiate_call_associate_ap_with_iperf(self): """Wrapper function to initiate call from primary device and associate with access point and start iperf traffic.""" args = [ lambda: initiate_disconnect_call_dut(self.pri_ad, self.sec_ad, self.iperf["duration"], self.re_phone_number) ] self.run_thread(args) if not connect_wlan_profile(self.pri_ad, self.network): return False self.run_iperf_and_get_result() return self.teardown_result() def test_hfp_call_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp connection. This test is to start TCP-uplink traffic between host machine and android device and test the functional behaviour of hfp connection and call. Steps:. 1. Start TCP-uplink traffic. 2. Initiate call from HF and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_042 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_call_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp connection. This test is to start TCP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection and call. Steps:. 1. Start TCP-downlink traffic. 2. Initiate call from HF and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_043 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_call_with_udp_ul(self): """Starts UDP-uplink traffic with hfp connection. This test is to start UDP-uplink traffic between host machine and android device and test the functional behaviour of hfp connection and call. Steps:. 1. Start UDP-uplink traffic. 2. Initiate call from HF and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_044 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_call_with_udp_dl(self): """Starts UDP-downlink traffic with hfp connection. This test is to start UDP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection and call. Steps:. 1. Start UDP-downlink traffic. 2. Initiate call from HF and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_045 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_call_bluetooth_discovery_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp connection and bluetooth discovery. This test is to start TCP-uplink traffic between host machine and android device and test the functional behaviour of hfp connection and call and bluetooth discovery. Steps:. 1. Start TCP-uplink traffic. 2. Initiate call from HF and disconnect call from primary device. 3. Start bluetooth discovery. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_046 """ if not self.initiate_call_from_hf_bt_discovery_with_iperf(): return False return True def test_hfp_call_bluetooth_discovery_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp connection and bluetooth discovery. This test is to start TCP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection and call and bluetooth discovery. Steps:. 1. Start TCP-downlink traffic. 2. Initiate call from HF and disconnect call from primary device. 3. Start bluetooth discovery. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_047 """ if not self.initiate_call_from_hf_bt_discovery_with_iperf(): return False return True def test_hfp_call_bluetooth_discovery_with_udp_ul(self): """Starts UDP-uplink traffic with hfp connection and bluetooth discovery. This test is to start UDP-uplink traffic between host machine and android device and test the functional behaviour of hfp connection and call and bluetooth discovery. Steps:. 1. Start UDP-uplink traffic. 2. Initiate call from HF and disconnect call from primary device. 3. Start bluetooth discovery. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_048 """ if not self.initiate_call_from_hf_bt_discovery_with_iperf(): return False return True def test_hfp_call_bluetooth_discovery_with_udp_dl(self): """Starts UDP-downlink traffic with hfp connection and bluetooth discovery. This test is to start UDP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection and call and bluetooth discovery. Steps:. 1. Start UDP-downlink traffic. 2. Initiate call from HF and disconnect call from primary device. 3. Start bluetooth discovery. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_049 """ if not self.initiate_call_from_hf_bt_discovery_with_iperf(): return False return True def test_hfp_call_and_associate_ap_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp call. This test is to start TCP-uplink traffic between host machine and android device and test functional behaviour of hfp call connection while associating with AP. Steps: 1. Initiate call from HF and disconnect call from primary device. 2. Associate with AP. 3. Start TCP-uplink traffic. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_050 """ if not self.initiate_call_associate_ap_with_iperf(): return False return True def test_hfp_call_and_associate_ap_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp call. This test is to start TCP-downlink traffic between host machine and android device and test functional behaviour of hfp call connection while associating with AP. Steps: 1. Initiate call from HF and disconnect call from primary device. 2. Associate with AP. 3. Start TCP-downlink traffic. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_051 """ if not self.initiate_call_associate_ap_with_iperf(): return False return True def test_hfp_call_and_associate_ap_with_udp_ul(self): """Starts UDP-uplink traffic with hfp call. This test is to start UDP-uplink traffic between host machine and android device and test functional behaviour of hfp call connection while associating with AP. Steps: 1. Initiate call from HF and disconnect call from primary device. 2. Associate with AP. 3. Start UDP-uplink traffic. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_052 """ if not self.initiate_call_associate_ap_with_iperf(): return False return True def test_hfp_call_and_associate_ap_with_udp_dl(self): """Starts UDP-downlink traffic with hfp call. This test is to start UDP-downlink traffic between host machine and android device and test functional behaviour of hfp call connection while associating with AP. Steps: 1. Initiate call from HF and disconnect call from primary device. 2. Associate with AP. 3. Start UDP-downlink traffic. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_053 """ if not self.initiate_call_associate_ap_with_iperf(): return False return True def test_hfp_redial_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp connection. This test is to start TCP-uplink traffic between host machine and android device with hfp connection. Steps: 1. Start TCP-uplink traffic. 2. Initiate call from HF(last dialed number) and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_054 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_redial_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp connection. This test is to start TCP-downlink traffic between host machine and android device with hfp connection. Steps: 1. Start TCP-downlink traffic. 2. Initiate call from HF(last dialed number) and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_055 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_redial_with_udp_ul(self): """Starts UDP-uplink traffic with hfp connection. This test is to start UDP-uplink traffic between host machine and android device with hfp connection. Steps: 1. Start UDP-uplink traffic. 2. Initiate call from HF(last dialed number) and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_056 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_redial_with_udp_dl(self): """Starts UDP-downlink traffic with hfp connection. This test is to start TCP-downlink traffic between host machine and android device with hfp connection. Steps: 1. Start UDP-downlink traffic. 2. Initiate call from HF(last dialed number) and disconnect call from primary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_057 """ if not self.initiate_call_from_hf_with_iperf(): return False return True def test_hfp_reconnection_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp reconnection. This test is to start TCP-uplink traffic between host machine and android device and test the functional behaviour of hfp reconnection. Steps:. 1. Start TCP-uplink traffic. 2. Connect HF to DUT. 3. Disconnect HF from DUT. 4. Switch off the headset and turn ON HF to reconnect. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_062 """ if not self.check_headset_reconnection_with_iperf(): return False return True def test_hfp_reconnection_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp reconnection. This test is to start TCP-downlink traffic between host machine and android device and test the functional behaviour of hfp reconnection. Steps:. 1. Start TCP-downlink traffic. 2. Connect HF to DUT. 3. Disconnect HF from DUT. 4. Switch off the headset and turn ON HF to reconnect. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_063 """ if not self.check_headset_reconnection_with_iperf(): return False return True def test_hfp_reconnection_with_udp_ul(self): """Starts UDP-uplink traffic with hfp reconnection. This test is to start UDP-uplink traffic between host machine and android device and test the functional behaviour of hfp reconnection. Steps:. 1. Start UDP-uplink traffic. 2. Connect HF to DUT. 3. Disconnect HF from DUT. 4. Switch off the headset and turn ON HF to reconnect. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_064 """ if not self.check_headset_reconnection_with_iperf(): return False return True def test_hfp_reconnection_with_udp_dl(self): """Starts UDP-downlink traffic with hfp reconnection. This test is to start UDP-downlink traffic between host machine and android device and test the functional behaviour of hfp reconnection. Steps:. 1. Start UDP-downlink traffic. 2. Connect HF to DUT. 3. Disconnect HF from DUT. 4. Switch off the headset and turn ON HF to reconnect. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_065 """ if not self.check_headset_reconnection_with_iperf(): return False return True def test_hfp_connection_when_hf_turned_off_with_tcp_ul(self): """Starts TCP-uplink traffic with hfp connection. This test is to start TCP-Uplink traffic between host machine and android device and test the functional behaviour of hfp connection when device is off. Steps: 1. Start TCP-uplink traffic. 2. Make sure headset is turned off. 3. Initiate hfp connection to headset from DUT. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_072 """ if not self.connect_to_headset_when_turned_off_with_iperf(): return False return self.teardown_result() def test_hfp_connection_when_hf_turned_off_with_tcp_dl(self): """Starts TCP-downlink traffic with hfp connection. This test is to start TCP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection when device is off. Steps: 1. Start TCP-downlink traffic. 2. Make sure headset is turned off. 3. Initiate hfp connection to headset from DUT. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_073 """ if not self.connect_to_headset_when_turned_off_with_iperf(): return False return self.teardown_result() def test_hfp_connection_when_hf_turned_off_with_udp_ul(self): """Starts UDP-uplink traffic with hfp connection. This test is to start UDP-Uplink traffic between host machine and android device and test the functional behaviour of hfp connection when device is off. Steps: 1. Start UDP-uplink traffic. 2. Make sure headset is turned off. 3. Initiate hfp connection to headset from DUT. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_074 """ if not self.connect_to_headset_when_turned_off_with_iperf(): return False return self.teardown_result() def test_hfp_connection_when_hf_turned_off_with_udp_dl(self): """Starts UDP-downlink traffic with hfp connection. This test is to start UDP-downlink traffic between host machine and android device and test the functional behaviour of hfp connection when device is off. Steps: 1. Start UDP-downlink traffic. 2. Make sure headset is turned off. 3. Initiate hfp connection to headset from DUT. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_075 """ if not self.connect_to_headset_when_turned_off_with_iperf(): return False return self.teardown_result() def test_hfp_call_with_fping(self): """Starts fping with hfp call connection. This test is to start fping between host machine and android device and test the functional behaviour of hfp call. Steps: 1. Start fping from AP backend to android device. 1. Initiate call from headset to secondary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_078 """ tasks = [(start_fping, (self.pri_ad, self.iperf["duration"], self.fping_drop_tolerance)), (initiate_disconnect_from_hf, (self.audio_receiver, self.pri_ad, self.sec_ad, self.iperf["duration"]))] if not multithread_func(self.log, tasks): return False return True def test_hfp_call_toggle_screen_state_with_fping(self): """Starts fping with hfp call connection. This test is to start fping between host machine and android device and test the functional behaviour of hfp call when toggling the screen state. Steps: 1. Start fping from AP backend. 1. Initiate call from primary device headset to secondary device. Returns: True if successful, False otherwise. Test Id: Bt_CoEx_081 """ tasks = [(start_fping, (self.pri_ad, self.iperf["duration"], self.fping_drop_tolerance)), (initiate_disconnect_from_hf, (self.audio_receiver, self.pri_ad, self.sec_ad, self.iperf["duration"])), (toggle_screen_state, (self.pri_ad, self.iterations))] if not multithread_func(self.log, tasks): return False return True