summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2018-06-06 23:45:34 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-06-06 23:45:34 +0000
commit8375a937d006cdec4ceca0110288471ea6a69bd9 (patch)
treec9f703241ac68a81f542096d11b5641d04af038c
parent9c0e9b2a116a5c67cce2cf503977b7a1f0e13cdb (diff)
parente4292b7a93fdee524e8051a5319f6dca51f7b408 (diff)
downloadplatform_tools_test_connectivity-8375a937d006cdec4ceca0110288471ea6a69bd9.tar.gz
platform_tools_test_connectivity-8375a937d006cdec4ceca0110288471ea6a69bd9.tar.bz2
platform_tools_test_connectivity-8375a937d006cdec4ceca0110288471ea6a69bd9.zip
Merge changes Ib593cdbf,Iacad78dd,Iaa69c5ee,I8d86aa76,I19c56c8b, ... into pi-dev
* changes: Add new tools for GATT and L2CAP. Add new instructions for AVDTP and BNEP Change access of libraries to Android bt libs Add special attributes for Bluetooth libs Add E2E tests for Bluetooth carkit testing Change imports for ble_lib and add new function Add new library for common adb shell commands. Fix GattToolTest Change gattc_lib to use common nomenclature Return scan_callback when looking for generic addr Change rfcomm_lib to use common nomenclature Change bta_lib to use common nomenclature Add additional instructions to GATT.
-rw-r--r--acts/framework/acts/test_utils/bt/BluetoothBaseTest.py37
-rw-r--r--acts/framework/acts/test_utils/bt/ble_lib.py41
-rw-r--r--acts/framework/acts/test_utils/bt/bt_carkit_lib.py830
-rw-r--r--acts/framework/acts/test_utils/bt/bt_coc_test_utils.py3
-rw-r--r--acts/framework/acts/test_utils/bt/bt_constants.py7
-rw-r--r--acts/framework/acts/test_utils/bt/bt_gatt_utils.py2
-rw-r--r--acts/framework/acts/test_utils/bt/bt_test_utils.py4
-rw-r--r--acts/framework/acts/test_utils/bt/bta_lib.py22
-rw-r--r--acts/framework/acts/test_utils/bt/gattc_lib.py114
-rw-r--r--acts/framework/acts/test_utils/bt/gatts_lib.py10
-rw-r--r--acts/framework/acts/test_utils/bt/rfcomm_lib.py18
-rw-r--r--acts/framework/acts/test_utils/bt/shell_commands_lib.py44
-rw-r--r--acts/tests/google/ble/gatt/GattConnectTest.py85
-rw-r--r--acts/tests/google/ble/gatt/GattToolTest.py46
-rw-r--r--acts/tests/google/ble/system_tests/BleStressTest.py18
-rw-r--r--acts/tests/google/bt/pts/cmd_input.py605
-rw-r--r--acts/tests/google/bt/pts/instructions/AVDTP_PTS_INSTUCTIONS20
-rw-r--r--acts/tests/google/bt/pts/instructions/BNEP_PTS_INSTRUCTIONS80
-rw-r--r--acts/tests/google/bt/pts/instructions/GATT_PTS_INSTRUCTIONS185
-rw-r--r--acts/tests/google/bt/pts/instructions/L2CAP_PTS_INSTRUCTIONS120
20 files changed, 2055 insertions, 236 deletions
diff --git a/acts/framework/acts/test_utils/bt/BluetoothBaseTest.py b/acts/framework/acts/test_utils/bt/BluetoothBaseTest.py
index cded9f56ec..01cb76af58 100644
--- a/acts/framework/acts/test_utils/bt/BluetoothBaseTest.py
+++ b/acts/framework/acts/test_utils/bt/BluetoothBaseTest.py
@@ -29,6 +29,13 @@ from acts.controllers import android_device
from acts.test_utils.bt.bt_test_utils import reset_bluetooth
from acts.test_utils.bt.bt_test_utils import setup_multiple_devices_for_bt_test
from acts.test_utils.bt.bt_test_utils import take_btsnoop_logs
+from acts.test_utils.bt.ble_lib import BleLib
+from acts.test_utils.bt.bta_lib import BtaLib
+from acts.test_utils.bt.config_lib import ConfigLib
+from acts.test_utils.bt.gattc_lib import GattClientLib
+from acts.test_utils.bt.gatts_lib import GattServerLib
+from acts.test_utils.bt.rfcomm_lib import RfcommLib
+from acts.test_utils.bt.shell_commands_lib import ShellCommands
class BluetoothBaseTest(BaseTestClass):
@@ -38,6 +45,8 @@ class BluetoothBaseTest(BaseTestClass):
def __init__(self, controllers):
BaseTestClass.__init__(self, controllers)
+ for ad in self.android_devices:
+ self._setup_bt_libs(ad)
# Use for logging in the test cases to facilitate
# faster log lookup and reduce ambiguity in logging.
@@ -109,8 +118,9 @@ class BluetoothBaseTest(BaseTestClass):
return True
def on_fail(self, test_name, begin_time):
- self.log.debug("Test {} failed. Gathering bugreport and btsnoop logs".
- format(test_name))
+ self.log.debug(
+ "Test {} failed. Gathering bugreport and btsnoop logs".format(
+ test_name))
take_btsnoop_logs(self.android_devices, self, test_name)
self._take_bug_report(test_name, begin_time)
for _ in range(5):
@@ -142,3 +152,26 @@ class BluetoothBaseTest(BaseTestClass):
self.log.info("Total items in list {}".format(
len(self.timer_list)))
self.timer_list = []
+
+ def _setup_bt_libs(self, android_device):
+ # Bluetooth Low Energy library.
+ setattr(android_device, "ble", BleLib(
+ log=self.log, dut=android_device))
+ # Bluetooth Adapter library.
+ setattr(android_device, "bta", BtaLib(
+ log=self.log, dut=android_device))
+ # Bluetooth stack config library.
+ setattr(android_device, "config",
+ ConfigLib(log=self.log, dut=android_device))
+ # GATT Client library.
+ setattr(android_device, "gattc",
+ GattClientLib(log=self.log, dut=android_device))
+ # GATT Server library.
+ setattr(android_device, "gatts",
+ GattServerLib(log=self.log, dut=android_device))
+ # RFCOMM library.
+ setattr(android_device, "rfcomm",
+ RfcommLib(log=self.log, dut=android_device))
+ # Shell command library
+ setattr(android_device, "shell",
+ ShellCommands(log=self.log, dut=android_device))
diff --git a/acts/framework/acts/test_utils/bt/ble_lib.py b/acts/framework/acts/test_utils/bt/ble_lib.py
index 379f182cc5..3bbaede94f 100644
--- a/acts/framework/acts/test_utils/bt/ble_lib.py
+++ b/acts/framework/acts/test_utils/bt/ble_lib.py
@@ -21,10 +21,10 @@ from acts.test_utils.bt.bt_constants import ble_advertise_settings_modes
from acts.test_utils.bt.bt_constants import ble_advertise_settings_tx_powers
from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts.test_utils.bt.bt_constants import small_timeout
-from acts.test_utils.bt.bt_test_utils import adv_fail
+from acts.test_utils.bt.bt_constants import adv_fail
from acts.test_utils.bt.bt_constants import adv_succ
-from acts.test_utils.bt.bt_test_utils import advertising_set_on_own_address_read
-from acts.test_utils.bt.bt_test_utils import advertising_set_started
+from acts.test_utils.bt.bt_constants import advertising_set_on_own_address_read
+from acts.test_utils.bt.bt_constants import advertising_set_started
from acts.test_utils.bt.bt_test_utils import generate_ble_advertise_objects
import time
@@ -32,11 +32,10 @@ import os
class BleLib():
- def __init__(self, log, mac_addr, dut):
+ def __init__(self, log, dut):
self.advertisement_list = []
self.dut = dut
self.log = log
- self.mac_addr = mac_addr
self.default_timeout = 5
self.set_advertisement_list = []
self.generic_uuid = "0000{}-0000-1000-8000-00805f9b34fb"
@@ -178,3 +177,35 @@ class BleLib():
return
self.dut.droid.bleStopBleAdvertising(callback_id)
self.advertisement_list.remove(callback_id)
+
+ def start_max_advertisements(self, line):
+ scan_response = None
+ if line:
+ scan_response = bool(line)
+ while (True):
+ try:
+ self.dut.droid.bleSetAdvertiseSettingsAdvertiseMode(
+ ble_advertise_settings_modes['low_latency'])
+ self.dut.droid.bleSetAdvertiseSettingsIsConnectable(True)
+ advertise_callback, advertise_data, advertise_settings = (
+ generate_ble_advertise_objects(self.dut.droid))
+ if scan_response:
+ self.dut.droid.bleStartBleAdvertisingWithScanResponse(
+ advertise_callback, advertise_data, advertise_settings,
+ advertise_data)
+ else:
+ self.dut.droid.bleStartBleAdvertising(
+ advertise_callback, advertise_data, advertise_settings)
+ if self._verify_ble_adv_started(advertise_callback):
+ self.log.info(
+ "Tracking Callback ID: {}".format(advertise_callback))
+ self.advertisement_list.append(advertise_callback)
+ self.log.info(self.advertisement_list)
+ else:
+ self.log.info("Advertisements active: {}".format(
+ len(self.advertisement_list)))
+ return False
+ except Exception as err:
+ self.log.info("Advertisements active: {}".format(
+ len(self.advertisement_list)))
+ return True
diff --git a/acts/framework/acts/test_utils/bt/bt_carkit_lib.py b/acts/framework/acts/test_utils/bt/bt_carkit_lib.py
new file mode 100644
index 0000000000..f1fa9fa763
--- /dev/null
+++ b/acts/framework/acts/test_utils/bt/bt_carkit_lib.py
@@ -0,0 +1,830 @@
+#/usr/bin/env python3.4
+#
+# 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.
+
+import time
+import os
+
+from acts.keys import Config
+from acts.utils import rand_ascii_str
+from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
+from acts.test_utils.bt.bt_constants import logcat_strings
+from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+from acts.test_utils.tel.tel_defines import AUDIO_ROUTE_BLUETOOTH
+from acts.test_utils.tel.tel_defines import AUDIO_ROUTE_EARPIECE
+from acts.test_utils.tel.tel_defines import AUDIO_ROUTE_SPEAKER
+from acts.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
+from acts.test_utils.tel.tel_test_utils import get_phone_number
+from acts.test_utils.tel.tel_test_utils import hangup_call
+from acts.test_utils.tel.tel_test_utils import initiate_call
+from acts.test_utils.tel.tel_test_utils import num_active_calls
+from acts.test_utils.tel.tel_test_utils import sms_send_receive_verify
+from acts.test_utils.tel.tel_test_utils import wait_and_answer_call
+from acts.test_utils.tel.tel_voice_utils import get_audio_route
+from acts.test_utils.tel.tel_voice_utils import set_audio_route
+from acts.test_utils.tel.tel_voice_utils import swap_calls
+from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
+from acts.test_utils.tel.tel_test_utils import call_setup_teardown
+from acts.utils import exe_cmd
+from acts.utils import get_current_epoch_time
+
+KEYCODE_VOLUME_UP = "input keyevent 24"
+KEYCODE_VOLUME_DOWN = "input keyevent 25"
+KEYCODE_EVENT_PLAY_PAUSE = "input keyevent 85"
+KEYCODE_MEDIA_STOP = "input keyevent 86"
+KEYCODE_EVENT_NEXT = "input keyevent 87"
+KEYCODE_EVENT_PREVIOUS = "input keyevent 88"
+KEYCODE_MEDIA_REWIND = "input keyevent 89"
+KEYCODE_MEDIA_FAST_FORWARD = "input keyevent 90"
+KEYCODE_MUTE = "input keyevent 91"
+
+default_timeout = 10
+
+
+class E2eBtCarkitLib():
+
+ android_devices = []
+ short_timeout = 3
+ active_call_id = None
+ hold_call_id = None
+ log = None
+ mac_address = None
+
+ def __init__(self, log, target_mac_address=None):
+ self.log = log
+ self.target_mac_address = target_mac_address
+
+ def connect_hsp_helper(self, ad):
+ end_time = time.time() + default_timeout + 10
+ connected_hsp_devices = len(ad.droid.bluetoothHspGetConnectedDevices())
+ while connected_hsp_devices != 1 and time.time() < end_time:
+ try:
+ ad.droid.bluetoothHspConnect(self.target_mac_address)
+ time.sleep(3)
+ if len(ad.droid.bluetoothHspGetConnectedDevices() == 1):
+ break
+ except Exception:
+ self.log.debug("Failed to connect hsp trying again...")
+ try:
+ ad.droid.bluetoothConnectBonded(self.target_mac_address)
+ except Exception:
+ self.log.info("Failed to connect to bonded device...")
+ connected_hsp_devices = len(
+ ad.droid.bluetoothHspGetConnectedDevices())
+ if connected_hsp_devices != 1:
+ self.log.error("Failed to reconnect to HSP service...")
+ return False
+ self.log.info("Connected to HSP service...")
+ return True
+
+ def setup_multi_call(self, caller0, caller1, callee):
+ outgoing_num = get_phone_number(self.log, callee)
+ if not initiate_call(self.log, caller0, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, callee):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ if not initiate_call(self.log, caller1, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, callee):
+ self.log.error("Failed to answer call.")
+ return False
+ return True
+
+ def process_tests(self, tests):
+ for test in tests:
+ try:
+ test()
+ except Exception as err:
+ self.log.error(err)
+
+ def run_suite_hfp_tests(self):
+ tests = [
+ self.outgoing_call_private_number,
+ self.outgoing_call_unknown_contact,
+ self.incomming_call_private_number,
+ self.incomming_call_unknown_contact,
+ self.outgoing_call_multiple_iterations,
+ self.outgoing_call_hsp_disabled_then_enabled_during_call,
+ self.call_audio_routes,
+ self.sms_during_incomming_call,
+ self.multi_incomming_call,
+ self.multi_call_audio_routing,
+ self.multi_call_swap_multiple_times,
+ self.outgoing_call_a2dp_play_before_and_after,
+ ]
+ _process_tests(tests)
+
+ def run_suite_hfp_conf_tests(self):
+ tests = [
+ self.multi_call_join_conference_call,
+ self.multi_call_join_conference_call_hangup_conf_call,
+ self.outgoing_multi_call_join_conference_call,
+ self.multi_call_join_conference_call_audio_routes,
+ ]
+ _process_tests(tests)
+
+ def run_suite_map_tests(self):
+ tests = [
+ self.sms_receive_different_sizes,
+ self.sms_receive_multiple,
+ self.sms_send_outgoing_texts,
+ ]
+ _process_tests(tests)
+
+ def run_suite_avrcp_tests(self):
+ tests = [
+ self.avrcp_play_pause,
+ self.avrcp_next_previous_song,
+ self.avrcp_next_previous,
+ self.avrcp_next_repetative,
+ ]
+ _process_tests(tests)
+
+ def disconnect_reconnect_multiple_iterations(self, pri_dut):
+ iteration_count = 5
+ self.log.info(
+ "Test disconnect-reconnect scenario from phone {} times.".format(
+ iteration_count))
+ self.log.info(
+ "This test will prompt for user interaction after each reconnect.")
+ input("Press enter to execute this testcase...")
+ #Assumes only one devices connected
+ grace_timeout = 4 #disconnect and reconnect timeout
+ for n in range(iteration_count):
+ self.log.info("Test iteration {}.".format(n + 1))
+ self.log.info("Disconnecting device {}...".format(
+ self.target_mac_address))
+ pri_dut.droid.bluetoothDisconnectConnected(self.target_mac_address)
+ # May have to do a longer sleep for carkits.... need to test
+ time.sleep(grace_timeout)
+ self.log.info("Connecting device {}...".format(
+ self.target_mac_address))
+ pri_dut.droid.bluetoothConnectBonded(self.target_mac_address)
+ if not self.connect_hsp_helper(pri_dut):
+ return False
+ start_time = time.time()
+ connected_devices = pri_dut.droid.bluetoothGetConnectedDevices()
+ self.log.info(
+ "Waiting up to 10 seconds for device to reconnect...")
+ while time.time() < start_time + 10 and len(connected_devices) != 1:
+ connected_devices = pri_dut.droid.bluetoothGetConnectedDevices(
+ )
+ time.sleep(1)
+ if len(connected_devices) != 1:
+ self.log.error(
+ "Failed to reconnect at iteration {}... continuing".format(
+ n))
+ return False
+ input("Continue to next iteration?")
+ return True
+
+ def disconnect_a2dp_only_then_reconnect(self, pri_dut):
+ self.log.info(
+ "Test disconnect-reconnect a2dp only scenario from phone.")
+ input("Press enter to execute this testcase...")
+ if not pri_dut.droid.bluetoothA2dpDisconnect(self.target_mac_address):
+ self.log.error("Failed to disconnect A2DP service...")
+ return False
+ time.sleep(self.short_timeout)
+ result = input("Confirm A2DP disconnected? (Y/n) ")
+ if result == "n":
+ self.log.error(
+ "Tester confirmed that A2DP did not disconnect. Failing test.")
+ return False
+ if len(pri_dut.droid.bluetoothA2dpGetConnectedDevices()) != 0:
+ self.log.error("Failed to disconnect from A2DP service")
+ return False
+ pri_dut.droid.bluetoothA2dpConnect(self.target_mac_address)
+ time.sleep(self.short_timeout)
+ if len(pri_dut.droid.bluetoothA2dpGetConnectedDevices()) != 1:
+ self.log.error("Failed to reconnect to A2DP service...")
+ return False
+ return True
+
+ def disconnect_hsp_only_then_reconnect(self, pri_dut):
+ self.log.info(
+ "Test disconnect-reconnect hsp only scenario from phone.")
+ input("Press enter to execute this testcase...")
+ if not pri_dut.droid.bluetoothHspDisconnect(self.target_mac_address):
+ self.log.error("Failed to disconnect HSP service...")
+ return False
+ time.sleep(self.short_timeout)
+ result = input("Confirm HFP disconnected? (Y/n) ")
+ pri_dut.droid.bluetoothHspConnect(self.target_mac_address)
+ time.sleep(self.short_timeout)
+ if len(pri_dut.droid.bluetoothHspGetConnectedDevices()) != 1:
+ self.log.error("Failed to connect from HSP service")
+ return False
+ return True
+
+ def disconnect_both_hsp_and_a2dp_then_reconnect(self, pri_dut):
+ self.log.info(
+ "Test disconnect-reconnect hsp and a2dp scenario from phone.")
+ input("Press enter to execute this testcase...")
+ if not pri_dut.droid.bluetoothA2dpDisconnect(self.target_mac_address):
+ self.log.error("Failed to disconnect A2DP service...")
+ return False
+ if not pri_dut.droid.bluetoothHspDisconnect(self.target_mac_address):
+ self.log.error("Failed to disconnect HSP service...")
+ return False
+ time.sleep(self.short_timeout)
+ if len(pri_dut.droid.bluetoothA2dpGetConnectedDevices()) != 0:
+ self.log.error("Failed to disconnect from A2DP service")
+ return False
+ if len(pri_dut.droid.bluetoothHspGetConnectedDevices()) != 0:
+ self.log.error("Failed to disconnect from HSP service")
+ return False
+ result = input("Confirm HFP and A2DP disconnected? (Y/n) ")
+ pri_dut.droid.bluetoothConnectBonded(self.target_mac_address)
+ time.sleep(self.short_timeout)
+ if len(pri_dut.droid.bluetoothA2dpGetConnectedDevices()) != 1:
+ self.log.error("Failed to reconnect to A2DP service...")
+ return False
+ if not self.connect_hsp_helper(pri_dut):
+ return False
+ return True
+
+ def outgoing_call_private_number(self, pri_dut, ter_dut):
+ self.log.info(
+ "Test outgoing call scenario from phone to private number")
+ input("Press enter to execute this testcase...")
+ outgoing_num = "*67" + get_phone_number(self.log, ter_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, ter_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def outgoing_call_a2dp_play_before_and_after(self, pri_dut, sec_dut):
+ self.log.info(
+ "Test outgoing call scenario while playing music. Music should resume after call."
+ )
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ input(
+ "Press enter to execute this testcase when music is in a play state..."
+ )
+ outgoing_num = get_phone_number(self.log, sec_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, sec_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter when music continues to play.")
+ self.log.info("Pausing Music...")
+ pri_dut.adb.shell(KEYCODE_EVENT_PLAY_PAUSE)
+ return True
+
+ def outgoing_call_unknown_contact(self, pri_dut, ter_dut):
+ self.log.info(
+ "Test outgoing call scenario from phone to unknow contact")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, ter_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, ter_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def incomming_call_private_number(self, pri_dut, ter_dut):
+ self.log.info(
+ "Test incomming call scenario to phone from private number")
+ input("Press enter to execute this testcase...")
+ outgoing_num = "*67" + get_phone_number(self.log, pri_dut)
+ if not initiate_call(self.log, ter_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, pri_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+
+ return True
+
+ def incomming_call_unknown_contact(self, pri_dut, ter_dut):
+ self.log.info(
+ "Test incomming call scenario to phone from unknown contact")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, pri_dut)
+ if not initiate_call(self.log, ter_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, pri_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def outgoing_call_multiple_iterations(self, pri_dut, sec_dut):
+ iteration_count = 3
+ self.log.info(
+ "Test outgoing call scenario from phone {} times from known contact".
+ format(iteration_count))
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, sec_dut)
+ for _ in range(iteration_count):
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, sec_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def outgoing_call_hsp_disabled_then_enabled_during_call(
+ self, pri_dut, sec_dut):
+ self.log.info(
+ "Test outgoing call hsp disabled then enable during call.")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, sec_dut)
+ if not pri_dut.droid.bluetoothHspDisconnect(self.target_mac_address):
+ self.log.error("Failed to disconnect HSP service...")
+ return False
+ time.sleep(self.short_timeout)
+ if len(pri_dut.droid.bluetoothHspGetConnectedDevices()) != 0:
+ self.log.error("Failed to disconnect from HSP service")
+ return False
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ time.sleep(default_timeout)
+ pri_dut.droid.bluetoothConnectBonded(self.target_mac_address)
+ time.sleep(self.short_timeout)
+ test_result = True
+ if len(pri_dut.droid.bluetoothHspGetConnectedDevices()) != 1:
+ self.log.error("Failed to reconnect to HSP service...")
+ return
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return test_result
+
+ def call_audio_routes(self, pri_dut, sec_dut):
+ self.log.info("Test various audio routes scenario from phone.")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, sec_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, sec_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ call_id = pri_dut.droid.telecomCallGetCallIds()[0]
+ pri_dut.droid.telecomCallPlayDtmfTone(call_id, "9")
+ input("Press enter to switch to speaker...")
+ self.log.info("Switching to speaker.")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_SPEAKER)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_SPEAKER:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_SPEAKER))
+ return False
+ input("Press enter to switch to earpiece...")
+ self.log.info("Switching to earpiece.")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_EARPIECE)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_EARPIECE:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_EARPIECE))
+ return False
+ input("Press enter to switch to Bluetooth...")
+ self.log.info("Switching to Bluetooth...")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_BLUETOOTH)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_BLUETOOTH:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_BLUETOOTH))
+ return False
+ input("Press enter to hangup call...")
+ self.log.info("Hanging up call...")
+ pri_dut.droid.telecomCallStopDtmfTone(call_id)
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def sms_receive_different_sizes(self, pri_dut, sec_dut):
+ self.log.info("Test recieve sms.")
+ input("Press enter to execute this testcase...")
+ msg = [rand_ascii_str(50), rand_ascii_str(1), rand_ascii_str(500)]
+ if not sms_send_receive_verify(self.log, sec_dut, pri_dut, msg):
+ return False
+ else:
+ self.log.info("Successfully sent sms. Please verify on carkit.")
+ return True
+
+ def sms_receive_multiple(self, pri_dut, sec_dut):
+ text_count = 10
+ self.log.info(
+ "Test sending {} sms messages to phone.".format(text_count))
+ input("Press enter to execute this testcase...")
+ for _ in range(text_count):
+ msg = [rand_ascii_str(50)]
+ if not sms_send_receive_verify(self.log, sec_dut, pri_dut, msg):
+ return False
+ else:
+ self.log.info(
+ "Successfully sent sms. Please verify on carkit.")
+ return True
+
+ def sms_send_outgoing_texts(self, pri_dut, sec_dut):
+ self.log.info("Test send sms of different sizes.")
+ input("Press enter to execute this testcase...")
+ msg = [rand_ascii_str(50), rand_ascii_str(1), rand_ascii_str(500)]
+ if not sms_send_receive_verify(self.log, pri_dut, sec_dut, msg):
+ return False
+ else:
+ self.log.info("Successfully sent sms. Please verify on carkit.")
+ return True
+
+ def sms_during_incomming_call(self, pri_dut, sec_dut):
+ self.log.info(
+ "Test incomming call scenario to phone from unknown contact")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, pri_dut)
+ if not initiate_call(self.log, sec_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, pri_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ msg = [rand_ascii_str(10)]
+ if not sms_send_receive_verify(self.log, sec_dut, pri_dut, msg):
+ return False
+ else:
+ self.log.info("Successfully sent sms. Please verify on carkit.")
+ input("Press enter to hangup call...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_incomming_call(self, pri_dut, sec_dut, ter_dut):
+ self.log.info("Test 2 incomming calls scenario to phone.")
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to hangup call 1...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter to hangup call 2...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_call_audio_routing(self, pri_dut, sec_dut, ter_dut):
+ self.log.info(
+ "Test 2 incomming calls scenario to phone, then test audio routing."
+ )
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to switch to earpiece...")
+ self.log.info("Switching to earpiece.")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_EARPIECE)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_EARPIECE:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_EARPIECE))
+ return False
+ input("Press enter to switch to Bluetooth...")
+ self.log.info("Switching to Bluetooth...")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_BLUETOOTH)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_BLUETOOTH:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_BLUETOOTH))
+ return False
+ input("Press enter to hangup call 1...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter to hangup call 2...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_call_swap_multiple_times(self, pri_dut, sec_dut, ter_dut):
+ self.log.info(
+ "Test 2 incomming calls scenario to phone, then test audio routing."
+ )
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to swap active calls...")
+ calls = pri_dut.droid.telecomCallGetCallIds()
+ if not swap_calls(self.log, [pri_dut, sec_dut, ter_dut], calls[0],
+ calls[1], 5):
+ return False
+ input("Press enter to hangup call 1...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter to hangup call 2...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_call_join_conference_call(self, pri_dut, sec_dut, ter_dut):
+ self.log.info(
+ "Test 2 incomming calls scenario to phone then join the calls.")
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to join active calls...")
+ calls = pri_dut.droid.telecomCallGetCallIds()
+ pri_dut.droid.telecomCallJoinCallsInConf(calls[0], calls[1])
+ time.sleep(WAIT_TIME_IN_CALL)
+ if num_active_calls(self.log, pri_dut) != 4:
+ self.log.error("Total number of call ids in {} is not 4.".format(
+ pri_dut.serial))
+ return False
+ input("Press enter to hangup call 1...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter to hangup call 2...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_call_join_conference_call_hangup_conf_call(
+ self, pri_dut, sec_dut, ter_dut):
+ self.log.info(
+ "Test 2 incomming calls scenario to phone then join the calls, then terminate the call from the primary dut."
+ )
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to join active calls...")
+ calls = pri_dut.droid.telecomCallGetCallIds()
+ pri_dut.droid.telecomCallJoinCallsInConf(calls[0], calls[1])
+ time.sleep(WAIT_TIME_IN_CALL)
+ if num_active_calls(self.log, pri_dut) != 4:
+ self.log.error("Total number of call ids in {} is not 4.".format(
+ pri_dut.serial))
+ return False
+ input("Press enter to hangup conf call...")
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def outgoing_multi_call_join_conference_call(self, pri_dut, sec_dut,
+ ter_dut):
+ self.log.info(
+ "Test 2 outgoing calls scenario from phone then join the calls.")
+ input("Press enter to execute this testcase...")
+ outgoing_num = get_phone_number(self.log, sec_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, sec_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ time.sleep(self.short_timeout)
+ outgoing_num = get_phone_number(self.log, ter_dut)
+ if not initiate_call(self.log, pri_dut, outgoing_num):
+ self.log.error("Failed to initiate call")
+ return False
+ if not wait_and_answer_call(self.log, ter_dut):
+ self.log.error("Failed to answer call.")
+ return False
+ input("Press enter to join active calls...")
+ calls = pri_dut.droid.telecomCallGetCallIds()
+ pri_dut.droid.telecomCallJoinCallsInConf(calls[0], calls[1])
+ time.sleep(WAIT_TIME_IN_CALL)
+ if num_active_calls(self.log, pri_dut) != 4:
+ self.log.error("Total number of call ids in {} is not 4.".format(
+ pri_dut.serial))
+ return False
+ input("Press enter to hangup call 1...")
+ if not hangup_call(self.log, sec_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ input("Press enter to hangup call 2...")
+ if not hangup_call(self.log, ter_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def multi_call_join_conference_call_audio_routes(self, pri_dut, sec_dut,
+ ter_dut):
+ self.log.info(
+ "Test 2 incomming calls scenario to phone then join the calls, then test different audio routes."
+ )
+ input("Press enter to execute this testcase...")
+ if not self.setup_multi_call(sec_dut, ter_dut, pri_dut):
+ return False
+ input("Press enter to join active calls...")
+ calls = pri_dut.droid.telecomCallGetCallIds()
+ pri_dut.droid.telecomCallJoinCallsInConf(calls[0], calls[1])
+ time.sleep(WAIT_TIME_IN_CALL)
+ if num_active_calls(self.log, pri_dut) != 4:
+ self.log.error("Total number of call ids in {} is not 4.".format(
+ pri_dut.serial))
+ return False
+ input("Press enter to switch to phone speaker...")
+ self.log.info("Switching to earpiece.")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_EARPIECE)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_EARPIECE:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_EARPIECE))
+ return False
+ input("Press enter to switch to Bluetooth...")
+ self.log.info("Switching to Bluetooth...")
+ set_audio_route(self.log, pri_dut, AUDIO_ROUTE_BLUETOOTH)
+ time.sleep(self.short_timeout)
+ if get_audio_route(self.log, pri_dut) != AUDIO_ROUTE_BLUETOOTH:
+ self.log.error(
+ "Audio Route not set to {}".format(AUDIO_ROUTE_BLUETOOTH))
+ return False
+ input("Press enter to hangup conf call...")
+ if not hangup_call(self.log, pri_dut):
+ self.log.error("Failed to hangup call")
+ return False
+ return True
+
+ def avrcp_play_pause(self, pri_dut):
+ play_pause_count = 5
+ self.log.info(
+ "Test AVRCP play/pause {} times.".format(play_pause_count))
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ input(
+ "Press enter to execute this testcase when music is in the play state..."
+ )
+ for i in range(play_pause_count):
+ input("Execute iteration {}?".format(i + 1))
+ pri_dut.adb.shell(KEYCODE_EVENT_PLAY_PAUSE)
+ self.log.info("Test should end in a paused state.")
+ return True
+
+ def avrcp_next_previous_song(self, pri_dut):
+ self.log.info("Test AVRCP go to the next song then the previous song.")
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ input(
+ "Press enter to execute this testcase when music is in the play state..."
+ )
+ self.log.info("Hitting Next input event...")
+ pri_dut.adb.shell(KEYCODE_EVENT_NEXT)
+ input("Press enter to go to the previous song")
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ self.log.info("Test should end on original song.")
+ return True
+
+ def avrcp_next_previous(self, pri_dut):
+ self.log.info(
+ "Test AVRCP go to the next song then the press previous after a few seconds."
+ )
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ input(
+ "Press enter to execute this testcase when music is in the play state..."
+ )
+ self.log.info("Hitting Next input event...")
+ pri_dut.adb.shell(KEYCODE_EVENT_NEXT)
+ time.sleep(5)
+ self.log.info("Hitting Previous input event...")
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ self.log.info("Test should end on \"next\" song.")
+ return True
+
+ def avrcp_next_repetative(self, pri_dut):
+ iterations = 10
+ self.log.info("Test AVRCP go to the next {} times".format(iterations))
+ pri_dut.adb.shell(KEYCODE_EVENT_PREVIOUS)
+ input(
+ "Press enter to execute this testcase when music is in the play state..."
+ )
+ for i in range(iterations):
+ self.log.info(
+ "Hitting Next input event, iteration {}...".format(i + 1))
+ pri_dut.adb.shell(KEYCODE_EVENT_NEXT)
+ # Allow time for the carkit to update.
+ time.sleep(1)
+ return True
+
+ def _cycle_aboslute_volume_control_helper(self, volume_step,
+ android_volume_steps, pri_dut):
+ begin_time = get_current_epoch_time()
+ pri_dut.droid.setMediaVolume(volume_step)
+ percentage_to_set = int((volume_step / android_volume_steps) * 100)
+ self.log.info("Setting phone volume to {}%".format(percentage_to_set))
+ volume_info_logcat = pri_dut.search_logcat(
+ logcat_strings['media_playback_vol_changed'], begin_time)
+ if len(volume_info_logcat) > 1:
+ self.log.info("Instant response detected.")
+ carkit_response = volume_info_logcat[-1]['log_message'].split(',')
+ for item in carkit_response:
+ if " volume=" in item:
+ carkit_vol_response = int((
+ int(item.split("=")[-1]) / android_volume_steps) * 100)
+ self.log.info(
+ "Carkit set volume to {}%".format(carkit_vol_response))
+ result = input(
+ "Did volume change reflect properly on carkit and phone? (Y/n) "
+ ).lower()
+
+ def cycle_absolute_volume_control(self, pri_dut):
+ result = input(
+ "Does carkit support Absolute Volume Control? (Y/n) ").lower()
+ if result is "n":
+ return True
+ android_volume_steps = 25
+ for i in range(android_volume_steps):
+ self._cycle_aboslute_volume_control_helper(i, android_volume_steps,
+ pri_dut)
+ for i in reversed(range(android_volume_steps)):
+ self._cycle_aboslute_volume_control_helper(i, android_volume_steps,
+ pri_dut)
+ return True
+
+ def cycle_battery_level(self, pri_dut):
+ for i in range(11):
+ level = i * 10
+ pri_dut.shell.set_battery_level(level)
+ question = "Phone battery level {}. Has the carkit indicator " \
+ "changed? (Y/n) "
+ result = input(question.format(level)).lower()
+
+ def test_voice_recognition_from_phone(self, pri_dut):
+ result = input(
+ "Does carkit support voice recognition (BVRA)? (Y/n) ").lower()
+ if result is "n":
+ return True
+ input("Press enter to start voice recognition from phone.")
+ self.pri_dut.droid.bluetoothHspStartVoiceRecognition(
+ self.target_mac_address)
+ input("Press enter to stop voice recognition from phone.")
+ self.pri_dut.droid.bluetoothHspStopVoiceRecognition(
+ self.target_mac_address)
+
+ def test_audio_and_voice_recognition_from_phone(self, pri_dut):
+ result = input(
+ "Does carkit support voice recognition (BVRA)? (Y/n) ").lower()
+ if result is "n":
+ return True
+ # Start playing music here
+ input("Press enter to start voice recognition from phone.")
+ self.pri_dut.droid.bluetoothHspStartVoiceRecognition(
+ self.target_mac_address)
+ input("Press enter to stop voice recognition from phone.")
+ self.pri_dut.droid.bluetoothHspStopVoiceRecognition(
+ self.target_mac_address)
+ time.sleep(2)
+ result = input("Did carkit continue music playback after? (Y/n) ")
diff --git a/acts/framework/acts/test_utils/bt/bt_coc_test_utils.py b/acts/framework/acts/test_utils/bt/bt_coc_test_utils.py
index f7d48673f3..306291f1c3 100644
--- a/acts/framework/acts/test_utils/bt/bt_coc_test_utils.py
+++ b/acts/framework/acts/test_utils/bt/bt_coc_test_utils.py
@@ -162,7 +162,7 @@ def orchestrate_coc_connection(
client_ad.log.info(
"Orchestrate_coc_connection: Start BLE advertisement and"
"scanning. Secured Connection={}".format(secured_conn))
- mac_address, adv_callback = (
+ mac_address, adv_callback, scan_callback = (
get_mac_address_of_generic_advertisement(client_ad, server_ad))
except BtTestUtilsError as err:
raise BtCoCTestUtilsError(
@@ -187,6 +187,7 @@ def orchestrate_coc_connection(
False,
transport=gatt_transport['le'],
opportunistic=False)
+ client_ad.droid.bleStopBleScan(scan_callback)
except GattTestUtilsError as err:
client_ad.log.error(err)
if (adv_callback != None):
diff --git a/acts/framework/acts/test_utils/bt/bt_constants.py b/acts/framework/acts/test_utils/bt/bt_constants.py
index 20f68dd634..f093a1f68c 100644
--- a/acts/framework/acts/test_utils/bt/bt_constants.py
+++ b/acts/framework/acts/test_utils/bt/bt_constants.py
@@ -589,3 +589,10 @@ fpga_linein_bus_endpoint = 'Chameleon FPGA line-in'
headphone_bus_endpoint = 'Cros device headphone'
### Chameleon Constants End ###
+
+### Begin logcat strings dict"""
+logcat_strings = {
+ "media_playback_vol_changed": "onRouteVolumeChanged",
+}
+
+### End logcat strings dict"""
diff --git a/acts/framework/acts/test_utils/bt/bt_gatt_utils.py b/acts/framework/acts/test_utils/bt/bt_gatt_utils.py
index f3fb6bcd43..e3d410e87a 100644
--- a/acts/framework/acts/test_utils/bt/bt_gatt_utils.py
+++ b/acts/framework/acts/test_utils/bt/bt_gatt_utils.py
@@ -106,7 +106,7 @@ def orchestrate_gatt_connection(cen_ad,
if mac_address is None:
if transport == gatt_transport['le']:
try:
- mac_address, adv_callback = (
+ mac_address, adv_callback, scan_callback = (
get_mac_address_of_generic_advertisement(cen_ad, per_ad))
except BtTestUtilsError as err:
raise GattTestUtilsError(
diff --git a/acts/framework/acts/test_utils/bt/bt_test_utils.py b/acts/framework/acts/test_utils/bt/bt_test_utils.py
index 5ddc9a3a7a..9a930ab898 100644
--- a/acts/framework/acts/test_utils/bt/bt_test_utils.py
+++ b/acts/framework/acts/test_utils/bt/bt_test_utils.py
@@ -66,6 +66,7 @@ from acts.test_utils.bt.bt_constants import small_timeout
from acts.test_utils.bt.bt_constants import scan_result
from acts.test_utils.bt.bt_constants import scan_failed
from acts.test_utils.bt.bt_constants import hid_id_keyboard
+
from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
from acts.test_utils.tel.tel_test_utils import verify_http_connection
from acts.utils import exe_cmd
@@ -573,8 +574,7 @@ def get_mac_address_of_generic_advertisement(scan_ad, adv_ad):
raise BtTestUtilsError(
"Scanner did not find advertisement {}".format(err))
mac_address = event['data']['Result']['deviceInfo']['address']
- scan_ad.droid.bleStopBleScan(scan_callback)
- return mac_address, advertise_callback
+ return mac_address, advertise_callback, scan_callback
def enable_bluetooth(droid, ed):
if droid.bluetoothCheckState() is True:
diff --git a/acts/framework/acts/test_utils/bt/bta_lib.py b/acts/framework/acts/test_utils/bt/bta_lib.py
index 723dfdbece..661a7e800b 100644
--- a/acts/framework/acts/test_utils/bt/bta_lib.py
+++ b/acts/framework/acts/test_utils/bt/bta_lib.py
@@ -24,11 +24,14 @@ import pprint
class BtaLib():
- def __init__(self, log, mac_addr, dut):
+ def __init__(self, log, dut, target_mac_address=None):
self.advertisement_list = []
self.dut = dut
self.log = log
- self.mac_addr = mac_addr
+ self.target_mac_addr = target_mac_address
+
+ def set_target_mac_addr(self, mac_addr):
+ self.target_mac_addr = mac_addr
def set_scan_mode(self, scan_mode):
"""Set the Scan mode of the Bluetooth Adapter"""
@@ -48,7 +51,7 @@ class BtaLib():
def init_bond(self):
"""Initiate bond to PTS device"""
- self.dut.droid.bluetoothDiscoverAndBond(self.mac_addr)
+ self.dut.droid.bluetoothDiscoverAndBond(self.target_mac_addr)
def start_discovery(self):
"""Start BR/EDR Discovery"""
@@ -67,15 +70,15 @@ class BtaLib():
def bond(self):
"""Bond to PTS device"""
- self.dut.droid.bluetoothBond(self.mac_addr)
+ self.dut.droid.bluetoothBond(self.target_mac_addr)
def disconnect(self):
"""BTA disconnect"""
- self.dut.droid.bluetoothDisconnectConnected(self.mac_addr)
+ self.dut.droid.bluetoothDisconnectConnected(self.target_mac_addr)
def unbond(self):
"""Unbond from PTS device"""
- self.dut.droid.bluetoothUnbond(self.mac_addr)
+ self.dut.droid.bluetoothUnbond(self.target_mac_addr)
def start_pairing_helper(self, line):
"""Start or stop Bluetooth Pairing Helper"""
@@ -96,12 +99,13 @@ class BtaLib():
def fetch_uuids_with_sdp(self):
"""BTA fetch UUIDS with SDP"""
- self.log.info(self.dut.droid.bluetoothFetchUuidsWithSdp(self.mac_addr))
+ self.log.info(
+ self.dut.droid.bluetoothFetchUuidsWithSdp(self.target_mac_addr))
def connect_profiles(self):
"""Connect available profiles"""
- self.dut.droid.bluetoothConnectBonded(self.mac_addr)
+ self.dut.droid.bluetoothConnectBonded(self.target_mac_addr)
def tts_speak(self):
"""Open audio channel by speaking characters"""
- self.dut.droid.ttsSpeak(self.mac_addr)
+ self.dut.droid.ttsSpeak(self.target_mac_addr)
diff --git a/acts/framework/acts/test_utils/bt/gattc_lib.py b/acts/framework/acts/test_utils/bt/gattc_lib.py
index 4dfc076dab..349c9ee208 100644
--- a/acts/framework/acts/test_utils/bt/gattc_lib.py
+++ b/acts/framework/acts/test_utils/bt/gattc_lib.py
@@ -17,13 +17,19 @@
GATT Client Libraries
"""
+from acts.test_utils.bt.bt_constants import default_le_connection_interval_ms
+from acts.test_utils.bt.bt_constants import default_bluetooth_socket_timeout_ms
from acts.test_utils.bt.bt_gatt_utils import disconnect_gatt_connection
from acts.test_utils.bt.bt_gatt_utils import setup_gatt_connection
from acts.test_utils.bt.bt_gatt_utils import setup_gatt_mtu
+from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts.test_utils.bt.bt_constants import gatt_cb_strings
from acts.test_utils.bt.bt_constants import gatt_char_desc_uuids
from acts.test_utils.bt.bt_constants import gatt_descriptor
from acts.test_utils.bt.bt_constants import gatt_transport
+from acts.test_utils.bt.bt_constants import le_default_supervision_timeout
+from acts.test_utils.bt.bt_constants import le_connection_interval_time_step_ms
+from acts.test_utils.bt.bt_constants import scan_result
from acts.test_utils.bt.bt_gatt_utils import log_gatt_server_uuids
import time
@@ -31,20 +37,47 @@ import os
class GattClientLib():
- def __init__(self, log, mac_addr, dut):
+ def __init__(self, log, dut, target_mac_addr=None):
self.dut = dut
self.log = log
- self.mac_addr = mac_addr
self.gatt_callback = None
self.bluetooth_gatt = None
self.discovered_services_index = None
+ self.target_mac_addr = target_mac_addr
self.generic_uuid = "0000{}-0000-1000-8000-00805f9b34fb"
+ def set_target_mac_addr(self, mac_addr):
+ self.target_mac_addr = mac_addr
+
+ def connect_over_le_based_off_name(self, autoconnect, name):
+ """Perform GATT connection over LE"""
+ self.dut.droid.bleSetScanSettingsScanMode(
+ ble_scan_settings_modes['low_latency'])
+ filter_list = self.dut.droid.bleGenFilterList()
+ scan_settings = self.dut.droid.bleBuildScanSetting()
+ scan_callback = self.dut.droid.bleGenScanCallback()
+ event_name = scan_result.format(scan_callback)
+ self.dut.droid.bleSetScanFilterDeviceName("BLE Rect")
+ self.dut.droid.bleBuildScanFilter(filter_list)
+ self.dut.droid.bleStartBleScan(filter_list, scan_settings,
+ scan_callback)
+
+ try:
+ event = self.dut.ed.pop_event(event_name, 10)
+ self.log.info("Found scan result: {}".format(event))
+ except Exception:
+ self.log.info("Didn't find any scan results.")
+ mac_addr = event['data']['Result']['deviceInfo']['address']
+ self.bluetooth_gatt, self.gatt_callback = setup_gatt_connection(
+ self.dut, mac_addr, autoconnect, transport=gatt_transport['le'])
+ self.dut.droid.bleStopBleScan(scan_callback)
+ self.discovered_services_index = None
+
def connect_over_le(self, autoconnect):
"""Perform GATT connection over LE"""
self.bluetooth_gatt, self.gatt_callback = setup_gatt_connection(
self.dut,
- self.mac_addr,
+ self.target_mac_addr,
autoconnect,
transport=gatt_transport['le'])
self.discovered_services_index = None
@@ -52,10 +85,14 @@ class GattClientLib():
def connect_over_bredr(self):
"""Perform GATT connection over BREDR"""
self.bluetooth_gatt, self.gatt_callback = setup_gatt_connection(
- self.dut, self.mac_addr, False, transport=gatt_transport['bredr'])
+ self.dut,
+ self.target_mac_addr,
+ False,
+ transport=gatt_transport['bredr'])
def disconnect(self):
"""Perform GATT disconnect"""
+ cmd = "Disconnect GATT connection"
try:
disconnect_gatt_connection(self.dut, self.bluetooth_gatt,
self.gatt_callback)
@@ -296,15 +333,6 @@ class GattClientLib():
self._setup_discovered_services_index()
services_count = self.dut.droid.gattClientGetDiscoveredServicesCount(
self.discovered_services_index)
- """
- self.log.info(
- CMD_LOG.format(
- cmd,
- self.dut.droid.gattClientWriteDescriptorByInstanceId(
- self.bluetooth_gatt, self.discovered_services_index,
- int(instance_id, 16),
- gatt_descriptor['enable_notification_value'])))
- """
for i in range(services_count):
characteristic_uuids = (
self.dut.droid.gattClientGetDiscoveredCharacteristicUuids(
@@ -332,6 +360,39 @@ class GattClientLib():
self.bluetooth_gatt,
self.discovered_services_index, i, j, True)
+ def enable_indication_desc_by_instance_id(self, line):
+ """GATT Client Enable indication on Descriptor by instance ID"""
+ instance_id = line
+ self._setup_discovered_services_index()
+ services_count = self.dut.droid.gattClientGetDiscoveredServicesCount(
+ self.discovered_services_index)
+ for i in range(services_count):
+ characteristic_uuids = (
+ self.dut.droid.gattClientGetDiscoveredCharacteristicUuids(
+ self.discovered_services_index, i))
+ for j in range(len(characteristic_uuids)):
+ descriptor_uuids = (
+ self.dut.droid.
+ gattClientGetDiscoveredDescriptorUuidsByIndex(
+ self.discovered_services_index, i, j))
+ for k in range(len(descriptor_uuids)):
+ desc_inst_id = self.dut.droid.gattClientGetDescriptorInstanceId(
+ self.bluetooth_gatt, self.discovered_services_index, i,
+ j, k)
+ if desc_inst_id == int(instance_id, 16):
+ self.dut.droid.gattClientDescriptorSetValueByIndex(
+ self.bluetooth_gatt,
+ self.discovered_services_index, i, j, k,
+ gatt_descriptor['enable_indication_value'])
+ time.sleep(2) #Necessary for PTS
+ self.dut.droid.gattClientWriteDescriptorByIndex(
+ self.bluetooth_gatt,
+ self.discovered_services_index, i, j, k)
+ time.sleep(2) #Necessary for PTS
+ self.dut.droid.gattClientSetCharacteristicNotificationByIndex(
+ self.bluetooth_gatt,
+ self.discovered_services_index, i, j, True)
+
def char_enable_all_notifications(self):
self._setup_discovered_services_index()
services_count = self.dut.droid.gattClientGetDiscoveredServicesCount(
@@ -486,3 +547,30 @@ class GattClientLib():
uuid = self.generic_uuid.format(line)
self.dut.droid.gattClientDiscoverServiceByUuid(self.bluetooth_gatt,
uuid)
+
+ def request_le_connection_parameters(self):
+ le_min_ce_len = 0
+ le_max_ce_len = 0
+ le_connection_interval = 0
+ minInterval = default_le_connection_interval_ms / le_connection_interval_time_step_ms
+ maxInterval = default_le_connection_interval_ms / le_connection_interval_time_step_ms
+ return_status = self.dut.droid.gattClientRequestLeConnectionParameters(
+ self.bluetooth_gatt, minInterval, maxInterval, 0,
+ le_default_supervision_timeout, le_min_ce_len, le_max_ce_len)
+ self.log.info(
+ "Result of request le connection param: {}".format(return_status))
+
+ def socket_conn_begin_connect_thread_psm(self, line):
+ args = line.split()
+ is_ble = bool(int(args[0]))
+ secured_conn = bool(int(args[1]))
+ psm_value = int(args[2]) # 1
+ self.dut.droid.bluetoothSocketConnBeginConnectThreadPsm(
+ self.target_mac_addr, is_ble, psm_value, secured_conn)
+
+ def socket_conn_begin_accept_thread_psm(self, line):
+ accept_timeout_ms = default_bluetooth_socket_timeout_ms
+ is_ble = True
+ secured_conn = False
+ self.dut.droid.bluetoothSocketConnBeginAcceptThreadPsm(
+ accept_timeout_ms, is_ble, secured_conn)
diff --git a/acts/framework/acts/test_utils/bt/gatts_lib.py b/acts/framework/acts/test_utils/bt/gatts_lib.py
index 7916a924c1..cbffb1806c 100644
--- a/acts/framework/acts/test_utils/bt/gatts_lib.py
+++ b/acts/framework/acts/test_utils/bt/gatts_lib.py
@@ -117,12 +117,15 @@ class GattServerLib():
self.gatt_server_callback)
char_read = gatt_event['char_read_req']['evt'].format(
self.gatt_server_callback)
+ char_write_req = gatt_event['char_write_req']['evt'].format(
+ self.gatt_server_callback)
char_write = gatt_event['char_write']['evt'].format(
self.gatt_server_callback)
execute_write = gatt_event['exec_write']['evt'].format(
self.gatt_server_callback)
- regex = "({}|{}|{}|{}|{})".format(desc_read, desc_write, char_read,
- char_write, execute_write)
+ regex = "({}|{}|{}|{}|{}|{})".format(desc_read, desc_write, char_read,
+ char_write, execute_write,
+ char_write_req)
events = self.dut.ed.pop_events(regex, 5, small_timeout)
status = 0
if user_input:
@@ -147,7 +150,8 @@ class GattServerLib():
continue
offset = event['data']['offset']
instance_id = event['data']['instanceId']
- if (event['name'] == desc_write or event['name'] == char_write):
+ if (event['name'] == desc_write or event['name'] == char_write
+ or event['name'] == char_write_req):
if ('preparedWrite' in event['data']
and event['data']['preparedWrite'] == True):
value = event['data']['value']
diff --git a/acts/framework/acts/test_utils/bt/rfcomm_lib.py b/acts/framework/acts/test_utils/bt/rfcomm_lib.py
index 49b35b69cb..ee1fd042ba 100644
--- a/acts/framework/acts/test_utils/bt/rfcomm_lib.py
+++ b/acts/framework/acts/test_utils/bt/rfcomm_lib.py
@@ -24,11 +24,14 @@ import pprint
class RfcommLib():
- def __init__(self, log, mac_addr, dut):
+ def __init__(self, log, dut, target_mac_addr=None):
self.advertisement_list = []
self.dut = dut
self.log = log
- self.mac_addr = mac_addr
+ self.target_mac_addr = target_mac_addr
+
+ def set_target_mac_addr(self, mac_addr):
+ self.target_mac_addr = mac_addr
def connect(self, line):
"""Perform an RFCOMM connect"""
@@ -37,17 +40,18 @@ class RfcommLib():
uuid = line
if uuid:
self.dut.droid.bluetoothRfcommBeginConnectThread(
- self.mac_addr, uuid)
+ self.target_mac_addr, uuid)
else:
- self.dut.droid.bluetoothRfcommBeginConnectThread(self.mac_addr)
+ self.dut.droid.bluetoothRfcommBeginConnectThread(
+ self.target_mac_addr)
def open_rfcomm_socket(self):
"""Open rfcomm socket"""
- self.dut.droid.rfcommCreateRfcommSocket(self.mac_addr, 1)
+ self.dut.droid.rfcommCreateRfcommSocket(self.target_mac_addr, 1)
def open_l2cap_socket(self):
"""Open L2CAP socket"""
- self.dut.droid.rfcommCreateL2capSocket(self.mac_addr, 1)
+ self.dut.droid.rfcommCreateL2capSocket(self.target_mac_addr, 1)
def write(self, line):
"""Write String data over an RFCOMM connection"""
@@ -78,4 +82,4 @@ class RfcommLib():
def open_l2cap_socket(self):
"""Open L2CAP socket"""
- self.dut.droid.rfcommCreateL2capSocket(self.mac_addr, 1)
+ self.dut.droid.rfcommCreateL2capSocket(self.target_mac_addr, 1)
diff --git a/acts/framework/acts/test_utils/bt/shell_commands_lib.py b/acts/framework/acts/test_utils/bt/shell_commands_lib.py
new file mode 100644
index 0000000000..f44e123d46
--- /dev/null
+++ b/acts/framework/acts/test_utils/bt/shell_commands_lib.py
@@ -0,0 +1,44 @@
+#/usr/bin/env python3.4
+#
+# 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.
+"""
+Shell command library.
+"""
+
+
+class ShellCommands():
+ def __init__(self, log, dut):
+ self.dut = dut
+ self.log = log
+
+ def set_battery_level(self, level):
+ """Set the battery level via ADB shell
+ Args:
+ level: the percent level to set
+ """
+ self.dut.adb.shell("dumpsys battery set level {}".format(level))
+
+ def disable_ble_scanning(self):
+ """Disable BLE scanning via ADB shell"""
+ self.dut.adb.shell("settings put global ble_scan_always_enabled 0")
+
+ def enable_ble_scanning(self):
+ """Enable BLE scanning via ADB shell"""
+ self.dut.adb.shell("settings put global ble_scan_always_enabled 1")
+
+ def consume_cpu_core(self):
+ """Consume a CPU core on the Android device via ADB shell"""
+ self.dut.adb.shell("echo $$ > /dev/cpuset/top-app/tasks")
+ self.dut.adb.shell("cat /dev/urandom > /dev/null &")
diff --git a/acts/tests/google/ble/gatt/GattConnectTest.py b/acts/tests/google/ble/gatt/GattConnectTest.py
index 07c8e1bb3d..0b160a23cf 100644
--- a/acts/tests/google/ble/gatt/GattConnectTest.py
+++ b/acts/tests/google/ble/gatt/GattConnectTest.py
@@ -103,8 +103,8 @@ class GattConnectTest(BluetoothBaseTest):
event = self.per_ad.ed.pop_event(expected_event,
self.default_timeout)
except Empty:
- self.log.error(gatt_cb_strings['serv_added_err'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_strings['serv_added_err'].format(expected_event))
return False
if event['data']['serviceUuid'].lower() != uuid.lower():
self.log.error("Uuid mismatch. Found: {}, Expected {}.".format(
@@ -124,8 +124,8 @@ class GattConnectTest(BluetoothBaseTest):
mtu_size_found, expected_mtu))
return False
except Empty:
- self.log.error(gatt_cb_err['mtu_changed_err'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['mtu_changed_err'].format(expected_event))
return False
expected_event = gatt_cb_strings['mtu_serv_changed'].format(
@@ -139,8 +139,8 @@ class GattConnectTest(BluetoothBaseTest):
mtu_size_found, expected_mtu))
return False
except Empty:
- self.log.error(gatt_cb_err['mtu_serv_changed_err'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['mtu_serv_changed_err'].format(expected_event))
return False
return True
@@ -228,9 +228,9 @@ class GattConnectTest(BluetoothBaseTest):
return False
self.per_ad.droid.bleStopBleAdvertising(adv_callback)
try:
- event = self.cen_ad.ed.pop_event(gatt_cb_strings[
- 'gatt_conn_change'].format(gatt_callback,
- self.default_timeout))
+ event = self.cen_ad.ed.pop_event(
+ gatt_cb_strings['gatt_conn_change'].format(
+ gatt_callback, self.default_timeout))
self.log.error(
"Connection event found when not expected: {}".format(event))
return False
@@ -277,11 +277,12 @@ class GattConnectTest(BluetoothBaseTest):
gatt_server_cb)
self.gatt_server_list.append(gatt_server)
autoconnect = False
- mac_address, adv_callback = (
+ mac_address, adv_callback, scan_callback = (
get_mac_address_of_generic_advertisement(self.cen_ad, self.per_ad))
try:
bluetooth_gatt, gatt_callback = setup_gatt_connection(
self.cen_ad, mac_address, autoconnect)
+ self.cen_ad.droid.bleStopBleScan(scan_callback)
self.bluetooth_gatt_list.append(bluetooth_gatt)
except GattTestUtilsError as err:
self.log.error(err)
@@ -306,8 +307,8 @@ class GattConnectTest(BluetoothBaseTest):
event = self.cen_ad.ed.pop_event(expected_event,
self.default_timeout)
except Empty:
- self.log.error(gatt_cb_err['gatt_conn_change_err'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_conn_change_err'].format(expected_event))
test_result = False
return self._orchestrate_gatt_disconnection(bluetooth_gatt,
gatt_callback)
@@ -345,7 +346,7 @@ class GattConnectTest(BluetoothBaseTest):
gatt_server = self.per_ad.droid.gattServerOpenGattServer(
gatt_server_cb)
self.gatt_server_list.append(gatt_server)
- mac_address, adv_callback = (
+ mac_address, adv_callback, scan_callback = (
get_mac_address_of_generic_advertisement(self.cen_ad, self.per_ad))
# Make GATT connection 1
try:
@@ -355,6 +356,7 @@ class GattConnectTest(BluetoothBaseTest):
False,
transport=gatt_transport['auto'],
opportunistic=False)
+ self.cen_ad.droid.bleStopBleScan(scan_callback)
self.bluetooth_gatt_list.append(bluetooth_gatt_1)
except GattTestUtilsError as err:
self.log.error(err)
@@ -585,8 +587,8 @@ class GattConnectTest(BluetoothBaseTest):
try:
self.cen_ad.ed.pop_event(expected_event, self.default_timeout)
except Empty:
- self.log.error(gatt_cb_err['rd_remote_rssi_err'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['rd_remote_rssi_err'].format(expected_event))
return self._orchestrate_gatt_disconnection(bluetooth_gatt,
gatt_callback)
@@ -637,8 +639,8 @@ class GattConnectTest(BluetoothBaseTest):
event = self.cen_ad.ed.pop_event(expected_event,
self.default_timeout)
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
return self._orchestrate_gatt_disconnection(bluetooth_gatt,
gatt_callback)
@@ -697,8 +699,8 @@ class GattConnectTest(BluetoothBaseTest):
self.default_timeout)
discovered_services_index = event['data']['ServicesIndex']
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
log_gatt_server_uuids(self.cen_ad, discovered_services_index)
return self._orchestrate_gatt_disconnection(bluetooth_gatt,
@@ -754,8 +756,8 @@ class GattConnectTest(BluetoothBaseTest):
event = self.cen_ad.ed.pop_event(expected_event,
self.default_timeout)
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
discovered_services_index = event['data']['ServicesIndex']
log_gatt_server_uuids(self.cen_ad, discovered_services_index)
@@ -795,7 +797,7 @@ class GattConnectTest(BluetoothBaseTest):
gatt_server = self.per_ad.droid.gattServerOpenGattServer(
gatt_server_cb)
self.gatt_server_list.append(gatt_server)
- mac_address, adv_callback = get_mac_address_of_generic_advertisement(
+ mac_address, adv_callback, scan_callback = get_mac_address_of_generic_advertisement(
self.cen_ad, self.per_ad)
autoconnect = False
for i in range(1000):
@@ -803,11 +805,12 @@ class GattConnectTest(BluetoothBaseTest):
try:
bluetooth_gatt, gatt_callback = setup_gatt_connection(
self.cen_ad, mac_address, autoconnect)
+ self.cen_ad.droid.bleStopBleScan(scan_callback)
except GattTestUtilsError as err:
self.log.error(err)
return False
- test_result = self._orchestrate_gatt_disconnection(bluetooth_gatt,
- gatt_callback)
+ test_result = self._orchestrate_gatt_disconnection(
+ bluetooth_gatt, gatt_callback)
if not test_result:
self.log.info("Failed to disconnect from peripheral device.")
return False
@@ -867,8 +870,8 @@ class GattConnectTest(BluetoothBaseTest):
gatt_characteristic['permission_write_encrypted_mitm'])
gatt_service = self.per_ad.droid.gattServerCreateService(
service_uuid, gatt_service_types['primary'])
- self.per_ad.droid.gattServerAddCharacteristicToService(gatt_service,
- characteristic)
+ self.per_ad.droid.gattServerAddCharacteristicToService(
+ gatt_service, characteristic)
self.per_ad.droid.gattServerAddService(gatt_server, gatt_service)
result = self._find_service_added_event(gatt_server_cb, service_uuid)
if not result:
@@ -884,8 +887,8 @@ class GattConnectTest(BluetoothBaseTest):
event = self.cen_ad.ed.pop_event(expected_event,
self.default_timeout)
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
discovered_services_index = event['data']['ServicesIndex']
else:
@@ -914,8 +917,8 @@ class GattConnectTest(BluetoothBaseTest):
bonded_devices = \
self.cen_ad.droid.bluetoothGetBondedDevices()
for device in bonded_devices:
- if ('name' in device.keys() and
- device['name'] == target_name):
+ if ('name' in device.keys()
+ and device['name'] == target_name):
bonded = True
break
bonded = False
@@ -924,8 +927,8 @@ class GattConnectTest(BluetoothBaseTest):
bonded_devices = \
self.per_ad.droid.bluetoothGetBondedDevices()
for device in bonded_devices:
- if ('name' in device.keys() and
- device['name'] == target_name):
+ if ('name' in device.keys()
+ and device['name'] == target_name):
bonded = True
break
for ad in [self.cen_ad, self.per_ad]:
@@ -935,8 +938,8 @@ class GattConnectTest(BluetoothBaseTest):
time.sleep(2)
bonded_devices = ad.droid.bluetoothGetBondedDevices()
if len(bonded_devices) > 0:
- self.log.error("Failed to unbond devices: {}".format(
- bonded_devices))
+ self.log.error(
+ "Failed to unbond devices: {}".format(bonded_devices))
return False
return self._orchestrate_gatt_disconnection(bluetooth_gatt,
gatt_callback)
@@ -1064,8 +1067,8 @@ class GattConnectTest(BluetoothBaseTest):
self.cen_ad.droid.bleSetScanFilterDeviceName(
self.per_ad.droid.bluetoothGetLocalName())
self.cen_ad.droid.bleBuildScanFilter(filter_list)
- self.cen_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
- 'low_latency'])
+ self.cen_ad.droid.bleSetScanSettingsScanMode(
+ ble_scan_settings_modes['low_latency'])
# Setup necessary scan objects.
scan_settings = self.cen_ad.droid.bleBuildScanSetting()
@@ -1106,8 +1109,8 @@ class GattConnectTest(BluetoothBaseTest):
# Steps 4: Try to connect to the first mac address
gatt_callback = self.cen_ad.droid.gattCreateGattCallback()
- self.log.info("Gatt Connect to mac address {}.".format(
- mac_address_pre_restart))
+ self.log.info(
+ "Gatt Connect to mac address {}.".format(mac_address_pre_restart))
bluetooth_gatt = self.cen_ad.droid.gattClientConnectGatt(
gatt_callback, mac_address_pre_restart, autoconnect, transport,
opportunistic, gatt_phy_mask['1m_mask'])
@@ -1127,8 +1130,8 @@ class GattConnectTest(BluetoothBaseTest):
self.cen_ad.droid.gattClientDisconnect(bluetooth_gatt)
# Step 6: Connect to second mac address.
- self.log.info("Gatt Connect to mac address {}.".format(
- mac_address_post_restart))
+ self.log.info(
+ "Gatt Connect to mac address {}.".format(mac_address_post_restart))
bluetooth_gatt = self.cen_ad.droid.gattClientConnectGatt(
gatt_callback, mac_address_post_restart, autoconnect, transport,
opportunistic, gatt_phy_mask['1m_mask'])
@@ -1149,4 +1152,4 @@ class GattConnectTest(BluetoothBaseTest):
except Empty:
self.log.error("No connection update was found.")
return False
- return self.cen_ad.droid.gattClientDisconnect(bluetooth_gatt) \ No newline at end of file
+ return self.cen_ad.droid.gattClientDisconnect(bluetooth_gatt)
diff --git a/acts/tests/google/ble/gatt/GattToolTest.py b/acts/tests/google/ble/gatt/GattToolTest.py
index d9921b4940..2b0b6193e4 100644
--- a/acts/tests/google/ble/gatt/GattToolTest.py
+++ b/acts/tests/google/ble/gatt/GattToolTest.py
@@ -27,19 +27,19 @@ import pprint
from queue import Empty
import time
-from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
+from acts.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts.test_utils.bt.bt_constants import gatt_cb_err
from acts.test_utils.bt.bt_constants import gatt_cb_strings
from acts.test_utils.bt.bt_constants import gatt_descriptor
from acts.test_utils.bt.bt_constants import gatt_transport
+from acts.test_utils.bt.bt_constants import scan_result
from acts.test_utils.bt.bt_gatt_utils import GattTestUtilsError
from acts.test_utils.bt.bt_gatt_utils import disconnect_gatt_connection
from acts.test_utils.bt.bt_test_utils import generate_ble_scan_objects
from acts.test_utils.bt.bt_gatt_utils import setup_gatt_connection
from acts.test_utils.bt.bt_gatt_utils import log_gatt_server_uuids
from acts.test_utils.bt.bt_test_utils import reset_bluetooth
-from acts.test_utils.bt.bt_constants import scan_result
class GattToolTest(BluetoothBaseTest):
@@ -84,8 +84,8 @@ class GattToolTest(BluetoothBaseTest):
def _is_peripheral_advertising(self):
self.cen_ad.droid.bleSetScanFilterDeviceAddress(self.ble_mac_address)
- self.cen_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
- 'low_latency'])
+ self.cen_ad.droid.bleSetScanSettingsScanMode(
+ ble_scan_settings_modes['low_latency'])
filter_list, scan_settings, scan_callback = generate_ble_scan_objects(
self.cen_ad.droid)
self.cen_ad.droid.bleBuildScanFilter(filter_list)
@@ -96,8 +96,8 @@ class GattToolTest(BluetoothBaseTest):
test_result = True
try:
self.cen_ad.ed.pop_event(expected_event_name, self.DEFAULT_TIMEOUT)
- self.log.info("Peripheral found with event: {}".format(
- expected_event_name))
+ self.log.info(
+ "Peripheral found with event: {}".format(expected_event_name))
except Empty:
self.log.info("Peripheral not advertising or not found: {}".format(
self.ble_mac_address))
@@ -110,8 +110,8 @@ class GattToolTest(BluetoothBaseTest):
time.sleep(2) #Grace timeout for unbonding to finish
bonded_devices = self.cen_ad.droid.bluetoothGetBondedDevices()
if bonded_devices:
- self.log.error("Failed to unbond device... found: {}".format(
- bonded_devices))
+ self.log.error(
+ "Failed to unbond device... found: {}".format(bonded_devices))
return False
return True
@@ -145,9 +145,9 @@ class GattToolTest(BluetoothBaseTest):
self.AUTOCONNECT = False
start_time = self._get_time_in_milliseconds()
try:
- bluetooth_gatt, gatt_callback = (
- setup_gatt_connection(self.cen_ad, self.ble_mac_address,
- self.AUTOCONNECT, gatt_transport['le']))
+ bluetooth_gatt, gatt_callback = (setup_gatt_connection(
+ self.cen_ad, self.ble_mac_address, self.AUTOCONNECT,
+ gatt_transport['le']))
except GattTestUtilsError as err:
self.log.error(err)
return False
@@ -247,9 +247,9 @@ class GattToolTest(BluetoothBaseTest):
Priority: 2
"""
try:
- bluetooth_gatt, gatt_callback = (
- setup_gatt_connection(self.cen_ad, self.ble_mac_address,
- self.AUTOCONNECT, gatt_transport['le']))
+ bluetooth_gatt, gatt_callback = (setup_gatt_connection(
+ self.cen_ad, self.ble_mac_address, self.AUTOCONNECT,
+ gatt_transport['le']))
except GattTestUtilsError as err:
self.log.error(err)
return False
@@ -261,8 +261,8 @@ class GattToolTest(BluetoothBaseTest):
self.DEFAULT_TIMEOUT)
discovered_services_index = event['data']['ServicesIndex']
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
log_gatt_server_uuids(self.cen_ad, discovered_services_index)
try:
@@ -382,9 +382,9 @@ class GattToolTest(BluetoothBaseTest):
if not self._pair_with_peripheral():
return False
try:
- bluetooth_gatt, gatt_callback = (
- setup_gatt_connection(self.cen_ad, self.ble_mac_address,
- self.AUTOCONNECT, gatt_transport['le']))
+ bluetooth_gatt, gatt_callback = (setup_gatt_connection(
+ self.cen_ad, self.ble_mac_address, self.AUTOCONNECT,
+ gatt_transport['le']))
except GattTestUtilsError as err:
self.log.error(err)
return False
@@ -396,8 +396,8 @@ class GattToolTest(BluetoothBaseTest):
self.DEFAULT_TIMEOUT)
discovered_services_index = event['data']['ServicesIndex']
except Empty:
- self.log.error(gatt_cb_err['gatt_serv_disc'].format(
- expected_event))
+ self.log.error(
+ gatt_cb_err['gatt_serv_disc'].format(expected_event))
return False
# TODO: in setup save service_cound and discovered_services_index
# programatically
@@ -431,7 +431,7 @@ class GattToolTest(BluetoothBaseTest):
# set 15 minute notification test time
notification_test_time = 900
end_time = time.time() + notification_test_time
- expected_event = GattCbStrings.CHAR_CHANGE.value.format(gatt_callback)
+ expected_event = gatt_cb_strings['char_change'].format(gatt_callback)
while time.time() < end_time:
try:
event = self.cen_ad.ed.pop_event(expected_event,
@@ -440,6 +440,6 @@ class GattToolTest(BluetoothBaseTest):
except Empty as err:
print(err)
self.log.error(
- GattCbStrings.CHAR_CHANGE_ERR.value.format(expected_event))
+ gatt_cb_err['char_change_err'].format(expected_event))
return False
return True
diff --git a/acts/tests/google/ble/system_tests/BleStressTest.py b/acts/tests/google/ble/system_tests/BleStressTest.py
index a1387ab988..5be082a944 100644
--- a/acts/tests/google/ble/system_tests/BleStressTest.py
+++ b/acts/tests/google/ble/system_tests/BleStressTest.py
@@ -168,7 +168,8 @@ class BleStressTest(BluetoothBaseTest):
self.adv_ad.droid.bleStartBleAdvertising(
advertise_callback, advertise_data, advertise_settings)
expected_advertise_event_name = "".join(
- ["BleAdvertise", str(advertise_callback), "onSuccess"])
+ ["BleAdvertise",
+ str(advertise_callback), "onSuccess"])
worker = self.adv_ad.ed.handle_event(
self.bleadvertise_verify_onsuccess_handler,
expected_advertise_event_name, ([]), self.default_timeout)
@@ -176,7 +177,8 @@ class BleStressTest(BluetoothBaseTest):
self.log.debug(worker.result(self.default_timeout))
except Empty as error:
self.log.debug(" ".join(
- ["Test failed with Empty error:", str(error)]))
+ ["Test failed with Empty error:",
+ str(error)]))
test_result = False
except concurrent.futures._base.TimeoutError as error:
self.log.debug(" ".join([
@@ -219,7 +221,8 @@ class BleStressTest(BluetoothBaseTest):
self.adv_ad.droid.bleStartBleAdvertising(
advertise_callback, advertise_data, advertise_settings)
expected_advertise_event_name = "".join(
- ["BleAdvertise", str(advertise_callback), "onSuccess"])
+ ["BleAdvertise",
+ str(advertise_callback), "onSuccess"])
worker = self.adv_ad.ed.handle_event(
self.bleadvertise_verify_onsuccess_handler,
expected_advertise_event_name, ([]), self.default_timeout)
@@ -227,7 +230,8 @@ class BleStressTest(BluetoothBaseTest):
self.log.debug(worker.result(self.default_timeout))
except Empty as error:
self.log.debug(" ".join(
- ["Test failed with Empty error:", str(error)]))
+ ["Test failed with Empty error:",
+ str(error)]))
test_result = False
except concurrent.futures._base.TimeoutError as error:
self.log.debug(" ".join([
@@ -247,7 +251,8 @@ class BleStressTest(BluetoothBaseTest):
self.log.debug(worker.result(self.default_timeout))
except Empty as error:
self.log.debug(" ".join(
- ["Test failed with Empty error:", str(error)]))
+ ["Test failed with Empty error:",
+ str(error)]))
test_result = False
except concurrent.futures._base.TimeoutError as error:
self.log.debug(" ".join([
@@ -318,7 +323,7 @@ class BleStressTest(BluetoothBaseTest):
iterations = 100
for i in range(iterations):
try:
- target_address, adv_callback = get_mac_address_of_generic_advertisement(
+ target_address, adv_callback, scan_callback = get_mac_address_of_generic_advertisement(
self.scn_ad, self.adv_ad)
except BtTestUtilsError as err:
self.log.error(err)
@@ -339,6 +344,7 @@ class BleStressTest(BluetoothBaseTest):
self.log.error("Failed to unbond device from advertiser.")
return False
self.adv_ad.droid.bleStopBleAdvertising(adv_callback)
+ self.scn_ad.droid.bleStopBleScan(scan_callback)
# Magic sleep to let unbonding finish
time.sleep(2)
return True
diff --git a/acts/tests/google/bt/pts/cmd_input.py b/acts/tests/google/bt/pts/cmd_input.py
index 10d28393c6..7cf7f20017 100644
--- a/acts/tests/google/bt/pts/cmd_input.py
+++ b/acts/tests/google/bt/pts/cmd_input.py
@@ -19,13 +19,9 @@ Python script for wrappers to various libraries.
from acts.test_utils.bt.bt_constants import bt_scan_mode_types
from acts.test_utils.bt.bt_constants import gatt_server_responses
import acts.test_utils.bt.gatt_test_database as gatt_test_database
-from acts.test_utils.bt.ble_lib import BleLib
-from acts.test_utils.bt.bta_lib import BtaLib
-from acts.test_utils.bt.config_lib import ConfigLib
-from acts.test_utils.bt.gattc_lib import GattClientLib
-from acts.test_utils.bt.gatts_lib import GattServerLib
-from acts.test_utils.bt.rfcomm_lib import RfcommLib
+from acts.test_utils.bt.bt_carkit_lib import E2eBtCarkitLib
+import threading
import time
import cmd
"""Various Global Strings"""
@@ -34,8 +30,8 @@ FAILURE = "CMD {} threw exception: {}"
class CmdInput(cmd.Cmd):
+ android_devices = []
"""Simple command processor for Bluetooth PTS Testing"""
- gattc_lib = None
def connect_hsp_helper(self, ad):
"""A helper function for making HSP connections"""
@@ -65,17 +61,16 @@ class CmdInput(cmd.Cmd):
self.pri_dut = android_devices[0]
if len(android_devices) > 1:
self.sec_dut = android_devices[1]
+ if len(android_devices) > 2:
self.ter_dut = android_devices[2]
+ if len(android_devices) > 3:
+ self.qua_dut = android_devices[3]
self.mac_addr = mac_addr
self.log = log
-
- # Initialize libraries
- self.config_lib = ConfigLib(log, self.pri_dut)
- self.bta_lib = BtaLib(log, mac_addr, self.pri_dut)
- self.ble_lib = BleLib(log, mac_addr, self.pri_dut)
- self.gattc_lib = GattClientLib(log, mac_addr, self.pri_dut)
- self.gatts_lib = GattServerLib(log, mac_addr, self.pri_dut)
- self.rfcomm_lib = RfcommLib(log, mac_addr, self.pri_dut)
+ self.pri_dut.bta.set_target_mac_addr(mac_addr)
+ self.pri_dut.gattc.set_target_mac_addr(mac_addr)
+ self.pri_dut.rfcomm.set_target_mac_addr(mac_addr)
+ self.bt_carkit_lib = E2eBtCarkitLib(self.log, mac_addr)
def emptyline(self):
pass
@@ -84,8 +79,38 @@ class CmdInput(cmd.Cmd):
"End Script"
return True
+ def do_reset_mac_address(self, line):
+ """Reset target mac address for libraries based on the current connected device"""
+ try:
+ device = self.pri_dut.droid.bluetoothGetConnectedDevices()[0]
+ #self.setup_vars(self.android_devices, device['address'], self.log)
+ self.log.info("New device is {}".format(device))
+ except Exception as err:
+ self.log.info("Failed to setup new vars with {}".format(err))
+
"""Begin GATT Client wrappers"""
+ def do_gattc_socket_conn_begin_connect_thread_psm(self, line):
+ cmd = ""
+ try:
+ self.pri_dut.gattc.socket_conn_begin_connect_thread_psm(line)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_gattc_socket_conn_begin_accept_thread_psm(self, line):
+ cmd = ""
+ try:
+ self.pri_dut.gattc.socket_conn_begin_accept_thread_psm(line)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_gattc_request_le_connection_parameters(self, line):
+ cmd = ""
+ try:
+ self.pri_dut.gattc.request_le_connection_parameters()
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
def do_gattc_connect_over_le(self, line):
"""Perform GATT connection over LE"""
cmd = "Gatt connect over LE"
@@ -93,7 +118,7 @@ class CmdInput(cmd.Cmd):
autoconnect = False
if line:
autoconnect = bool(line)
- self.gattc_lib.connect_over_le(autoconnect)
+ self.pri_dut.gattc.connect_over_le(autoconnect)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -101,7 +126,7 @@ class CmdInput(cmd.Cmd):
"""Perform GATT connection over BREDR"""
cmd = "Gatt connect over BR/EDR"
try:
- self.gattc_lib.connect_over_bredr()
+ self.pri_dut.gattc.connect_over_bredr()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -109,7 +134,7 @@ class CmdInput(cmd.Cmd):
"""Perform GATT disconnect"""
cmd = "Gatt Disconnect"
try:
- self.gattc_lib.disconnect()
+ self.pri_dut.gattc.disconnect()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -117,7 +142,7 @@ class CmdInput(cmd.Cmd):
"""GATT client read Characteristic by UUID."""
cmd = "GATT client read Characteristic by UUID."
try:
- self.gattc_lib.read_char_by_uuid(line)
+ self.pri_dut.gattc.read_char_by_uuid(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -125,7 +150,7 @@ class CmdInput(cmd.Cmd):
"""Request MTU Change of input value"""
cmd = "Request MTU Value"
try:
- self.gattc_lib.request_mtu(line)
+ self.pri_dut.gattc.request_mtu(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -135,7 +160,7 @@ class CmdInput(cmd.Cmd):
"""
cmd = "Discovery Services and list all UUIDS"
try:
- self.gattc_lib.list_all_uuids()
+ self.pri_dut.gattc.list_all_uuids()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -143,7 +168,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client discover services of GATT Server"""
cmd = "Discovery Services of GATT Server"
try:
- self.gattc_lib.discover_services()
+ self.pri_dut.gattc.discover_services()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -151,7 +176,7 @@ class CmdInput(cmd.Cmd):
"""Perform Gatt Client Refresh"""
cmd = "GATT Client Refresh"
try:
- self.gattc_lib.refresh()
+ self.pri_dut.gattc.refresh()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -161,7 +186,7 @@ class CmdInput(cmd.Cmd):
"""
cmd = "GATT Client Read By Instance ID"
try:
- self.gattc_lib.read_char_by_instance_id(line)
+ self.pri_dut.gattc.read_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -169,7 +194,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Characteristic by instance ID"""
cmd = "GATT Client write to Characteristic by instance ID"
try:
- self.gattc_lib.write_char_by_instance_id(line)
+ self.pri_dut.gattc.write_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -177,7 +202,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Characteristic by instance ID"""
cmd = "GATT Client write to Characteristic by instance ID"
try:
- self.gattc_lib.write_char_by_instance_id_value(line)
+ self.pri_dut.gattc.write_char_by_instance_id_value(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -185,14 +210,14 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Char that doesn't have write permission"""
cmd = "GATT Client Write to Char that doesn't have write permission"
try:
- self.gattc_lib.mod_write_char_by_instance_id(line)
+ self.pri_dut.gattc.mod_write_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_gattc_write_invalid_char_by_instance_id(self, line):
"""GATT Client Write to Char that doesn't exists"""
try:
- self.gattc_lib.write_invalid_char_by_instance_id(line)
+ self.pri_dut.gattc.write_invalid_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -200,7 +225,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Char that doesn't have write permission"""
cmd = "GATT Client Read Char that doesn't have write permission"
try:
- self.gattc_lib.mod_read_char_by_instance_id(line)
+ self.pri_dut.gattc.mod_read_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -208,7 +233,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Char that doesn't exists"""
cmd = "GATT Client Read Char that doesn't exists"
try:
- self.gattc_lib.read_invalid_char_by_instance_id(line)
+ self.pri_dut.gattc.read_invalid_char_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -216,7 +241,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Desc that doesn't have write permission"""
cmd = "GATT Client Write to Desc that doesn't have write permission"
try:
- self.gattc_lib.mod_write_desc_by_instance_id(line)
+ self.pri_dut.gattc.mod_write_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -224,7 +249,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Desc that doesn't exists"""
cmd = "GATT Client Write to Desc that doesn't exists"
try:
- self.gattc_lib.write_invalid_desc_by_instance_id(line)
+ self.pri_dut.gattc.write_invalid_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -232,7 +257,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Desc that doesn't have write permission"""
cmd = "GATT Client Read Desc that doesn't have write permission"
try:
- self.gattc_lib.mod_read_desc_by_instance_id(line)
+ self.pri_dut.gattc.mod_read_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -240,7 +265,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Desc that doesn't exists"""
cmd = "GATT Client Read Desc that doesn't exists"
try:
- self.gattc_lib.read_invalid_desc_by_instance_id(line)
+ self.pri_dut.gattc.read_invalid_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -248,7 +273,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Char that doesn't have write permission"""
cmd = "GATT Client Read Char that doesn't have write permission"
try:
- self.gattc_lib.mod_read_char_by_uuid_and_instance_id(line)
+ self.pri_dut.gattc.mod_read_char_by_uuid_and_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -256,7 +281,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Read Char that doesn't exist"""
cmd = "GATT Client Read Char that doesn't exist"
try:
- self.gattc_lib.read_invalid_char_by_uuid(line)
+ self.pri_dut.gattc.read_invalid_char_by_uuid(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -264,7 +289,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client Write to Descriptor by instance ID"""
cmd = "GATT Client Write to Descriptor by instance ID"
try:
- self.gattc_lib.write_desc_by_instance_id(line)
+ self.pri_dut.gattc.write_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -272,7 +297,15 @@ class CmdInput(cmd.Cmd):
"""GATT Client Enable Notification on Descriptor by instance ID"""
cmd = "GATT Client Enable Notification on Descriptor by instance ID"
try:
- self.gattc_lib.enable_notification_desc_by_instance_id(line)
+ self.pri_dut.gattc.enable_notification_desc_by_instance_id(line)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_gattc_enable_indication_desc_by_instance_id(self, line):
+ """GATT Client Enable Indication on Descriptor by instance ID"""
+ cmd = "GATT Client Enable Indication on Descriptor by instance ID"
+ try:
+ self.pri_dut.gattc.enable_indication_desc_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -280,7 +313,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client enable all notifications"""
cmd = "GATT Client enable all notifications"
try:
- self.gattc_lib.char_enable_all_notifications()
+ self.pri_dut.gattc.char_enable_all_notifications()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -288,7 +321,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client read char by non-existant instance id"""
cmd = "GATT Client read char by non-existant instance id"
try:
- self.gattc_lib.read_char_by_invalid_instance_id(line)
+ self.pri_dut.gattc.read_char_by_invalid_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -296,7 +329,7 @@ class CmdInput(cmd.Cmd):
"""Begin a reliable write on the Bluetooth Gatt Client"""
cmd = "GATT Client Begin Reliable Write"
try:
- self.gattc_lib.begin_reliable_write()
+ self.pri_dut.gattc.begin_reliable_write()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -304,7 +337,7 @@ class CmdInput(cmd.Cmd):
"""Abort a reliable write on the Bluetooth Gatt Client"""
cmd = "GATT Client Abort Reliable Write"
try:
- self.gattc_lib.abort_reliable_write()
+ self.pri_dut.gattc.abort_reliable_write()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -312,7 +345,7 @@ class CmdInput(cmd.Cmd):
"""Execute a reliable write on the Bluetooth Gatt Client"""
cmd = "GATT Client Execute Reliable Write"
try:
- self.gattc_lib.execute_reliable_write()
+ self.pri_dut.gattc.execute_reliable_write()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -320,7 +353,7 @@ class CmdInput(cmd.Cmd):
"""GATT Client read all Characteristic values"""
cmd = "GATT Client read all Characteristic values"
try:
- self.gattc_lib.read_all_char()
+ self.pri_dut.gattc.read_all_char()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -328,7 +361,7 @@ class CmdInput(cmd.Cmd):
"""Write to every Characteristic on the GATT server"""
cmd = "GATT Client Write All Characteristics"
try:
- self.gattc_lib.write_all_char(line)
+ self.pri_dut.gattc.write_all_char(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -336,7 +369,7 @@ class CmdInput(cmd.Cmd):
""" Write to every Descriptor on the GATT server """
cmd = "GATT Client Write All Descriptors"
try:
- self.gattc_lib.write_all_desc(line)
+ self.pri_dut.gattc.write_all_desc(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -344,7 +377,7 @@ class CmdInput(cmd.Cmd):
"""Write 0x00 or 0x02 to notification descriptor [instance_id]"""
cmd = "Write 0x00 0x02 to notification descriptor"
try:
- self.gattc_lib.write_desc_notification_by_instance_id(line)
+ self.pri_dut.gattc.write_desc_notification_by_instance_id(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -352,7 +385,7 @@ class CmdInput(cmd.Cmd):
"""Discover service by uuid"""
cmd = "Discover service by uuid"
try:
- self.gattc_lib.discover_service_by_uuid(line)
+ self.pri_dut.gattc.discover_service_by_uuid(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -360,7 +393,7 @@ class CmdInput(cmd.Cmd):
"""Read all Descriptor values"""
cmd = "Read all Descriptor values"
try:
- self.gattc_lib.read_all_desc()
+ self.pri_dut.gattc.read_all_desc()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -371,7 +404,7 @@ class CmdInput(cmd.Cmd):
"""Close Bluetooth Gatt Servers"""
cmd = "Close Bluetooth Gatt Servers"
try:
- self.gatts_lib.close_bluetooth_gatt_servers()
+ self.pri_dut.gatts.close_bluetooth_gatt_servers()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -424,7 +457,7 @@ class CmdInput(cmd.Cmd):
"""
cmd = "Discovery Services and list all UUIDS"
try:
- self.gatts_lib.list_all_uuids()
+ self.pri_dut.gatts.list_all_uuids()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -432,7 +465,7 @@ class CmdInput(cmd.Cmd):
"""Send a response to the GATT Client"""
cmd = "GATT server send response"
try:
- self.gatts_lib.send_response(line)
+ self.pri_dut.gatts.send_response(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -446,14 +479,15 @@ class CmdInput(cmd.Cmd):
confirm = False
if confirm_str.lower() == 'true':
confirm = True
- self.gatts_lib.notify_characteristic_changed(instance_id, confirm)
+ self.pri_dut.gatts.notify_characteristic_changed(
+ instance_id, confirm)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_gatts_setup_database(self, line):
cmd = "Setup GATT Server database: {}".format(line)
try:
- self.gatts_lib.setup_gatts_db(
+ self.pri_dut.gatts.setup_gatts_db(
gatt_test_database.GATT_SERVER_DB_MAPPING.get(line))
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -468,7 +502,7 @@ class CmdInput(cmd.Cmd):
value = []
for i in range(size):
value.append(i % 256)
- self.gatts_lib.gatt_server_characteristic_set_value_by_instance_id(
+ self.pri_dut.gatts.characteristic_set_value_by_instance_id(
instance_id, value)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -480,7 +514,8 @@ class CmdInput(cmd.Cmd):
info = line.split()
instance_id = info[0]
confirm = bool(info[1])
- self.gatts_lib.notify_characteristic_changed(instance_id, confirm)
+ self.pri_dut.gatts.notify_characteristic_changed(
+ instance_id, confirm)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -488,7 +523,7 @@ class CmdInput(cmd.Cmd):
"""Open a GATT Server instance"""
cmd = "Open an empty GATT Server"
try:
- self.gatts_lib.open()
+ self.pri_dut.gatts.open()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -496,7 +531,7 @@ class CmdInput(cmd.Cmd):
"""Clear BluetoothGattServices from BluetoothGattServer"""
cmd = "Clear BluetoothGattServices from BluetoothGattServer"
try:
- self.gatts_lib.gatt_server_clear_services()
+ self.pri_dut.gatts.gatt_server_clear_services()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -504,7 +539,7 @@ class CmdInput(cmd.Cmd):
"""Send continous response with random data"""
cmd = "Send continous response with random data"
try:
- self.gatts_lib.send_continuous_response(line)
+ self.pri_dut.gatts.send_continuous_response(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -512,7 +547,7 @@ class CmdInput(cmd.Cmd):
"""Send continous response including requested data"""
cmd = "Send continous response including requested data"
try:
- self.gatts_lib.send_continuous_response_data(line)
+ self.pri_dut.gatts.send_continuous_response_data(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -538,7 +573,7 @@ class CmdInput(cmd.Cmd):
return completions
def complete_ble_stop_advertisement(self, text, line, begidx, endidx):
- str_adv_list = list(map(str, self.ble_lib.ADVERTISEMENT_LIST))
+ str_adv_list = list(map(str, self.pri_dut.ble.ADVERTISEMENT_LIST))
if not text:
completions = str_adv_list[:]
else:
@@ -549,21 +584,39 @@ class CmdInput(cmd.Cmd):
"""Start a connectable LE advertisement"""
cmd = "Start a connectable LE advertisement"
try:
- self.ble_lib.start_generic_connectable_advertisement(line)
+ self.pri_dut.ble.start_generic_connectable_advertisement(line)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def _start_max_advertisements(self, ad):
+ self.pri_dut.ble.start_max_advertisements(ad)
+
+ def do_ble_start_generic_connectable_beacon_swarm(self, line):
+ """Start a connectable LE advertisement"""
+ cmd = "Start as many advertisements as possible on all devices"
+ try:
+ threads = []
+ for ad in self.android_devices:
+ thread = threading.Thread(
+ target=self._start_max_advertisements, args=([ad]))
+ threads.append(thread)
+ thread.start()
+ for t in threads:
+ t.join()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_ble_start_connectable_advertisement_set(self, line):
"""Start a connectable advertisement set"""
try:
- self.ble_lib.start_connectable_advertisement_set(line)
+ self.pri_dut.ble.start_connectable_advertisement_set(line)
except Exception as err:
self.log.error("Failed to start advertisement: {}".format(err))
def do_ble_stop_all_advertisement_set(self, line):
"""Stop all advertisement sets"""
try:
- self.ble_lib.stop_all_advertisement_set(line)
+ self.pri_dut.ble.stop_all_advertisement_set(line)
except Exception as err:
self.log.error("Failed to stop advertisement: {}".format(err))
@@ -572,7 +625,7 @@ class CmdInput(cmd.Cmd):
[uuid1 uuid2 ... uuidN]"""
cmd = "Add a valid service UUID to the advertisement."
try:
- self.ble_lib.adv_add_service_uuid_list(line)
+ self.pri_dut.ble.adv_add_service_uuid_list(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -580,7 +633,7 @@ class CmdInput(cmd.Cmd):
"""Include local name in the advertisement. inputs: [true|false]"""
cmd = "Include local name in the advertisement."
try:
- self.ble_lib.adv_data_include_local_name(line)
+ self.pri_dut.ble.adv_data_include_local_name(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -588,7 +641,7 @@ class CmdInput(cmd.Cmd):
"""Include tx power level in the advertisement. inputs: [true|false]"""
cmd = "Include local name in the advertisement."
try:
- self.ble_lib.adv_data_include_tx_power_level(line)
+ self.pri_dut.ble.adv_data_include_tx_power_level(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -597,7 +650,7 @@ class CmdInput(cmd.Cmd):
[id data1 data2 ... dataN]"""
cmd = "Include manufacturer id and data to the advertisment."
try:
- self.ble_lib.adv_data_add_manufacturer_data(line)
+ self.pri_dut.ble.adv_data_add_manufacturer_data(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -605,19 +658,19 @@ class CmdInput(cmd.Cmd):
"""Start a nonconnectable LE advertisement"""
cmd = "Start a nonconnectable LE advertisement"
try:
- self.ble_lib.start_generic_nonconnectable_advertisement(line)
+ self.pri_dut.ble.start_generic_nonconnectable_advertisement(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_ble_list_active_advertisement_ids(self, line):
"""List all active BLE advertisements"""
- self.log.info("IDs: {}".format(self.ble_lib.advertisement_list))
+ self.log.info("IDs: {}".format(self.pri_dut.ble.advertisement_list))
def do_ble_stop_all_advertisements(self, line):
"""Stop all LE advertisements"""
cmd = "Stop all LE advertisements"
try:
- self.ble_lib.stop_all_advertisements(line)
+ self.pri_dut.ble.stop_all_advertisements(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -625,7 +678,7 @@ class CmdInput(cmd.Cmd):
"""Stop an LE advertisement"""
cmd = "Stop a connectable LE advertisement"
try:
- self.ble_lib.ble_stop_advertisement(line)
+ self.pri_dut.ble.ble_stop_advertisement(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -652,7 +705,7 @@ class CmdInput(cmd.Cmd):
"""Set the Scan mode of the Bluetooth Adapter"""
cmd = "Set the Scan mode of the Bluetooth Adapter"
try:
- self.bta_lib.set_scan_mode(line)
+ self.pri_dut.bta.set_scan_mode(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -660,7 +713,7 @@ class CmdInput(cmd.Cmd):
"""Set Bluetooth Adapter Name"""
cmd = "Set Bluetooth Adapter Name"
try:
- self.bta_lib.set_device_name(line)
+ self.pri_dut.bta.set_device_name(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -668,7 +721,7 @@ class CmdInput(cmd.Cmd):
"""Enable Bluetooth Adapter"""
cmd = "Enable Bluetooth Adapter"
try:
- self.bta_lib.enable()
+ self.pri_dut.bta.enable()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -676,7 +729,7 @@ class CmdInput(cmd.Cmd):
"""Disable Bluetooth Adapter"""
cmd = "Disable Bluetooth Adapter"
try:
- self.bta_lib.disable()
+ self.pri_dut.bta.disable()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -684,7 +737,7 @@ class CmdInput(cmd.Cmd):
"""Initiate bond to PTS device"""
cmd = "Initiate Bond"
try:
- self.bta_lib.init_bond()
+ self.pri_dut.bta.init_bond()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -692,7 +745,7 @@ class CmdInput(cmd.Cmd):
"""Start BR/EDR Discovery"""
cmd = "Start BR/EDR Discovery"
try:
- self.bta_lib.start_discovery()
+ self.pri_dut.bta.start_discovery()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -700,7 +753,7 @@ class CmdInput(cmd.Cmd):
"""Stop BR/EDR Discovery"""
cmd = "Stop BR/EDR Discovery"
try:
- self.bta_lib.stop_discovery()
+ self.pri_dut.bta.stop_discovery()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -708,7 +761,7 @@ class CmdInput(cmd.Cmd):
"""Get Discovered Br/EDR Devices"""
cmd = "Get Discovered Br/EDR Devices\n"
try:
- self.bta_lib.get_discovered_devices()
+ self.pri_dut.bta.get_discovered_devices()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -716,7 +769,7 @@ class CmdInput(cmd.Cmd):
"""Bond to PTS device"""
cmd = "Bond to the PTS dongle directly"
try:
- self.bta_lib.bond()
+ self.pri_dut.bta.bond()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -724,7 +777,7 @@ class CmdInput(cmd.Cmd):
"""BTA disconnect"""
cmd = "BTA disconnect"
try:
- self.bta_lib.disconnect()
+ self.pri_dut.bta.disconnect()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -732,7 +785,7 @@ class CmdInput(cmd.Cmd):
"""Unbond from PTS device"""
cmd = "Unbond from the PTS dongle"
try:
- self.bta_lib.unbond()
+ self.pri_dut.bta.unbond()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -740,7 +793,7 @@ class CmdInput(cmd.Cmd):
"""Start or stop Bluetooth Pairing Helper"""
cmd = "Start or stop BT Pairing helper"
try:
- self.bta_lib.start_pairing_helper(line)
+ self.pri_dut.bta.start_pairing_helper(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -748,7 +801,7 @@ class CmdInput(cmd.Cmd):
"""Push pairing pin to the Android Device"""
cmd = "Push the pin to the Android Device"
try:
- self.bta_lib.push_pairing_pin(line)
+ self.pri_dut.bta.push_pairing_pin(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -756,7 +809,7 @@ class CmdInput(cmd.Cmd):
"""Get pairing PIN"""
cmd = "Get Pin Info"
try:
- self.bta_lib.get_pairing_pin()
+ self.pri_dut.bta.get_pairing_pin()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -764,7 +817,7 @@ class CmdInput(cmd.Cmd):
"""BTA fetch UUIDS with SDP"""
cmd = "Fetch UUIDS with SDP"
try:
- self.bta_lib.fetch_uuids_with_sdp()
+ self.pri_dut.bta.fetch_uuids_with_sdp()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -772,14 +825,14 @@ class CmdInput(cmd.Cmd):
"""Connect available profiles"""
cmd = "Connect all profiles possible"
try:
- self.bta_lib.connect_profiles()
+ self.pri_dut.bta.connect_profiles()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_bta_tts_speak(self, line):
cmd = "Open audio channel by speaking characters"
try:
- self.bta_lib.tts_speak()
+ self.pri_dut.bta.tts_speak()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -789,7 +842,7 @@ class CmdInput(cmd.Cmd):
def do_rfcomm_connect(self, line):
"""Perform an RFCOMM connect"""
try:
- self.rfcomm_lib.connect(line)
+ self.pri_dut.rfcomm.connect(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -797,7 +850,7 @@ class CmdInput(cmd.Cmd):
"""Open rfcomm socket"""
cmd = "Open RFCOMM socket"
try:
- self.rfcomm_lib.open_rfcomm_socket()
+ self.pri_dut.rfcomm.open_rfcomm_socket()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -805,42 +858,42 @@ class CmdInput(cmd.Cmd):
"""Open L2CAP socket"""
cmd = "Open L2CAP socket"
try:
- self.rfcomm_lib.open_l2cap_socket()
+ self.pri_dut.rfcomm.open_l2cap_socket()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_rfcomm_write(self, line):
cmd = "Write String data over an RFCOMM connection"
try:
- self.rfcomm_lib.write(line)
+ self.pri_dut.rfcomm.write(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_rfcomm_write_binary(self, line):
cmd = "Write String data over an RFCOMM connection"
try:
- self.rfcomm_lib.write_binary(line)
+ self.pri_dut.rfcomm.write_binary(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_rfcomm_end_connect(self, line):
cmd = "End RFCOMM connection"
try:
- self.rfcomm_lib.end_connect()
+ self.pri_dut.rfcomm.end_connect()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_rfcomm_accept(self, line):
cmd = "Accept RFCOMM connection"
try:
- self.rfcomm_lib.accept(line)
+ self.pri_dut.rfcomm.accept(line)
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
def do_rfcomm_stop(self, line):
cmd = "STOP RFCOMM Connection"
try:
- self.rfcomm_lib.stop()
+ self.pri_dut.rfcomm.stop()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -848,7 +901,7 @@ class CmdInput(cmd.Cmd):
"""Open L2CAP socket"""
cmd = "Open L2CAP socket"
try:
- self.rfcomm_lib.open_l2cap_socket()
+ self.pri_dut.rfcomm.open_l2cap_socket()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -859,7 +912,7 @@ class CmdInput(cmd.Cmd):
"""Reset Bluetooth Config file"""
cmd = "Reset Bluetooth Config file"
try:
- self.config_lib.reset()
+ self.pri_dut.config.reset()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -867,7 +920,7 @@ class CmdInput(cmd.Cmd):
"""Set NonBondable Mode"""
cmd = "Set NonBondable Mode"
try:
- self.config_lib.set_nonbond()
+ self.pri_dut.config.set_nonbond()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
@@ -875,13 +928,32 @@ class CmdInput(cmd.Cmd):
"""Set Disable MITM"""
cmd = "Set Disable MITM"
try:
- self.config_lib.set_disable_mitm()
+ self.pri_dut.config.set_disable_mitm()
except Exception as err:
self.log.info(FAILURE.format(cmd, err))
"""End Config wrappers"""
"""Begin HFP/HSP wrapper"""
+ def do_bta_hfp_start_voice_recognition(self, line):
+ self.pri_dut.droid.bluetoothHspStartVoiceRecognition(self.mac_addr)
+
+ def do_bta_hfp_stop_voice_recognition(self, line):
+ self.pri_dut.droid.bluetoothHspStopVoiceRecognition(self.mac_addr)
+
+ def do_test_clcc_response(self, line):
+ # Experimental
+ clcc_index = 1
+ clcc_direction = 1
+ clcc_status = 4
+ clcc_mode = 0
+ clcc_mpty = False
+ clcc_number = "18888888888"
+ clcc_type = 0
+ self.pri_dut.droid.bluetoothHspClccResponse(
+ clcc_index, clcc_direction, clcc_status, clcc_mode, clcc_mpty,
+ clcc_number, clcc_type)
+
def do_bta_hsp_force_sco_audio_on(self, line):
"""HFP/HSP Force SCO Audio ON"""
cmd = "HFP/HSP Force SCO Audio ON"
@@ -987,3 +1059,334 @@ class CmdInput(cmd.Cmd):
self.log.info(FAILURE.format(cmd, err))
"""End HID wrappers"""
+ """Begin carkit test wrappers"""
+
+ def do_test_suite_generic_bt_tests(self, line):
+ """Run generic Bluetooth connection test suite"""
+ generic_bt_tests = [
+ tuple((self.bt_carkit_lib.disconnect_reconnect_multiple_iterations,
+ [self.pri_dut])),
+ tuple((self.bt_carkit_lib.disconnect_a2dp_only_then_reconnect,
+ [self.pri_dut])),
+ tuple((self.bt_carkit_lib.disconnect_hsp_only_then_reconnect,
+ [self.pri_dut])),
+ tuple((
+ self.bt_carkit_lib.disconnect_both_hsp_and_a2dp_then_reconnect,
+ [self.pri_dut])),
+ ]
+ try:
+ for func, param in generic_bt_tests:
+ try:
+ func(param)
+ except Exception:
+ self.log.info("Test {} failed.".format(func))
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_connect_hsp_helper(self, line):
+ """Connect to HSP/HFP with additional tries and help"""
+ cmd = "Connect to hsp with some help"
+ try:
+ self.bt_carkit_lib.connect_hsp_helper(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_hfp_setup_multi_incomming_calls(self, line):
+ """Setup two incomming calls"""
+ cmd = "Setup multiple incomming calls"
+ try:
+ self.bt_carkit_lib.setup_multi_call(self.sec_dut, self.ter_dut,
+ self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_disconnect_reconnect_multiple_iterations(self, line):
+ """Quick disconnect/reconnect stress test"""
+ try:
+ self.bt_carkit_lib.disconnect_reconnect_multiple_iterations(
+ self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_disconnect_a2dp_only_then_reconnect(self, line):
+ """Test disconnect-reconnect a2dp only scenario from phone."""
+ cmd = "Test disconnect-reconnect a2dp only scenario from phone."
+ try:
+ self.bt_carkit_lib.disconnect_a2dp_only_then_reconnect(
+ self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_disconnect_hsp_only_then_reconnect(self, line):
+ """Test disconnect-reconnect hsp only scenario from phone."""
+ cmd = "Test disconnect-reconnect hsp only scenario from phone."
+ try:
+ self.bt_carkit_lib.disconnect_hsp_only_then_reconnect(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_disconnect_both_hsp_and_a2dp_then_reconnect(self, line):
+ """Test disconnect-reconnect hsp and a2dp scenario from phone."""
+ cmd = "Test disconnect-reconnect hsp and a2dp scenario from phone."
+ try:
+ self.bt_carkit_lib.disconnect_both_hsp_and_a2dp_then_reconnect(
+ self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_call_private_number(self, line):
+ """Test outgoing call scenario from phone to private number"""
+ cmd = "Test outgoing call scenario from phone to private number"
+ try:
+ self.bt_carkit_lib.outgoing_call_private_number(
+ self.pri_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_call_a2dp_play_before_and_after(self, line):
+ """Test outgoing call scenario while playing music. Music should resume
+ after call."""
+ cmd = "Test outgoing call scenario while playing music. Music should " \
+ "resume after call."
+ try:
+ self.bt_carkit_lib.outgoing_call_a2dp_play_before_and_after(
+ self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_call_unknown_contact(self, line):
+ """Test outgoing call scenario from phone to unknow contact"""
+ cmd = "Test outgoing call scenario from phone to unknow contact"
+ try:
+ self.bt_carkit_lib.outgoing_call_unknown_contact(
+ self.pri_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_incomming_call_private_number(self, line):
+ """Test incomming call scenario to phone from unknown contact"""
+ cmd = "Test incomming call scenario to phone from unknown contact"
+ try:
+ self.bt_carkit_lib.incomming_call_private_number(
+ self.pri_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_call_multiple_iterations(self, line):
+ """Test outgoing call quickly 3 times"""
+ cmd = "Test outgoing call quickly 3 times"
+ try:
+ self.bt_carkit_lib.outgoing_call_multiple_iterations(
+ self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_call_hsp_disabled_then_enabled_during_call(self, line):
+ """Test outgoing call hsp disabled then enable during call."""
+ cmd = "Test outgoing call hsp disabled then enable during call."
+ try:
+ self.bt_carkit_lib.outgoing_call_hsp_disabled_then_enabled_during_call(
+ self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_call_audio_routes(self, line):
+ """Test various audio routes scenario from phone."""
+ cmd = "Test various audio routes scenario from phone."
+ try:
+ self.bt_carkit_lib.call_audio_routes(self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_sms_receive_different_sizes(self, line):
+ """Test recieve sms of different sizes."""
+ cmd = "Test recieve sms of different sizes."
+ try:
+ self.bt_carkit_lib.sms_receive_different_sizes(
+ self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_sms_receive_multiple(self, line):
+ """Test recieve sms of different sizes."""
+ cmd = "Test recieve sms of different sizes."
+ try:
+ self.bt_carkit_lib.sms_receive_multiple(self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_sms_send_outgoing_texts(self, line):
+ """Test send sms of different sizes."""
+ cmd = "Test send sms of different sizes."
+ try:
+ self.bt_carkit_lib.sms_send_outgoing_texts(self.pri_dut,
+ self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_sms_during_incomming_call(self, line):
+ """Test incomming call scenario to phone from unknown contact"""
+ cmd = "Test incomming call scenario to phone from unknown contact"
+ try:
+ self.bt_carkit_lib.sms_during_incomming_call(
+ self.pri_dut, self.sec_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_incomming_call(self, line):
+ """Test 2 incomming calls scenario to phone."""
+ cmd = "Test 2 incomming calls scenario to phone."
+ try:
+ self.bt_carkit_lib.multi_incomming_call(self.pri_dut, self.sec_dut,
+ self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_call_audio_routing(self, line):
+ """Test 2 incomming calls scenario to phone, then test audio routing."""
+ cmd = "Test 2 incomming calls scenario to phone, then test audio" \
+ "routing."
+ try:
+ self.bt_carkit_lib.multi_call_audio_routing(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_call_swap_multiple_times(self, line):
+ """Test 2 incomming calls scenario to phone, then swap the calls
+ multiple times"""
+ cmd = "Test 2 incomming calls scenario to phone, then swap the calls" \
+ "multiple times"
+ try:
+ self.bt_carkit_lib.multi_call_swap_multiple_times(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_call_join_conference_call(self, line):
+ """Test 2 incomming calls scenario to phone then join the calls."""
+ cmd = "Test 2 incomming calls scenario to phone then join the calls."
+ try:
+ self.bt_carkit_lib.multi_call_join_conference_call(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_call_join_conference_call_hangup_conf_call(self, line):
+ """Test 2 incomming calls scenario to phone then join the calls,
+ then terminate the call from the primary dut."""
+ cmd = "Test 2 incomming calls scenario to phone then join the calls, " \
+ "then terminate the call from the primary dut."
+ try:
+ self.bt_carkit_lib.multi_call_join_conference_call_hangup_conf_call(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_outgoing_multi_call_join_conference_call(self, line):
+ """Test 2 outgoing calls scenario from phone then join the calls."""
+ cmd = "Test 2 outgoing calls scenario from phone then join the calls."
+ try:
+ self.bt_carkit_lib.outgoing_multi_call_join_conference_call(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_multi_call_join_conference_call_audio_routes(self, line):
+ """Test 2 incomming calls scenario to phone then join the calls,
+ then test different audio routes."""
+ cmd = "Test 2 incomming calls scenario to phone then join the calls, " \
+ "then test different audio routes."
+ try:
+ self.bt_carkit_lib.multi_call_join_conference_call_audio_routes(
+ self.pri_dut, self.sec_dut, self.ter_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_avrcp_play_pause(self, line):
+ """Test avrcp play/pause commands multiple times from phone"""
+ cmd = "Test avrcp play/pause commands multiple times from phone"
+ try:
+ self.bt_carkit_lib.avrcp_play_pause(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_avrcp_next_previous_song(self, line):
+ """Test AVRCP go to the next song then the previous song."""
+ cmd = "Test AVRCP go to the next song then the previous song."
+ try:
+ self.bt_carkit_lib.avrcp_next_previous_song(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_avrcp_next_previous(self, line):
+ """Test AVRCP go to the next song then the press previous after a few
+ seconds."""
+ cmd = "Test AVRCP go to the next song then the press previous after " \
+ "a few seconds."
+ try:
+ self.bt_carkit_lib.avrcp_next_previous(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_avrcp_next_repetative(self, line):
+ """Test AVRCP go to the next 10 times"""
+ cmd = "Test AVRCP go to the next 10 times"
+ try:
+ self.bt_carkit_lib.avrcp_next_repetative(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def _process_question(self, question, expected_response):
+ while True:
+ try:
+ result = input(question.format(level)).lower()
+ except Exception as err:
+ print(err)
+
+ def do_e2e_cycle_battery_level(self, line):
+ """Cycle battery level through different values and verify result on carkit"""
+ cmd = "Test that verifies battery level indicator changes with the " \
+ "phone. Phone current level."
+ try:
+ self.bt_carkit_lib.cycle_absolute_volume_control(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_cycle_absolute_volume_control(self, line):
+ """Cycle media volume level through different values and verify result on carkit"""
+ cmd = "Test aboslute volume on carkit by changed volume levels from phone."
+ try:
+ self.bt_carkit_lib.cycle_absolute_volume_control(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_test_voice_recognition_from_phone(self, line):
+ """Test Voice Recognition from phone."""
+ cmd = "Test voice recognition from phone."
+ try:
+ self.bt_carkit_lib.test_voice_recognition_from_phone(self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ def do_e2e_test_audio_and_voice_recognition_from_phone(self, line):
+ """Test Voice Recognition from phone and confirm music audio continues."""
+ cmd = "Test Voice Recognition from phone and confirm music audio continues."
+ try:
+ self.bt_carkit_lib.test_audio_and_voice_recognition_from_phone(
+ self.pri_dut)
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ """End carkit test wrappers"""
+ """Begin adb shell test wrappers"""
+
+ def do_set_battery_level(self, line):
+ """Set battery level based on input"""
+ cmd = "Set battery level based on input"
+ try:
+ self.pri_dut.shell.set_battery_level(int(line))
+ except Exception as err:
+ self.log.info(FAILURE.format(cmd, err))
+
+ """End adb shell test wrappers"""
diff --git a/acts/tests/google/bt/pts/instructions/AVDTP_PTS_INSTUCTIONS b/acts/tests/google/bt/pts/instructions/AVDTP_PTS_INSTUCTIONS
new file mode 100644
index 0000000000..8ce453ab20
--- /dev/null
+++ b/acts/tests/google/bt/pts/instructions/AVDTP_PTS_INSTUCTIONS
@@ -0,0 +1,20 @@
+# 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.
+
+DID
+=================================================================
+
+TC_SRC_INT_SIG_SMG_BV_23_C
+ #Before test run this and set it to false after the test is done.
+ adb shell setprop bluetooth.pts.force_a2dp_abort true
diff --git a/acts/tests/google/bt/pts/instructions/BNEP_PTS_INSTRUCTIONS b/acts/tests/google/bt/pts/instructions/BNEP_PTS_INSTRUCTIONS
new file mode 100644
index 0000000000..389b4ef48a
--- /dev/null
+++ b/acts/tests/google/bt/pts/instructions/BNEP_PTS_INSTRUCTIONS
@@ -0,0 +1,80 @@
+# 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.
+
+DID
+=================================================================
+
+TC_CTRL_BV_01_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_02_C
+ bta_start_pairing_helper
+ bta_connect_profiles
+ # Wait 20 seconds
+
+TC_CTRL_BV_03_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_04_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_05_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_06_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_08_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_10_C
+ bta_start_pairing_helper
+
+TC_CTRL_BV_19_C
+ bta_start_pairing_helper
+
+TC_RX-TYPE-0_BV_11_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-TYPE-0_BV_15_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-TYPE-0_BV_16_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-TYPE-0_BV_17_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-TYPE-0_BV_18_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-C_BV_12_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-C-S_BV_13_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_RX-C-D_BV_14_C
+ bta_start_pairing_helper
+ [PTS Interaction]
+
+TC_TX-TYPE-0_BV_20_C
+ TBD \ No newline at end of file
diff --git a/acts/tests/google/bt/pts/instructions/GATT_PTS_INSTRUCTIONS b/acts/tests/google/bt/pts/instructions/GATT_PTS_INSTRUCTIONS
index f789c82727..49540b48c3 100644
--- a/acts/tests/google/bt/pts/instructions/GATT_PTS_INSTRUCTIONS
+++ b/acts/tests/google/bt/pts/instructions/GATT_PTS_INSTRUCTIONS
@@ -14,6 +14,14 @@
GATT
=================================================================
+Note: Bug in PTS forces GATT operations to be over BR/EDR. To run tests over
+LE disable BR/EDR in ICS when running tests.
+
+Note: As of PTS version 7.2.1 GATT server tests now performs scans appropriately. Change IXIT value for TSPX_iut_device_name_in_adv_packet_for_random_address to "CMD LINE Test" and make sure you have a connectable advertisement with that local name:
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
+
+
TC_CL_GAC_BV_01_C
gattc_connect_over_le
gattc_request_mtu 23
@@ -21,6 +29,14 @@ TC_CL_GAC_BV_01_C
gattc_write_char_by_instance_id [handle] [size]
gattc_disconnect
+#Potential new instructions for SIG testcase rewrite
+TC_CL_GAC_BV_01_C
+ gattc_connect_over_le
+ gattc_request_mtu 23
+ [Read PTS Handle and Size]
+ gattc_write_invalid_char_by_instance_id [handle] [size]
+ gattc_disconnect
+
TC_CL_GAD_BV_01_C
gattc_connect_over_le
gattc_refresh
@@ -37,6 +53,7 @@ TC_CL_GAD_BV_01_C
gattc_disconnect
TC_CL_GAD_BV_02_C
+ Note: Values of UUIDS sometimes changes.
gattc_connect_over_le
gattc_discover_service_by_uuid 1800
[PTS Interaction] Verify Values
@@ -68,84 +85,101 @@ TC_CL_GAD_BV_02_C
TC_CL_GAD_BV_03_C
gattc_connect_over_le
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
[PTS Interation]
gattc_disconnect
TC_CL_GAD_BV_04_C
gattc_connect_over_le
- gattc_list_all_uuids
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
- gattc_list_all_uuids
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
- gattc_list_all_uuids
+ gattc_refresh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
- gattc_list_all_uuids
+ gattc_refresh
[PTS Interation]
gattc_disconnect
TC_CL_GAD_BV_05_C
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gttc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
+ gattc_refesh
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refesh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
TC_CL_GAD_BV_06_C
gattc_connect_over_le
+ gattc_refresh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
gattc_connect_over_le
+ gattc_refresh
gattc_list_all_uuids
[PTS Interation]
gattc_disconnect
@@ -209,6 +243,36 @@ TC_CL_GAR_BI_05_C
[PTS Interaction]
bta_unbond
+TC_CL_GAR_BV_03_C
+ gattc_connect_over_le
+ gattc_read_char_by_uuid [Input UUID]
+ [PTS Interaction] Verify values
+ gattc_read_char_by_uuid 000055f2-0000-0000-0123-456789abcdef
+
+TC_CL_GAR_BI_06_C
+ gattc_connect_over_le
+ gattc_read_char_by_uuid [Input UUID]
+ gattc_disconnect
+ [PTS Interaction] Verify values
+
+TC_CL_GAR_BI_07_C
+ gattc_connect_over_le
+ gattc_read_char_by_uuid [Input UUID]
+ gattc_disconnect
+ [PTS Interaction] Verify values
+
+TC_CL_GAR_BI_10_C
+ gattc_connect_over_le
+ gattc_read_char_by_uuid [Input UUID]
+ gattc_disconnect
+ [PTS Interaction] Verify values
+
+TC_CL_GAR_BI_11_C
+ gattc_connect_over_le
+ gattc_read_char_by_uuid [Input UUID]
+ gattc_disconnect
+ [PTS Interaction] Verify values
+
TC_CL_GAR_BV_04_C
gattc_connect_over_le
gattc_mod_read_char_by_instance_id [handle]
@@ -426,7 +490,7 @@ TC_CL_GAW_BI_07_C
TC_CL_GAW_BI_08_C
gattc_connect_over_le
- do_gattc_mod_write_char_by_instance_id [handle] 43
+ gattc_mod_write_char_by_instance_id [handle] 43
[PTS Interaction]
gattc_disconnect
@@ -611,6 +675,15 @@ TC_CL_GAW_BI_32_C
gattc_execute_reliable_write
gattc_disconnect
+TC_CL_GAW_BI_32_C - Alternate method
+ gattc_connect_over_le
+ gattc_write_invalid_char_by_instance_id 0029 1
+ gattc_write_invalid_char_by_instance_id 0029 21
+ gattc_write_invalid_char_by_instance_id 0029 21
+ gattc_write_invalid_char_by_instance_id 0029 21
+ gattc_disconnect
+
+
TC_CL_GAW_BI_33_C
gattc_connect_over_le
gattc_write_char_by_instance_id [handle] [size]
@@ -641,11 +714,12 @@ TC_CL_GAN_BV_01_C
[PTS Interaction]
gattc_disconnect
-TC_CL_GAN_BV_01_C
- gatts_setup_database TEST_DB_5
- ble_start_generic_connectable_advertisement
- gatts_list_all_uuids
- gatts_notify_characteristic_changed [instance id from previous command of only characteristic.] true
+TC_CL_GAI_BV_01_C
+ gattc_connect_over_le
+ gattc_enable_indication_desc_by_instance_id 0113
+ [PTS Interaction]
+ gattc_disconnect
+
TC_CL_GAS_BV_01_C
gattc_connect_over_le
@@ -718,7 +792,8 @@ TC_SR_GAR_BI_02_C
Note: Static Address OK
gatts_setup_database TEST_DB_3
ble_start_generic_connectable_advertisement
- gatts_send_response GATT_INVALID_PDU
+ [PTS Interaction] Enter handle of uuid 2a30 after running the command gatts_list_all_uuids
+ gatts_send_response GATT_FAILURE
TC_SR_GAR_BI_03_C
gatts_setup_database TEST_DB_1
@@ -752,8 +827,11 @@ TC_SR_GAR_BI_07_C
TC_SR_GAR_BI_08_C
Note: Static Address OK
+ bta_start_pairing_helper
gatts_setup_database TEST_DB_1
ble_start_generic_connectable_advertisement
+ [PTS Interaction] Enter pin from PTS to phone
+ gatts_send_response GATT_FAILURE
TC_SR_GAR_BI_09_C
gatts_setup_database TEST_DB_1
@@ -795,6 +873,14 @@ TC_SR_GAR_BI_13_C
gatts_send_response GATT_SUCCESS 24
gatts_send_response GATT_INVALID_OFFSET
+TC_SR_GAR_BI_13_C (on PTS 7.2.1)
+ gatts_setup_database LARGE_1
+ # Have a logcat going as such: adb logcat | grep GattServer11onCharacteristicReadRequest
+ # Every time the offset is > 23:
+ gatts_send_response GATT_INVALID_OFFSET
+ # Every time the offset is < 23:
+ gatts_send_response GATT_SUCCESS 24
+
TC_SR_GAR_BI_14_C
Note: Static Address OK
gatts_setup_database TEST_DB_3
@@ -817,13 +903,23 @@ TC_SR_GAR_BI_17_C
gatts_send_response GATT_0C_ERR
gatts_send_response GATT_0C_ERR
-TC_SR_GAR_BV_05_C
+TC_SR_GAR_BV_05_C - Deprecated
Note: Static Address OK
gatts_setup_database TEST_DB_3
ble_start_generic_connectable_advertisement
[PTS Interaction] Enter 002a
gatts_send_response GATT_READ_NOT_PERMITTED
+TC_SR_GAR_BV_05_C - PTS 7.2.1
+ gatts_setup_database TEST_DB_3
+ bta_start_pairing_helper
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
+ [PTS Interaction] Enter PIN fro PTS to phone
+ gatts_send_response GATT_SUCCESS
+ gatts_send_response GATT_SUCCESS
+ [PTS Interaction] Verify values
+
TC_SR_GAR_BI_18_C
Note: Static Address OK
gatts_setup_database TEST_DB_3
@@ -995,6 +1091,8 @@ TC_SR_GAW_BV_03_C
gatts_send_response GATT_SUCCESS
gatts_send_response GATT_SUCCESS
gatts_send_response GATT_SUCCESS
+ atts_send_response GATT_SUCCESS
+ atts_send_response GATT_SUCCESS
TC_SR_GAW_BI_02_C
Note: Static Address OK
@@ -1045,7 +1143,7 @@ TC_SR_GAW_BI_08_C
[PTS Interaction] Enter 002a
gatts_send_response GATT_WRITE_NOT_PERMITTED
-TC_SR_GAW_BI_09_C
+TC_SR_GAW_BI_09_C - Deprecated
Note: Static Address OK
gatts_setup_database PTS_TEST
ble_start_generic_connectable_advertisement
@@ -1055,6 +1153,20 @@ TC_SR_GAW_BI_09_C
gatts_send_response GATT_SUCCESS
gatts_send_response GATT_INVALID_OFFSET
+TC_SR_GAW_BI_09_C - NEW INSTRUCTIONS
+ Note: This test is a little tricky. Need to monitor logcat as such: adb logcat | grep offset.
+ gatts_setup_database LARGE_DB_3
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
+ # Whenever offset is <=23
+ gatts_send_response GATT_SUCCESS 24
+ # Whenever offset is > 23
+ # If preparedWrite value is True
+ gatts_send_response GATT_SUCCESS 24
+ gatts_send_response GATT_INVALID_OFFSET
+ # If preparedWrite value is False
+ gatts_send_response GATT_INVALID_OFFSET
+
TC_SR_GAW_BI_11_C
Note: Static Address OK
gatts_setup_database TEST_DB_3
@@ -1086,9 +1198,9 @@ TC_SR_GAW_BV_06_C
TC_SR_GAW_BV_10_C
Note: Static Address OK
Note: Make sure MTU is set to 23 on PTS
- gatts_setup_database PTS_TEST
+ gatts_setup_database LARGE_DB_3
ble_start_generic_connectable_advertisement
- Whenever PTS prompts: "Discover All Characteristics of Service Request completed successfully" run this cmd:
+ Whenever PTS prompts: "Discover All Characteristics of Service Request completed successfully" in the Output Tool Window run this cmd:
gatts_send_response GATT_SUCCESS 24
Otherwise always respond with:
gatts_send_response GATT_SUCCESS
@@ -1184,7 +1296,7 @@ TC_SR_GAW_BV_24_C
gatts_send_response GATT_0C_ERR
gatts_send_response GATT_0C_ERR
-TC_SR_GAW_BV_09_C
+TC_SR_GAW_BV_09_C - DEPRECATED
Note: Static Address OK
gatts_setup_database TEST_DB_3
ble_start_generic_connectable_advertisement
@@ -1198,6 +1310,13 @@ TC_SR_GAW_BV_09_C
gatts_send_response GATT_SUCCESS
gatts_send_response GATT_SUCCESS
+TC_SR_GAW_BV_09_C - New Instructions
+ Note: Static Address OK
+ gatts_setup_database LARGE_DB_1
+ ble_start_generic_connectable_advertisement
+ # Repeat below cmd until success
+ gatts_send_response GATT_SUCCESS
+
TC_SR_GAW_BI_25_C
Note: Static Address OK
gatts_setup_database TEST_DB_3
@@ -1263,6 +1382,7 @@ TC_SR_GAW_BI_32_C
TC_SR_GAW_BI_33_C
Note: Static Address OK
+ Note: This testcase is tricky as the order randomises a bit each time...
gatts_setup_database LARGE_DB_3
ble_start_generic_connectable_advertisement
gatts_send_response GATT_SUCCESS 24
@@ -1307,18 +1427,22 @@ TC_SR_GAN_BV_01_C
gatts_notify_characteristic_changed [Handle from PTS] false 10
TC_SR_GAI_BV_01_C
- gattc_connect_over_le
- gattc_write_desc_notification_by_instance_id 00f3 2
+ gatts_setup_database DB_TEST
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
[PTS Interaction] Verify value and click yes
- gattc_disconnect
+ gatts_notify_characteristic_changed 002a false 10
+ gatts_notify_characteristic_changed 002a true 10
+
TC_SR_GAS_BV_01_C
gatts_setup_database DB_TEST
ble_start_generic_connectable_advertisement
+ [PTS Interaction] Click ok
+ gatts_notify_characteristic_changed 002a false 10
gatts_setup_database TEST_DB_3
- Wait 60 seconds for PTS to process
-TC_SR_GAT_BV_01_C
+TC_SR_GAT_BV_01_C - Deprecated
gatts_setup_database LARGE_DB_3
ble_start_generic_connectable_advertisement
gatts_send_response GATT_SUCCESS
@@ -1326,3 +1450,22 @@ TC_SR_GAT_BV_01_C
gatts_send_response GATT_SUCCESS
gatts_setup_database TEST_DB_3
Wait 30 seconds for PTS to process
+
+TC_SR_GAT_BV_01_C - Deprecated
+ gatts_setup_database Test_DB_5
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
+ gatts_notify_characteristic_changed 0013 true
+ gatts_notify_characteristic_changed 002a true
+ gatts_send_response GATT_SUCCESS
+ gatts_send_response GATT_SUCCESS
+ gatts_send_response GATT_SUCCESS
+ gatts_notify_characteristic_changed 0003 true
+ gatts_setup_database TEST_DB_1
+ [PTS WAIT] 30 seconds to timeout to occur
+
+TC_SR_UNS_BI_02_C
+ bta_start_pairing_helper
+ ble_adv_data_include_local_name true
+ ble_start_generic_connectable_advertisement
+ [PTS Interaction] Enter pin from PTS to phone \ No newline at end of file
diff --git a/acts/tests/google/bt/pts/instructions/L2CAP_PTS_INSTRUCTIONS b/acts/tests/google/bt/pts/instructions/L2CAP_PTS_INSTRUCTIONS
index a865f45579..d41872f3fb 100644
--- a/acts/tests/google/bt/pts/instructions/L2CAP_PTS_INSTRUCTIONS
+++ b/acts/tests/google/bt/pts/instructions/L2CAP_PTS_INSTRUCTIONS
@@ -101,6 +101,49 @@ TC_L2CAP_COS_IEX_BV_02_C
TC_L2CAP_COS_ECH_BV_01_C
bta_enable
+TC_L2CP_COS_CFC_BV_01_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ rfcomm_write 10
+ [PTS Interaction] Verify value
+ rfcomm_stop
+ gattc_disconnect
+ bta_disable
+ bta_enable
+
+TC_L2CP_COS_CFC_BV_02_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ rfcomm_write 10
+ [PTS Interaction] Verify value
+ rfcomm_stop
+ gattc_disconnect
+
+TC_L2CP_COS_CFC_BV_03_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ rfcomm_write 10
+ [PTS Interaction] Verify value
+ rfcomm_stop
+ gattc_disconnect
+
+TC_L2CP_COS_CFC_BV_04_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify value
+ rfcomm_stop
+ gattc_disconnect
+
+TC_L2CP_COS_CFC_BV_05_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify value
+ rfcomm_stop
+ gattc_disconnect
+ bta_disable
+ bta_enable
+
TC_L2CAP_EXF_BV_01_C
bta_set_scan_mode connectable
@@ -119,6 +162,10 @@ TC_L2CAP_CMC_BV_09_C
TC_L2CAP_CMC_BV_10_C
rfcomm_connect
rfcomm_stop
+ rfcomm_connect
+ rfcomm_stop
+ rfcomm_connect
+ rfcomm_stop
[Wait up to 10-15 seconds]
TC_L2CAP_CMC_BV_11_C
@@ -138,7 +185,7 @@ TC_L2CAP_CMC_BV_13_C
[PTS Interaction] Yes
TC_L2CAP_CMC_BI_05_C
- rfcomm_accept
+ rfcomm_connect
[Wait up to 10-15 seconds]
TC_L2CAP_CMC_BI_06_C
@@ -161,9 +208,80 @@ TC_LE_REJ_BI_01_C
gattc_connect_over_le
gattc_disconnect
+TC_L2CAP_LE_CFC_BI_01_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_01_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_02_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_03_C
+ TBD
+
+TC_L2CAP_LE_CFC_BV_04_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 241
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
TC_L2CAP_LE_CFC_BV_05_C
gattc_connect_over_le
gattc_disconnect
bta_disable
bta_enable
gattc_connect_over_le
+
+TC_L2CAP_LE_CFC_BV_06_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ rfcomm_write 10
+ rfcomm_write 10
+ rfcomm_write 10
+ gattc_disconnect
+ bta_disable
+ bta_enable
+
+TC_L2CAP_LE_CFC_BV_07_C
+ TBD
+
+TC_L2CAP_LE_CFC_BV_09_C
+ TBD
+
+TC_L2CAP_LE_CFC_BV_16_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_18_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_19_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+
+TC_L2CAP_LE_CFC_BV_20_C
+ TBD
+
+TC_L2CAP_LE_CFC_BV_21_C
+ gattc_connect_over_le
+ gattc_socket_conn_begin_connect_thread_psm 1 0 1
+ [PTS Interaction] Verify values
+ gattc_disconnect
+