blob: 37a04c9a4bc27b3e6311240463cda3ae9e0da3c1 [file] [log] [blame]
# Copyright (c) 2011 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
import re
import urllib
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_ui_test, httpd
def mygrep(fname, substring):
lines = []
for line in open(fname, 'rt'):
if substring in line.lower():
lines.append(line)
return lines
class desktopui_TouchScreen(cros_ui_test.UITest):
"""Replay raw touch gestures and check how the browser interprets them.
This test runs a series of HTML/JS test pages (somewhat similar to WebKit
layout tests). Each HTML page asks to replay a recording of touch screen
gesture(s) and then reports whether the observed results were as expected.
"""
version = 1
def initialize(self, creds='$default', testfile="example.html"):
# Check if the device file is grabbed by X.
grab_lines = mygrep( '/etc/X11/xorg.conf.d/60-touchscreen-mxt.conf',
'GrabDevice' )
if len(grab_lines) > 0 and 'true' in grab_lines[0]:
logging.warning('Looks like the device file is grabbed by the X')
# Find out the touch device file name.
touch_text = ''.join(mygrep('/var/log/Xorg.0.log', 'touch' ))
m = re.search(r'/dev/input/event\d+', touch_text)
if not m:
raise error.TestError(
'Could not figure out the touch device name /dev/input/event?')
self.touch_dev = m.group(0)
msg = 'Found %s to be the touch device based on Xorg log file'
logging.info(msg % self.touch_dev)
self.testfile = testfile
self.timeout = 120 #[sec] time to wait for each subtest to complete
self.port = 8000
tests_dir = 'tests'
self.tests_dir = os.path.join(self.bindir, tests_dir)
self.test_url = 'http://localhost:%s/%s/' % (self.port, tests_dir)
self.gestures_dir = os.path.join(self.bindir, 'gestures')
self.reported_status = None
self._testServer = httpd.HTTPListener(self.port, docroot=self.bindir)
self._testServer.add_url_handler('/replay', self.replay_url_handler)
self._testServer.add_url_handler('/msg', self.msg_url_handler)
self._testServer.add_url_handler('/done', self.done_url_handler)
# Fire up the web server thread.
self._testServer.run()
super(desktopui_TouchScreen, self).initialize(creds)
def replay_gesture(self, gesture_file):
logging.info('Replaying gesture file: %s' % gesture_file)
utils.system(
'/usr/local/bin/evemu-play %s < %s/%s' %
(self.touch_dev, self.gestures_dir, gesture_file))
def replay_url_handler(self, fh, form):
gestures = urllib.unquote(form['gesture'].value).split()
for gesture in gestures:
self.replay_gesture(gesture + '.dat')
fh.write_post_response(form)
def msg_url_handler(self, fh, form):
msg = urllib.unquote(form['msg'].value)
logging.info(msg)
fh.write_post_response(form)
def done_url_handler(self, fh, form):
self.reported_status = form['status'].value
fh.write_post_response(form)
def run_subtest(self, test_name):
self.reported_status = None
self.pyauto.NavigateToURL(self.test_url + test_name)
latch = self._testServer.add_wait_url('/done')
latch.wait(self.timeout)
msg = "'%s' reported by %s" % (self.reported_status, test_name)
if not latch.is_set():
logging.error('Timed out waiting for %s test to report status.' %
test_name)
elif self.reported_status != 'PASS':
logging.error(msg)
else:
logging.info(msg)
return self.reported_status
def run_once(self):
logging.info('Running HTML test %s' % self.testfile)
result = self.run_subtest(self.testfile)
if result != 'PASS':
raise error.TestFail('HTML test %s did not pass.'
% self.testfile)