# Copyright (c) 2009 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, string, time, utils, os, subprocess
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_logging, cros_ui_test
import pprint

class platform_TrackpadStress(test.test):
    version = 1


    def run_once(self, verify_only=False):
        log_reader = cros_logging.LogReader(include_rotated_logs=False)
        log_reader.set_start_by_reboot(-1)

        # Verify the synaptics kernel driver successfully probed the trackpad
        check_string = 'psmouse serio2: synaptics: Touchpad model: 1, fw:'
        if not log_reader.can_find(check_string):
            raise error.TestFail('Pre-check 1: Unable to locate trackpad '
                                 'logging string: %s' % check_string)

        for line in log_reader.read_all_logs():
            if line.find(check_string) != -1 and line.find('0x0/0x0') == 0:
                # If 0x0/0x0 exists in the caps string, then this signals that
                # the device is stuck in its bootloader
                raise error.TestFail('Pre-check 1a: It appears the trackpad is '
                                     'stuck in the bootloader.  Complete caps '
                                     'string:\n%s' % caps_string)

        check_string = 'input: SynPS/2 Synaptics TouchPad as'
        if not log_reader.can_find(check_string):
            raise error.TestFail('Pre-check 2: Unable to locate trackpad '
                                 'logging string: %s' % check_string)

        if verify_only:
            self.job.set_state('client_passed', True)
            return

        bpath = os.path.abspath(__file__)
        forever_script = os.path.join(os.path.dirname(bpath), 'forever.py')

        pid_file_path = '/tmp/fork_process_pid.txt'
        if os.path.isfile(pid_file_path) == True:
            os.remove(pid_file_path)
        process = subprocess.Popen(['/usr/local/bin/python', forever_script,
                                    '-f', pid_file_path], shell=False,
                                   env=None)

        logging.info('Waiting for forever script to create pid file.')
        counter = 0
        while (os.path.isfile(pid_file_path) == False and counter < 30):
            time.sleep(1)
            counter = counter + 1
        if os.path.isfile(pid_file_path) == False:
            raise error.TestFail('The forever script did not create a pid file.'
                                 'It must not have started up.  Checking path: '
                                 '%s' % pid_file_path)
        with open(pid_file_path, 'r') as f:
            pid = f.readline()
        try:
            os.kill(int(pid), 0)
        except OSError:
            raise error.TestFail('The forever script process id: %s cannot be '
                                 'found.' % pid.rstrip('\n'))

        self.job.set_state('client_passed', True)

