普通文本  |  119行  |  4.9 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
import os

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
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.
    _NO_TOUCHPAD_WAKE = ['clapper', 'glimmer', 'veyron_minnie']

    # 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', 'sumo', 'ultima']

    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):
        """Entry point of this test."""
        # Check that touchpad is a wake source for all but the excepted boards.
        if (self._has_touchpad and
            self._platform not in self._INVALID_TOUCHPADS):
            if self._platform in self._NO_TOUCHPAD_WAKE:
                if self._is_wake_source('touchpad'):
                    raise error.TestFail('Touchpad is a wake source!')
            else:
                if not self._is_wake_source('touchpad'):
                    raise error.TestFail('Touchpad is not a wake source!')

        # Check that touchscreen is not a wake source (if present).
        # Devices without a touchpad should have touchscreen as wake source.
        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!')