| Index: client/site_tests/factory_Keyboard/KeyboardTest.py
|
| diff --git a/client/site_tests/factory_Keyboard/KeyboardTest.py b/client/site_tests/factory_Keyboard/KeyboardTest.py
|
| deleted file mode 100644
|
| index c858e9dcd21f26c8d1542552d91333a3959e7bb1..0000000000000000000000000000000000000000
|
| --- a/client/site_tests/factory_Keyboard/KeyboardTest.py
|
| +++ /dev/null
|
| @@ -1,159 +0,0 @@
|
| -#!/usr/bin/python
|
| -#
|
| -# Copyright (c) 2010 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.
|
| -
|
| -
|
| -# DESCRIPTION :
|
| -#
|
| -# Intended for use during manufacturing to validate that all keyboard
|
| -# keys function properly. This program will display a keyboard image
|
| -# and keys will be highlighted as they are pressed and released. Once
|
| -# all keys have been used, a brief 'PASS' message will be displayed
|
| -# and the test will terminate. After the first key is hit, a
|
| -# countdown will begin. If not all keys are used in time, the test
|
| -# will fail with an 'ERROR' message that is displayed forever.
|
| -
|
| -
|
| -from autotest_lib.client.common_lib import factory_test
|
| -
|
| -import cairo
|
| -import gobject
|
| -import gtk
|
| -import logging
|
| -import pango
|
| -import time
|
| -import os
|
| -import sys
|
| -
|
| -
|
| -def XXX_log(s):
|
| - print >> sys.stderr, '--- XXX : ' + s
|
| -
|
| -
|
| -# How long keyboard_test allows in seconds from the first keypress
|
| -# until defaulting to the failure condition.
|
| -_TIMEOUT = 50
|
| -_PASS_TIMEOUT = 0.4
|
| -
|
| -# Highlight color and alpha to indicate activated keys.
|
| -_RGBA_PRESS_AND_RELEASE = ( 0, 0.5, 0, 0.6)
|
| -_RGBA_PRESS_ONLY = (0.6, 0.6, 0, 0.6)
|
| -
|
| -
|
| -class keyboard_test:
|
| -
|
| - def __init__(self, kbd_image, bindings):
|
| - self._bindings = bindings
|
| - self._kbd_image = kbd_image
|
| - self._pressed_keys = set()
|
| - self._successful_keys = set()
|
| - self._deadline = None
|
| - self._success = False
|
| -
|
| - def show_countdown(self, widget, context):
|
| - countdown = self._deadline - int(time.time())
|
| - width, height = widget.get_size_request()
|
| - text = '%3d' % countdown
|
| - context.save()
|
| - context.translate(width - 60, height)
|
| - context.set_source_rgb(0.5, 0.5, 0.5)
|
| - context.select_font_face(
|
| - 'Courier New', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
|
| - context.set_font_size(20)
|
| - x_bearing, y_bearing = context.text_extents('000')[:2]
|
| - context.move_to(x_bearing, y_bearing)
|
| - context.show_text(text)
|
| - context.restore()
|
| -
|
| - def timer_event(self, window):
|
| - if not self._deadline:
|
| - # Ignore timer events with no countdown in progress.
|
| - return True
|
| - if self._deadline <= time.time():
|
| - XXX_log('deadline reached')
|
| - gtk.main_quit()
|
| - window.queue_draw()
|
| - return True
|
| -
|
| - def expose_event(self, widget, event):
|
| - context = widget.window.cairo_create()
|
| -
|
| - # Show keyboard image as the background.
|
| - context.set_source_surface(self._kbd_image, 0, 0)
|
| - context.paint()
|
| -
|
| - for key in self._successful_keys:
|
| - coords = self._bindings[key]
|
| - context.rectangle(*coords)
|
| - context.set_source_rgba(*_RGBA_PRESS_AND_RELEASE)
|
| - context.fill()
|
| - for key in self._pressed_keys:
|
| - coords = self._bindings[key]
|
| - context.rectangle(*coords)
|
| - context.set_source_rgba(*_RGBA_PRESS_ONLY)
|
| - context.fill()
|
| - if self._deadline:
|
| - self.show_countdown(widget, context)
|
| -
|
| - return True
|
| -
|
| - def key_press_event(self, widget, event):
|
| - if factory_test.test_switch_on_trigger(event):
|
| - return True
|
| - if ('GDK_MOD1_MASK' in event.state.value_names
|
| - and event.keyval == gtk.keysyms.q):
|
| - # Alt-q for early exit.
|
| - gtk.main_quit()
|
| - return True
|
| - if event.keyval in self._successful_keys:
|
| - # Ignore keys already found to work successfully.
|
| - return True
|
| - if event.state != 0:
|
| - XXX_log('key (0x%x) ignored because modifier applied (state=%d)'
|
| - % (event.keyval, event.state))
|
| - return True
|
| - if event.keyval not in self._bindings:
|
| - XXX_log('key (0x%x) ignored because not in bindings' % event.keyval)
|
| - return True
|
| -
|
| - self._pressed_keys.add(event.keyval)
|
| - widget.queue_draw()
|
| -
|
| - # The first keypress starts test countdown.
|
| - if self._deadline is None:
|
| - self._deadline = int(time.time()) + _TIMEOUT
|
| -
|
| - return True
|
| -
|
| - def key_release_event(self, widget, event):
|
| - if event.keyval not in self._pressed_keys:
|
| - # Ignore releases for keys not previously accepted as pressed.
|
| - return False
|
| - self._pressed_keys.remove(event.keyval)
|
| - self._successful_keys.add(event.keyval)
|
| - if not (set(self._bindings) - self._successful_keys):
|
| - self._success = True
|
| - self._deadline = int(time.time()) + _PASS_TIMEOUT
|
| - widget.queue_draw()
|
| - return True
|
| -
|
| - def register_callbacks(self, window):
|
| - window.connect('key-press-event', self.key_press_event)
|
| - window.connect('key-release-event', self.key_release_event)
|
| - window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
|
| -
|
| -
|
| -def make_test_widget(kbd_image, bindings):
|
| - test = keyboard_test(kbd_image, bindings)
|
| -
|
| - image_size = (kbd_image.get_width(), kbd_image.get_height())
|
| -
|
| - drawing_area = gtk.DrawingArea()
|
| - drawing_area.set_size_request(*image_size)
|
| - drawing_area.connect('expose_event', test.expose_event)
|
| - drawing_area.add_events(gtk.gdk.EXPOSURE_MASK)
|
| - gobject.timeout_add(1000, test.timer_event, drawing_area)
|
| -
|
| - return drawing_area, test.register_callbacks
|
|
|