| Index: client/bin/factory_ui_lib.py
|
| diff --git a/client/bin/factory_ui_lib.py b/client/bin/factory_ui_lib.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..07cdde7e581ee365c1e0e4ea6827dc200e488382
|
| --- /dev/null
|
| +++ b/client/bin/factory_ui_lib.py
|
| @@ -0,0 +1,110 @@
|
| +# 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 :
|
| +#
|
| +# This library provides convenience routines to launch factory tests.
|
| +# This includes support for identifying keyboard test switching
|
| +# triggers, grabbing control of the keyboard and mouse, and making the
|
| +# mouse cursor disappear. It also manages communication of any found
|
| +# keyboard triggers to the control process, via writing data to
|
| +# _result_file_path.
|
| +
|
| +
|
| +from autotest_lib.client.bin import factory
|
| +from autotest_lib.client.common_lib import error
|
| +
|
| +import gtk
|
| +import sys
|
| +
|
| +
|
| +BLACK = gtk.gdk.Color()
|
| +RED = gtk.gdk.Color(0xFFFF, 0, 0)
|
| +GREEN = gtk.gdk.Color(0, 0xFFFF, 0)
|
| +BLUE = gtk.gdk.Color(0, 0, 0xFFFF)
|
| +WHITE = gtk.gdk.Color(0xFFFF, 0xFFFF, 0xFFFF)
|
| +
|
| +LIGHT_GREEN = gtk.gdk.color_parse('light green')
|
| +
|
| +ACTIVE = 'ACTIVE'
|
| +PASSED = 'PASS'
|
| +FAILED = 'FAIL'
|
| +UNTESTED = 'UNTESTED'
|
| +
|
| +STATUS_CODE_MAP = {
|
| + 'START': ACTIVE,
|
| + 'GOOD': PASSED,
|
| + 'FAIL': FAILED,
|
| + 'ERROR': FAILED}
|
| +
|
| +LABEL_COLORS = {
|
| + ACTIVE: gtk.gdk.color_parse('light goldenrod'),
|
| + PASSED: gtk.gdk.color_parse('pale green'),
|
| + FAILED: gtk.gdk.color_parse('tomato'),
|
| + UNTESTED: gtk.gdk.color_parse('dark slate grey')}
|
| +
|
| +
|
| +class State:
|
| +
|
| + def __init__(self, trigger_set=set(), result_file_path=None):
|
| + self._got_trigger = None
|
| + self._result_file_path = result_file_path
|
| + self._trigger_set = [ord(x) for x in trigger_set]
|
| +
|
| + def exit_on_trigger(self, event):
|
| + char = event.keyval in range(32,127) and chr(event.keyval) or None
|
| + if ('GDK_CONTROL_MASK' not in event.state.value_names
|
| + or event.keyval not in self._trigger_set):
|
| + return False
|
| + factory.log('got test switch trigger %s(%s)' % (event.keyval, char))
|
| + self._got_trigger = char
|
| + gtk.main_quit()
|
| + return True
|
| +
|
| + def run_test_widget(self,
|
| + test_widget=None,
|
| + test_widget_size=None,
|
| + invisible_cursor=True,
|
| + window_registration_callback=None,
|
| + cleanup_callback=None):
|
| +
|
| + window = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
| + window.modify_bg(gtk.STATE_NORMAL, BLACK)
|
| + window.set_size_request(*test_widget_size)
|
| +
|
| + align = gtk.Alignment(xalign=0.5, yalign=0.5)
|
| + align.add(test_widget)
|
| +
|
| + window.add(align)
|
| + window.show_all()
|
| +
|
| + gtk.gdk.pointer_grab(window.window, confine_to=window.window)
|
| + gtk.gdk.keyboard_grab(window.window)
|
| +
|
| + if invisible_cursor:
|
| + pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
|
| + color = gtk.gdk.Color()
|
| + cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
|
| + window.window.set_cursor(cursor)
|
| +
|
| + if window_registration_callback is not None:
|
| + window_registration_callback(window)
|
| +
|
| + factory.log('factory_test running gtk.main')
|
| + gtk.main()
|
| + factory.log('factory_test quit gtk.main')
|
| +
|
| + if cleanup_callback is not None:
|
| + cleanup_callback()
|
| +
|
| + gtk.gdk.pointer_ungrab()
|
| + gtk.gdk.keyboard_ungrab()
|
| +
|
| + if self._got_trigger is None:
|
| + return
|
| + with open(self._result_file_path, 'w') as file:
|
| + file.write('%s\n' % repr(self._got_trigger))
|
| + raise error.TestFail('explicit test switch triggered (%s)' %
|
| + self._got_trigger)
|
|
|