普通文本  |  59行  |  1.85 KB

# 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']

        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.split('\n')
                logging.info(log_entries)
                self.collect_logs('Bluetooth kernel error')
                raise error.TestFail('Bluetooth kernel error found!')

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