72 lines
2.4 KiB
Python
72 lines
2.4 KiB
Python
# Copyright (c) 2014 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.
|
|
|
|
import logging
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.cros.bluetooth import bluetooth_semiauto_helper
|
|
|
|
|
|
class bluetooth_AdapterHealth(
|
|
bluetooth_semiauto_helper.BluetoothSemiAutoHelper):
|
|
"""Checks whether the Bluetooth adapter is present and working."""
|
|
version = 1
|
|
|
|
def _find_kernel_errors(self):
|
|
"""Fail test for any suspicious log entries from kernel.
|
|
|
|
Ignore some known errors in order to find new ones.
|
|
|
|
"""
|
|
fail_terms = ['[^a-z]err[^a-z]']
|
|
ignore_terms = ['RFKILL control',
|
|
'"Service Changed" characteristic',
|
|
'Unknown Evt ID: 19',
|
|
'Failed to set privacy: Rejected']
|
|
|
|
log_cmd = 'grep -i bluetooth /var/log/messages'
|
|
for term in ignore_terms:
|
|
log_cmd += ' | grep -v \'%s\'' % term
|
|
|
|
for term in fail_terms:
|
|
search_cmd = '%s | grep -i \'%s\'' % (log_cmd, term)
|
|
log_entries = utils.run(search_cmd, ignore_status=True).stdout
|
|
if len(log_entries) > 0:
|
|
log_entries = [l for l in log_entries.split('\n') if l != '']
|
|
logging.info(log_entries)
|
|
self.collect_logs('Bluetooth kernel error')
|
|
|
|
# Add snippet of the log to the error message
|
|
# unless there are many errors (>5)
|
|
# This is helpful when looking at stainless results
|
|
error_str = 'Bluetooth kernel error found!'
|
|
if len(log_entries) <= 5:
|
|
error_str = error_str + ' | '
|
|
for l in log_entries:
|
|
error_str = error_str + l.split('ERR')[1] + ' | '
|
|
|
|
raise error.TestFail(error_str)
|
|
|
|
def warmup(self):
|
|
"""Overwrite parent warmup; no need to log in."""
|
|
pass
|
|
|
|
def run_once(self):
|
|
"""Entry point of this test."""
|
|
if not self.supports_bluetooth():
|
|
return
|
|
|
|
# Start btmon running.
|
|
self.start_dump()
|
|
|
|
self.poll_adapter_presence()
|
|
|
|
# Enable then disable adapter.
|
|
self.set_adapter_power(True)
|
|
self.set_adapter_power(False)
|
|
|
|
# Check for errors in logs.
|
|
self._find_kernel_errors()
|