141 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.9 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
 | |
| import os
 | |
| 
 | |
| from autotest_lib.client.bin import utils
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.client.common_lib.cros import cros_config
 | |
| from autotest_lib.client.cros import touch_playback_test_base
 | |
| 
 | |
| 
 | |
| class touch_WakeupSource(touch_playback_test_base.touch_playback_test_base):
 | |
|     """Check that touchpad/touchscreen are set/not set as wake sources."""
 | |
|     version = 1
 | |
| 
 | |
|     # Devices whose touchpads should not be a wake source.
 | |
|     #
 | |
|     # Note, starting with octopus platform, convertibles should enable touchpad
 | |
|     # wake.  If you  wish to enable on previous devices, see furquan@ doc
 | |
|     # go/cros-trackpad-wake and/or consult chromeos-platform-power@ for more
 | |
|     # details.
 | |
|     _NO_TOUCHPAD_WAKE = [
 | |
|             'caroline', 'clapper', 'elm', 'glimmer', 'hana', 'kevin', 'kukui',
 | |
|             'pyro', 'veyron_minnie'
 | |
|     ]
 | |
|     _TOUCHPAD_WAKE_SET_BY_CROS_CONFIG = ['coral', 'nami']
 | |
| 
 | |
|     # Devices with Synaptics touchpads that do not report wake source,
 | |
|     # or reference platforms like Rambi which are broken but do not ship,
 | |
|     # or devices like Cyan which don't report this way: crosbug.com/p/46019.
 | |
|     _INVALID_TOUCHPADS = ['x86-alex', 'x86-alex_he', 'x86-zgb', 'x86-zgb_he',
 | |
|                           'x86-mario', 'stout', 'rambi', 'cyan']
 | |
|     _INVALID_TOUCHSCREENS = ['cyan', 'nocturne', 'sumo', 'ultima']
 | |
| 
 | |
|     def _touchpad_should_be_wake_source(self):
 | |
|         base_platform = self._platform.replace('-kernelnext', '')
 | |
|         if base_platform in self._NO_TOUCHPAD_WAKE:
 | |
|             return False
 | |
|         if (base_platform in self._TOUCHPAD_WAKE_SET_BY_CROS_CONFIG
 | |
|                     and cros_config.call_cros_config_get_output(
 | |
|                             '/power touchpad-wakeup', utils.run) == '0'):
 | |
|             return False
 | |
|         return True
 | |
| 
 | |
|     def _find_wakeup_file(self, input_type):
 | |
|         """Return path to wakeup file or None.
 | |
| 
 | |
|         If the file does not exist, check the parent bus for wakeup rules
 | |
|         as well, as is the setup for some devices.
 | |
| 
 | |
|         @param input_type: e.g. 'touchpad' or 'mouse'. See parent class for
 | |
|                 all options.
 | |
| 
 | |
|         @raises: TestError if input_type lacks required information.
 | |
| 
 | |
|         """
 | |
|         device_dir = self.player.devices[input_type].device_dir
 | |
|         if not device_dir:
 | |
|             raise error.TestError('No device directory for %s!' % input_type)
 | |
| 
 | |
|         filename = os.path.join(device_dir, 'power', 'wakeup')
 | |
|         if not os.path.isfile(filename):
 | |
|             logging.info('%s not found for %s', filename, input_type)
 | |
| 
 | |
|             # Look for wakeup file on parent bus instead.
 | |
|             event = self.player.devices[input_type].node.split('/')[-1]
 | |
| 
 | |
|             parent = None
 | |
|             i2c_devices_dir = os.path.join('/', 'sys', 'bus', 'i2c', 'devices')
 | |
|             for device_dir in os.listdir(i2c_devices_dir):
 | |
|                 event_search = os.path.join(i2c_devices_dir, device_dir, '*',
 | |
|                                             'input', 'input*', event)
 | |
|                 match_count = utils.run('ls %s 2>/dev/null | wc -l' % (
 | |
|                         event_search)).stdout.strip()
 | |
|                 if int(match_count) > 0:
 | |
|                     parent = os.path.join(i2c_devices_dir, device_dir)
 | |
|                     break
 | |
|             if parent is None:
 | |
|                 logging.info('Could not find parent bus for %s.', input_type)
 | |
|                 return None
 | |
| 
 | |
|             logging.info('Parent bus of %s is %s.', input_type, parent)
 | |
|             filename = os.path.join(parent, 'power', 'wakeup')
 | |
|             if not os.path.isfile(filename):
 | |
|                 logging.info('%s not found either.', filename)
 | |
|                 return None
 | |
| 
 | |
|         return filename
 | |
| 
 | |
|     def _is_wake_source(self, input_type):
 | |
|         """Return True if the given device is a wake source, else False.
 | |
| 
 | |
|         If the file does not exist, return False.
 | |
| 
 | |
|         @param input_type: e.g. 'touchpad' or 'mouse'. See parent class for
 | |
|                 all options.
 | |
| 
 | |
|         @raises: TestError if test cannot interpret the file contents.
 | |
| 
 | |
|         """
 | |
|         filename = self._find_wakeup_file(input_type)
 | |
|         if filename is None:
 | |
|             return False
 | |
| 
 | |
|         result = utils.run('cat %s' % filename).stdout.strip()
 | |
|         if result == 'enabled':
 | |
|             logging.info('Found that %s is a wake source.', input_type)
 | |
|             return True
 | |
|         elif result == 'disabled':
 | |
|             logging.info('Found that %s is not a wake source.', input_type)
 | |
|             return False
 | |
|         raise error.TestError('Wakeup file for %s said "%s".' %
 | |
|                               (input_type, result))
 | |
| 
 | |
|     def run_once(self, source):
 | |
|         """Entry point of this test."""
 | |
| 
 | |
|         # Check that touchpad is a wake source for all but the excepted boards.
 | |
|         if source == 'touchpad':
 | |
|             if (self._has_touchpad and
 | |
|                 self._platform not in self._INVALID_TOUCHPADS):
 | |
|                 if self._touchpad_should_be_wake_source():
 | |
|                     if not self._is_wake_source('touchpad'):
 | |
|                         raise error.TestFail('Touchpad is not a wake source!')
 | |
|                 else:
 | |
|                     if self._is_wake_source('touchpad'):
 | |
|                         raise error.TestFail('Touchpad is a wake source!')
 | |
| 
 | |
|         # Check that touchscreen is not a wake source (if present).
 | |
|         # Devices without a touchpad should have touchscreen as wake source.
 | |
|         if source == 'touchscreen':
 | |
|             if (self._has_touchscreen and
 | |
|                 self._platform not in self._INVALID_TOUCHSCREENS):
 | |
|                 touchscreen_wake = self._is_wake_source('touchscreen')
 | |
|                 if self._has_touchpad and touchscreen_wake:
 | |
|                     raise error.TestFail('Touchscreen is a wake source!')
 | |
|                 if not self._has_touchpad and not touchscreen_wake:
 | |
|                     raise error.TestFail('Touchscreen is not a wake source!')
 |