#!/usr/bin/env python
#
# Copyright (c) 2012 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 re

from subprocess import Popen, PIPE

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error

# Keys for udev db
KEY_NAME = 'NAME'
KEY_DEVPATH = 'DEVPATH'
KEY_ID_INPUT_TOUCHPAD = 'ID_INPUT_TOUCHPAD'

# True equivalences
TRUE_EQ = ['1', 'on', 'true', 'yes']

# Regular expressions for cmt module related log
UNLOAD_CMT_RE = r'UnloadModule.*cmt'
USE_CMT_RE = r'Using input driver.*cmt.*%s'

# Path to xorg log
XORG_LOG_PATH = '/var/log/Xorg.0.log'


class hardware_TrackpadFunction(test.test):
    '''Test to make sure trackpad functions correctly'''
    version = 1

    def udev_from_string(self, device_string):
        # Sample lines:
        # P: /devices/LNXSYSTM:00/LNXPWRBN:00
        # E: UDEV_LOG=3
        # E: DEVPATH=/devices/LNXSYSTM:00/LNXPWRBN:00
        properties = {}
        for line in device_string.split('\n'):
            _, _, val = line.partition(': ')
            args = val.partition('=')
            if args[1] != '':
                properties[args[0]] = args[2]
        return properties

    def udevadm_export_db(self):
        p = Popen('udevadm info --export-db', shell=True, stdout=PIPE)
        output = p.communicate()[0]
        devs = output.split('\n\n')
        return [self.udev_from_string(dev) for dev in devs]

    def run_once(self):
        devices = self.udevadm_export_db()
        named_devices = [dev for dev in devices if KEY_NAME in dev]

        touchpad_devices = []
        for named_device in named_devices:
            dev_path = named_device.get(KEY_DEVPATH)
            for dev in devices:
                # Use device path prefix match to examine if a named device is
                # touchpad or not.
                #
                # Example of named device data:
                #
                # P: /devices/platform/i8042/serio4/input/input6
                # E: UDEV_LOG=3
                # E: DEVPATH=/devices/platform/i8042/serio4/input/input6
                # E: PRODUCT=11/2/7/1b1
                # E: NAME="SynPS/2 Synaptics TouchPad"
                # E: PHYS="isa0060/serio4/input0"
                #
                # Example of the data whose DEVPATH prefix matches the DEVPATH
                # above and ID_INPUT_TOUCHPAD is true.
                #
                # P: /devices/platform/i8042/serio4/input/input6/event6
                # N: input/event6
                # S: input/by-path/platform-i8042-serio-4-event-mouse
                # E: UDEV_LOG=3
                # E: DEVPATH=/devices/platform/i8042/serio4/input/input6/event6
                # E: MAJOR=13
                # E: MINOR=70
                # E: DEVNAME=/dev/input/event6
                # E: SUBSYSTEM=input
                # E: ID_INPUT=1
                # E: ID_INPUT_TOUCHPAD=1
                if (dev.get(KEY_DEVPATH, '').find(dev_path) == 0 and
                        dev.get(KEY_ID_INPUT_TOUCHPAD, '') in TRUE_EQ):
                    touchpad_devices.append(named_device)
        if touchpad_devices:
            loaded = False
            for touchpad_device in touchpad_devices:
                name = touchpad_device.get(KEY_NAME).strip('"')
                with open(XORG_LOG_PATH, 'r') as f:
                    for line in f.readlines():
                        if re.search(USE_CMT_RE % name, line, re.I):
                            logging.info('cmt loaded: %s' % line)
                            loaded = True
                        if re.search(UNLOAD_CMT_RE, line, re.I):
                            loaded = False
                            break

                if not loaded:
                    raise error.TestFail('cmt did not load for %s' % name)
        else:
            # TODO: when touchpad_devices is empty we should check the board
            # to see if it's expected.
            logging.info('no trackpad found')
