| # 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_AdapterSanity( |
| 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() |