#!/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. """ This is base class for tests that exercises different GATT procedures between two connected devices. Setup/Teardown methods take care of establishing connection, and doing GATT DB initialization/discovery. """ import os import time from queue import Empty from acts.keys import Config from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest from acts_contrib.test_utils.bt.bt_test_utils import pair_pri_to_sec from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phones_default_state from acts_contrib.test_utils.tel.tel_test_utils import get_phone_number from acts_contrib.test_utils.tel.tel_test_utils import setup_droid_properties class BluetoothCarHfpBaseTest(BluetoothBaseTest): DEFAULT_TIMEOUT = 15 ag_phone_number = "" re_phone_number = "" def __init__(self, controllers): BluetoothBaseTest.__init__(self, controllers) # HF : HandsFree (CarKit role) self.hf = self.android_devices[0] self.hf.log.info("Role set to HF (HandsFree Carkit role).") # AG : Audio Gateway (Phone role) self.ag = self.android_devices[1] self.ag.log.info("Role set to AG (Audio Gateway Phone role).") # RE : Remote Device (Phone being talked to role) if len(self.android_devices) > 2: self.re = self.android_devices[2] self.re.log.info("Role set to RE (Remote device).") else: self.re = None if len(self.android_devices) > 3: self.re2 = self.android_devices[3] self.re2.log.info("Role set to RE2 (Remote device 2).") else: self.re2 = None def setup_class(self): super(BluetoothCarHfpBaseTest, self).setup_class() if not "sim_conf_file" in self.user_params.keys(): self.log.error("Missing mandatory user config \"sim_conf_file\"!") return False sim_conf_file = self.user_params["sim_conf_file"][0] if not os.path.isfile(sim_conf_file): sim_conf_file = os.path.join( self.user_params[Config.key_config_path.value], sim_conf_file) if not os.path.isfile(sim_conf_file): self.log.error("Unable to load user config " + sim_conf_file + " from test config file.") return False setup_droid_properties(self.log, self.ag, sim_conf_file) self.ag_phone_number = get_phone_number(self.log, self.ag) self.ag.log.info("ag tel: {}".format(self.ag_phone_number)) if self.re: setup_droid_properties(self.log, self.re, sim_conf_file) self.re_phone_number = get_phone_number(self.log, self.re) self.re.log.info("re tel: {}".format(self.re_phone_number)) if self.re2: setup_droid_properties(self.log, self.re2, sim_conf_file) self.re2_phone_number = get_phone_number(self.log, self.re2) self.re2.log.info("re2 tel: {}".format(self.re2_phone_number)) # Pair and connect the devices. # Grace time inbetween stack state changes time.sleep(5) if not pair_pri_to_sec( self.hf, self.ag, attempts=4, auto_confirm=False): self.log.error("Failed to pair") return False return True def setup_test(self): if not super(BluetoothCarHfpBaseTest, self).setup_test(): return False return ensure_phones_default_state(self.log, self.android_devices[1:]) def teardown_test(self): if not super(BluetoothCarHfpBaseTest, self).teardown_test(): return False return ensure_phones_default_state(self.log, self.android_devices[1:]) def on_fail(self, test_name, begin_time): result = True if not super(BluetoothCarHfpBaseTest, self).on_fail(test_name, begin_time): result = False ensure_phones_default_state(self.log, self.android_devices[1:]) return result