blob: 0a7149b4c72001fe6b0be8bde0efce4fb4085fb3 [file] [log] [blame]
# Lint as: python2, python3
# Copyright 2019 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 stand alone health tests"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import logging
from autotest_lib.server.cros.bluetooth.bluetooth_adapter_quick_tests import (
BluetoothAdapterQuickTests)
from autotest_lib.server.cros.bluetooth import bluetooth_dbus_api_tests
from autotest_lib.server.cros.bluetooth import bluetooth_default_state_test
from autotest_lib.server.cros.bluetooth import bluetooth_valid_address_test
from six.moves import range
class bluetooth_AdapterSAHealth(BluetoothAdapterQuickTests,
bluetooth_default_state_test.bluetooth_Health_DefaultStateTest,
bluetooth_valid_address_test.bluetooth_Health_ValidAddressTest,
bluetooth_dbus_api_tests.BluetoothDBusAPITests):
"""A Batch of Bluetooth stand alone health tests. This test is written as
a batch of tests in order to reduce test time, since auto-test ramp up
time is costy. The batch is using BluetoothAdapterQuickTests wrapper
methods to start and end a test and a batch of tests.
This class can be called to run the entire test batch or to run a
specific test only
"""
test_wrapper = BluetoothAdapterQuickTests.quick_test_test_decorator
batch_wrapper = BluetoothAdapterQuickTests.quick_test_batch_decorator
@test_wrapper('Stand Alone basic test')
def sa_basic_test(self):
"""Set of basic stand alone test"""
# The bluetoothd must be running in the beginning.
self.test_bluetoothd_running()
# It is possible that the adapter is not powered on yet.
# Power it on anyway and verify that it is actually powered on.
self.test_power_on_adapter()
# Verify that the adapter could be powered off and powered on,
# and that it is in the correct working state.
self.test_power_off_adapter()
self.test_power_on_adapter()
self.test_adapter_work_state()
# Verify that the bluetoothd could be simply stopped and then
# be started again, and that it is in the correct working state.
self.test_stop_bluetoothd()
self.test_start_bluetoothd()
self.test_adapter_work_state()
# Verify that the adapter could be reset off and on which includes
# removing all cached information.
self.test_reset_off_adapter()
self.test_reset_on_adapter()
self.test_adapter_work_state()
# Verify that the adapter supports basic profiles.
self.test_UUIDs()
# Verify that the adapter could start and stop discovery.
self.test_start_discovery()
self.test_stop_discovery()
self.test_start_discovery()
# Verify that the adapter could set both discoverable and
# non-discoverable successfully.
self.test_discoverable()
self.test_nondiscoverable()
self.test_discoverable()
# Verify that the adapter could set pairable and non-pairable.
self.test_pairable()
self.test_nonpairable()
self.test_pairable()
@test_wrapper('Adapter suspend resume test')
def sa_adapter_suspend_resume_test(self):
"""Test dapter power states is perserved through suspend resume."""
def adapter_on_SR_test():
"""Test Case: Power on - SR"""
self.test_power_on_adapter()
self.test_bluetoothd_running()
self.suspend_resume()
self.test_bluetoothd_running()
self.test_adapter_work_state()
self.test_power_on_adapter()
def adapter_off_SR_test():
"""Test Case: Power off - SR"""
self.test_power_off_adapter()
self.test_bluetoothd_running()
self.suspend_resume()
self.test_power_off_adapter()
self.test_bluetoothd_running()
adapter_on_SR_test()
adapter_off_SR_test()
@test_wrapper('Adapter present test')
def sa_adapter_present_test(self):
"""Verify that the client has a Bluetooth adapter."""
# Reset the adapter (if any) to the powered off state.
self.test_reset_off_adapter()
# Verify that there is an adapter. This will only return True if both
# the kernel and bluetooth daemon see the adapter.
self.test_has_adapter()
@test_wrapper('Adapter reboot test')
def sa_adapter_reboot_test(self):
"""Verify that adapter power setting persist over reboot
Test whether power setting persist after a reboot and whether
adapter can be turned on after reboot
"""
def test_case_adapter_on_reboot():
"""Test Case: Power on - reboot"""
self.test_power_on_adapter()
self.test_bluetoothd_running()
self.reboot()
self.test_bluetoothd_running()
self.test_adapter_work_state()
def test_case_adapter_off_reboot():
"""Test Case: Power on - reboot"""
self.test_power_off_adapter()
self.test_bluetoothd_running()
self.reboot()
self.test_has_adapter()
self.test_is_powered_off()
self.test_power_on_adapter()
self.test_bluetoothd_running()
NUM_ITERATIONS = 3
for i in range(NUM_ITERATIONS):
logging.debug('Starting reboot test loop number #%d', i)
test_case_adapter_on_reboot()
test_case_adapter_off_reboot()
# TODO(b/145302986): Silencing known firmware issue with AC7260 (WP2)
@test_wrapper('Adapter DiscoverableTimeout test',
skip_chipsets=['Intel-AC7260'])
def sa_adapter_discoverable_timeout_test(self):
"""Verify that DiscoverableTimout Property works."""
result = self.test_discoverable_timeout(timeout_values=[0, 7, 15])
logging.info("Result is %s", result)
@test_wrapper('Adapter PairableTimeout test')
def sa_adapter_pairable_timeout_test(self):
"""Verify that PairableTimout Property works."""
result = self.test_pairable_timeout(timeout_values=[0, 7, 15])
logging.info("Result is %s", result)
@test_wrapper('Default state test')
def sa_default_state_test(self):
"""Verify that the Bluetooth adapter has correct state."""
self.default_state_test()
@test_wrapper('Valid address test')
def sa_valid_address_test(self):
"""Verify that the client Bluetooth adapter has a valid address."""
self.valid_address_test()
@test_wrapper('Valid adapter ID test')
def sa_valid_id_test(self):
"""Verify that the adapter has a correctly-formatted ID"""
self.test_check_valid_adapter_id()
@test_wrapper('Valid adapter alias test')
def sa_valid_alias_test(self):
"""Verify that the adapter has a correctly-formatted alias"""
self.test_check_valid_alias()
@test_wrapper('DBUS API tests')
def sa_dbus_api_tests(self):
""" Verify that the Bluetooth DBus API calls work."""
self.test_dbus_start_discovery_success()
self.test_dbus_start_discovery_fail_discovery_in_progress()
self.test_dbus_start_discovery_fail_power_off()
self.test_dbus_stop_discovery_success()
self.test_dbus_stop_discovery_fail_discovery_not_in_progress()
self.test_dbus_stop_discovery_fail_power_off()
self.test_dbus_get_supported_capabilities_success()
self.test_dbus_get_supported_capabilities_success_power_off()
@test_wrapper('EIR Max Alias Size test')
def sa_eir_max_name_size_test(self):
""" Verify that the non-default max eir name size is used """
EIR_80_char_name = ('1234567890123456789012345678901234567890'
'1234567890123456789012345678901234567890')
self.test_set_adapter_alias(EIR_80_char_name)
@batch_wrapper('Stand Alone Health')
def sa_health_batch_run(self, num_iterations=1, test_name=None):
"""Run the stand alone health test batch or a specific given test.
The wrapper of this method is implemented in batch_decorator.
Using the decorator a test batch method can implement the only its
core tests invocations and let the decorator handle the wrapper,
which is taking care for whether to run a specific test or the
batch as a whole, and running the batch in iterations
@param num_iterations: how many interations to run
@param test_name: specifc test to run otherwise None to run the
whole batch
"""
self.sa_basic_test()
self.sa_adapter_suspend_resume_test()
self.sa_adapter_present_test()
# self.sa_adapter_reboot_test() disabled since the test is not stable
self.sa_adapter_discoverable_timeout_test()
self.sa_default_state_test()
self.sa_valid_address_test()
self.sa_dbus_api_tests()
def run_once(self, host, num_iterations=1, 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
"""
# Initialize and run the test batch or the requested specific test
self.quick_test_init(host, use_btpeer=False, flag=flag,
start_browser=False)
self.sa_health_batch_run(num_iterations, test_name)
self.quick_test_cleanup()