# 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.
    #
    # 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 = ['clapper', 'glimmer', 'veyron_minnie', 'caroline',
                         'eve', 'kevin', 'pyro']

    # 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!')

