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