258 lines
10 KiB
Python
258 lines
10 KiB
Python
|
|
# Lint as: python2, python3
|
||
|
|
# Copyright 2022 The Chromium OS Authors. All rights reserved.
|
||
|
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
|
# found in the LICENSE file.
|
||
|
|
"""A Batch of Bluetooth Quality Report tests"""
|
||
|
|
|
||
|
|
import collections
|
||
|
|
import time
|
||
|
|
|
||
|
|
from autotest_lib.client.common_lib import error
|
||
|
|
from autotest_lib.client.cros.bluetooth.bluetooth_audio_test_data import (
|
||
|
|
A2DP_MEDIUM, HFP_WBS, HFP_NBS, HFP_WBS_MEDIUM, HFP_NBS_MEDIUM)
|
||
|
|
from autotest_lib.server.cros.bluetooth.bluetooth_adapter_qr_tests import (
|
||
|
|
BluetoothAdapterQRTests, QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
from autotest_lib.server.cros.bluetooth.bluetooth_adapter_quick_tests import (
|
||
|
|
BluetoothAdapterQuickTests)
|
||
|
|
|
||
|
|
|
||
|
|
class bluetooth_AdapterQRHealth(BluetoothAdapterQuickTests,
|
||
|
|
BluetoothAdapterQRTests):
|
||
|
|
"""A Batch of Bluetooth audio health tests"""
|
||
|
|
|
||
|
|
test_wrapper = BluetoothAdapterQuickTests.quick_test_test_decorator
|
||
|
|
batch_wrapper = BluetoothAdapterQuickTests.quick_test_batch_decorator
|
||
|
|
|
||
|
|
def run_test_method(self,
|
||
|
|
devices,
|
||
|
|
test_method,
|
||
|
|
test_profile,
|
||
|
|
logging_and_check=True):
|
||
|
|
"""Common procedure to run a specific test method.
|
||
|
|
|
||
|
|
@param devices: a list of devices.
|
||
|
|
@param test_method: the test method to run.
|
||
|
|
@param test_profile: audio test profile to use.
|
||
|
|
@param logging_and_check: set this to True to opend the quality
|
||
|
|
report log checking.
|
||
|
|
"""
|
||
|
|
|
||
|
|
if not isinstance(devices, collections.Iterable):
|
||
|
|
devices = (devices, )
|
||
|
|
|
||
|
|
num_devices = len(devices)
|
||
|
|
|
||
|
|
# Make sure WBS profile works fine.
|
||
|
|
if test_profile in (HFP_WBS, HFP_WBS_MEDIUM):
|
||
|
|
if self.check_wbs_capability():
|
||
|
|
if not self.bluetooth_facade.enable_wbs(True):
|
||
|
|
raise error.TestError('failed to enble wbs')
|
||
|
|
else:
|
||
|
|
raise error.TestNAError(
|
||
|
|
'The DUT does not support WBS. Skip the test.')
|
||
|
|
elif test_profile in (HFP_NBS, HFP_NBS_MEDIUM):
|
||
|
|
if not self.bluetooth_facade.enable_wbs(False):
|
||
|
|
raise error.TestError('failed to disable wbs')
|
||
|
|
|
||
|
|
time.sleep(3)
|
||
|
|
|
||
|
|
self.test_reset_on_adapter()
|
||
|
|
self.test_bluetoothd_running()
|
||
|
|
|
||
|
|
for device in devices:
|
||
|
|
if device.device_type == 'BLUETOOTH_AUDIO':
|
||
|
|
self.initialize_bluetooth_audio(device, test_profile)
|
||
|
|
|
||
|
|
self.test_discover_device(device.address)
|
||
|
|
self.test_pairing(device.address, device.pin, trusted=True)
|
||
|
|
self.test_connection_by_adapter(device.address)
|
||
|
|
|
||
|
|
time.sleep(2)
|
||
|
|
|
||
|
|
if logging_and_check:
|
||
|
|
self.dut_btmon_log_path = self.start_new_btmon()
|
||
|
|
self.enable_disable_debug_log(enable=True)
|
||
|
|
self.enable_disable_quality_debug_log(enable=True)
|
||
|
|
|
||
|
|
test_method()
|
||
|
|
|
||
|
|
if logging_and_check:
|
||
|
|
self.test_send_log()
|
||
|
|
self.check_qr_event_log(num_devices=num_devices)
|
||
|
|
self.enable_disable_quality_debug_log(enable=False)
|
||
|
|
self.enable_disable_debug_log(enable=False)
|
||
|
|
|
||
|
|
for device in devices:
|
||
|
|
self.test_disconnection_by_adapter(device.address)
|
||
|
|
|
||
|
|
if device.device_type == 'BLUETOOTH_AUDIO':
|
||
|
|
self.cleanup_bluetooth_audio(device, test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report A2DP test',
|
||
|
|
devices={'BLUETOOTH_AUDIO': 1},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_a2dp_test(self):
|
||
|
|
"""Quality Report A2DP test"""
|
||
|
|
device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
test_profile = A2DP_MEDIUM
|
||
|
|
test_method = lambda: self.qr_a2dp(device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method(device, test_method, test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report power cycle and A2DP test',
|
||
|
|
devices={'BLUETOOTH_AUDIO': 1},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_power_cycle_a2dp_test(self):
|
||
|
|
"""Quality Report power cycle and A2DP test"""
|
||
|
|
device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
test_profile = A2DP_MEDIUM
|
||
|
|
test_method = lambda: self.qr_power_cycle_a2dp(device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method(device, test_method, test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report HFP NBS dut as source test',
|
||
|
|
devices={'BLUETOOTH_AUDIO': 1},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_hfp_nbs_dut_as_src_test(self):
|
||
|
|
"""Quality Report HFP NBS dut as source test"""
|
||
|
|
device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
test_profile = HFP_NBS_MEDIUM
|
||
|
|
test_method = lambda: self.qr_hfp_dut_as_src(device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method(device, test_method, test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report HFP WBS dut as source test',
|
||
|
|
devices={'BLUETOOTH_AUDIO': 1},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_hfp_wbs_dut_as_src_test(self):
|
||
|
|
"""Quality Report HFP WBS dut as source test"""
|
||
|
|
device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
test_profile = HFP_WBS_MEDIUM
|
||
|
|
test_method = lambda: self.qr_hfp_dut_as_src(device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method(device, test_method, test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report disabled A2DP test',
|
||
|
|
devices={'BLUETOOTH_AUDIO': 1},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_disabled_a2dp_test(self):
|
||
|
|
"""Quality Report disabled A2DP test"""
|
||
|
|
device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
test_profile = A2DP_MEDIUM
|
||
|
|
test_method = lambda: self.qr_disabled_a2dp(device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method(device,
|
||
|
|
test_method,
|
||
|
|
test_profile,
|
||
|
|
logging_and_check=False)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper('Quality Report A2DP and classic keyboard test',
|
||
|
|
devices={
|
||
|
|
'BLUETOOTH_AUDIO': 1,
|
||
|
|
"KEYBOARD": 1
|
||
|
|
},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_a2dp_cl_keyboard_test(self):
|
||
|
|
"""Quality Report A2DP and classic keyboard test"""
|
||
|
|
audio_device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
keyboard_device = self.devices['KEYBOARD'][0]
|
||
|
|
test_profile = A2DP_MEDIUM
|
||
|
|
test_method = lambda: self.qr_a2dp_cl_keyboard(
|
||
|
|
audio_device, keyboard_device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method((audio_device, keyboard_device),
|
||
|
|
test_method,
|
||
|
|
test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper(
|
||
|
|
'Quality Report HFP WBS dut as sink and classic keyboard test',
|
||
|
|
devices={
|
||
|
|
'BLUETOOTH_AUDIO': 1,
|
||
|
|
'KEYBOARD': 1
|
||
|
|
},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_hfp_wbs_dut_as_sink_cl_keyboard_test(self):
|
||
|
|
"""Quality Report HFP WBS dut as sink and classic keyboard test"""
|
||
|
|
audio_device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
keyboard_device = self.devices['KEYBOARD'][0]
|
||
|
|
test_profile = HFP_WBS_MEDIUM
|
||
|
|
test_method = lambda: self.qr_hfp_dut_as_sink_cl_keyboard(
|
||
|
|
audio_device, keyboard_device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method((audio_device, keyboard_device),
|
||
|
|
test_method,
|
||
|
|
test_profile)
|
||
|
|
|
||
|
|
# Remove flags=['Quick Health'] when this test is migrated to stable suite.
|
||
|
|
@test_wrapper(
|
||
|
|
'Quality Report HFP NBS dut as sink and classic keyboard test',
|
||
|
|
devices={
|
||
|
|
'BLUETOOTH_AUDIO': 1,
|
||
|
|
'KEYBOARD': 1
|
||
|
|
},
|
||
|
|
flags=['Quick Health'],
|
||
|
|
skip_chipsets=QR_UNSUPPORTED_CHIPSETS)
|
||
|
|
def qr_hfp_nbs_dut_as_sink_cl_keyboard_test(self):
|
||
|
|
"""Quality Report HFP NBS dut as sink and classic keyboard test"""
|
||
|
|
audio_device = self.devices['BLUETOOTH_AUDIO'][0]
|
||
|
|
keyboard_device = self.devices['KEYBOARD'][0]
|
||
|
|
test_profile = HFP_NBS_MEDIUM
|
||
|
|
test_method = lambda: self.qr_hfp_dut_as_sink_cl_keyboard(
|
||
|
|
audio_device, keyboard_device, test_profile)
|
||
|
|
|
||
|
|
self.run_test_method((audio_device, keyboard_device),
|
||
|
|
test_method,
|
||
|
|
test_profile)
|
||
|
|
|
||
|
|
@batch_wrapper('Bluetooth BQR Batch Health Tests')
|
||
|
|
def qr_health_batch_run(self, num_iterations=1, test_name=None):
|
||
|
|
"""Run the bluetooth audio health test batch or a specific given test.
|
||
|
|
|
||
|
|
@param num_iterations: how many iterations to run
|
||
|
|
@param test_name: specific test to run otherwise None to run the
|
||
|
|
whole batch
|
||
|
|
"""
|
||
|
|
self.qr_a2dp_test()
|
||
|
|
self.qr_power_cycle_a2dp_test()
|
||
|
|
self.qr_hfp_nbs_dut_as_src_test()
|
||
|
|
self.qr_hfp_wbs_dut_as_src_test()
|
||
|
|
self.qr_disabled_a2dp_test()
|
||
|
|
self.qr_a2dp_cl_keyboard_test()
|
||
|
|
self.qr_hfp_wbs_dut_as_sink_cl_keyboard_test()
|
||
|
|
self.qr_hfp_nbs_dut_as_sink_cl_keyboard_test()
|
||
|
|
|
||
|
|
def run_once(self,
|
||
|
|
host,
|
||
|
|
num_iterations=1,
|
||
|
|
args_dict=None,
|
||
|
|
test_name=None,
|
||
|
|
flag='Quick Health'):
|
||
|
|
"""Run the batch of Bluetooth stand health tests
|
||
|
|
|
||
|
|
@param host: the DUT, usually a chromebook
|
||
|
|
@param num_iterations: the number of rounds to execute the test
|
||
|
|
@param test_name: the test to run, or None for all tests
|
||
|
|
"""
|
||
|
|
self.host = host
|
||
|
|
|
||
|
|
self.quick_test_init(host,
|
||
|
|
use_btpeer=True,
|
||
|
|
flag=flag,
|
||
|
|
args_dict=args_dict)
|
||
|
|
self.qr_health_batch_run(num_iterations, test_name)
|
||
|
|
self.quick_test_cleanup()
|