Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(855)

Side by Side Diff: client/site_tests/factory_Display/factory_Display.py

Issue 2805052: Relocate library files for wider access and re-use; also associated cleanup. (Closed) Base URL: ssh://gitrw.chromium.org/autotest.git
Patch Set: address nicks comment Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 5
6 # DESCRIPTION : 6 # DESCRIPTION :
7 # 7 #
8 # This is an example factory test that does not really do anything -- 8 # This is an example factory test that does not really do anything --
9 # it displays a message in the center of the testing area, as 9 # it displays a message in the center of the testing area, as
10 # communicated by arguments to run_once(). This test makes use of the 10 # communicated by arguments to run_once(). This test makes use of the
11 # factory_test library to display its UI, and to monitor keyboard 11 # factory_test library to display its UI, and to monitor keyboard
12 # events for test-switching triggers. This test can be terminated by 12 # events for test-switching triggers. This test can be terminated by
13 # typing SHIFT-Q. 13 # typing SHIFT-Q.
14 14
15 from autotest_lib.client.bin import test
16 from autotest_lib.client.common_lib import error
17 from autotest_lib.client.common_lib import factory_test
18 15
19 import gtk 16 import gtk
20 import pango 17 import pango
21 import os 18 import os
22 import sys 19 import sys
23 20
21 from autotest_lib.client.bin import factory
22 from autotest_lib.client.bin import factory_test as ft
23 from autotest_lib.client.bin import test
24 from autotest_lib.client.common_lib import error
24 25
25 def XXX_log(s):
26 print >> sys.stderr, 'FACTORY: ' + s
27
28
29 _BLACK = gtk.gdk.Color()
30 _RED = gtk.gdk.Color(0xFFFF, 0, 0)
31 _GREEN = gtk.gdk.Color(0, 0xFFFF, 0)
32 _BLUE = gtk.gdk.Color(0, 0, 0xFFFF)
33 _WHITE = gtk.gdk.Color(0xFFFF, 0xFFFF, 0xFFFF)
34
35 _ACTIVE = 'ACTIVE'
36 _PASSED = 'PASS'
37 _FAILED = 'FAIL'
38 _UNTESTED = 'UNTESTED'
39
40 _LABEL_COLORS = {
41 _ACTIVE: gtk.gdk.color_parse('light goldenrod'),
42 _PASSED: gtk.gdk.color_parse('pale green'),
43 _FAILED: gtk.gdk.color_parse('tomato'),
44 _UNTESTED: gtk.gdk.color_parse('dark slate grey')}
45 26
46 _LABEL_STATUS_SIZE = (140, 30) 27 _LABEL_STATUS_SIZE = (140, 30)
47 _LABEL_STATUS_FONT = pango.FontDescription('courier new condensed 16') 28 _LABEL_STATUS_FONT = pango.FontDescription('courier new condensed 16')
48 _LABEL_FONT = pango.FontDescription('courier new condensed 20') 29 _LABEL_FONT = pango.FontDescription('courier new condensed 20')
49 _LABEL_FG = gtk.gdk.color_parse('light green') 30 _LABEL_FG = gtk.gdk.color_parse('light green')
50 _LABEL_UNTESTED_FG = gtk.gdk.color_parse('grey40') 31 _LABEL_UNTESTED_FG = gtk.gdk.color_parse('grey40')
51 32
52 33
53 def pattern_cb_solid(widget, event, color=None): 34 def pattern_cb_solid(widget, event, color=None):
54 dr = widget.window 35 dr = widget.window
55 xmax, ymax = dr.get_size() 36 xmax, ymax = dr.get_size()
56 gc = gtk.gdk.GC(dr) 37 gc = gtk.gdk.GC(dr)
57 gc.set_rgb_fg_color(color) 38 gc.set_rgb_fg_color(color)
58 dr.draw_rectangle(gc, True, 0, 0, xmax, ymax) 39 dr.draw_rectangle(gc, True, 0, 0, xmax, ymax)
59 return False 40 return False
60 41
61 42
62 def pattern_cb_grid(widget, event, color=None): 43 def pattern_cb_grid(widget, event, color=None):
63 dr = widget.window 44 dr = widget.window
64 xmax, ymax = dr.get_size() 45 xmax, ymax = dr.get_size()
65 gc = gtk.gdk.GC(dr) 46 gc = gtk.gdk.GC(dr)
66 gc.set_rgb_fg_color(_BLACK) 47 gc.set_rgb_fg_color(ft.BLACK)
67 dr.draw_rectangle(gc, True, 0, 0, xmax, ymax) 48 dr.draw_rectangle(gc, True, 0, 0, xmax, ymax)
68 gc.set_rgb_fg_color(color) 49 gc.set_rgb_fg_color(color)
69 gc.set_line_attributes(1, 50 gc.set_line_attributes(1,
70 gtk.gdk.LINE_SOLID, 51 gtk.gdk.LINE_SOLID,
71 gtk.gdk.CAP_BUTT, 52 gtk.gdk.CAP_BUTT,
72 gtk.gdk.JOIN_MITER) 53 gtk.gdk.JOIN_MITER)
73 for x in range(0, xmax, 20): 54 for x in range(0, xmax, 20):
74 dr.draw_line(gc, x, 0, x, ymax) 55 dr.draw_line(gc, x, 0, x, ymax)
75 for y in range(0, ymax, 20): 56 for y in range(0, ymax, 20):
76 dr.draw_line(gc, 0, y, xmax, y) 57 dr.draw_line(gc, 0, y, xmax, y)
77 return False 58 return False
78 59
79 60
80 _PATTERN_LIST = [ 61 _PATTERN_LIST = [
81 ('solid red', lambda *x: pattern_cb_solid(*x, **{'color':_RED})), 62 ('solid red', lambda *x: pattern_cb_solid(*x, **{'color':ft.RED})),
82 ('solid green', lambda *x: pattern_cb_solid(*x, **{'color':_GREEN})), 63 ('solid green', lambda *x: pattern_cb_solid(*x, **{'color':ft.GREEN})),
83 ('solid blue', lambda *x: pattern_cb_solid(*x, **{'color':_BLUE})), 64 ('solid blue', lambda *x: pattern_cb_solid(*x, **{'color':ft.BLUE})),
84 ('solid white', lambda *x: pattern_cb_solid(*x, **{'color':_WHITE})), 65 ('solid white', lambda *x: pattern_cb_solid(*x, **{'color':ft.WHITE})),
85 ('grid', lambda *x: pattern_cb_grid(*x, **{'color':_GREEN}))] 66 ('grid', lambda *x: pattern_cb_grid(*x, **{'color':ft.GREEN}))]
86 67
87 68
88 class factory_Display(test.test): 69 class factory_Display(test.test):
89 version = 1 70 version = 1
90 71
91 def display_full_screen(self, pattern_callback): 72 def display_full_screen(self, pattern_callback):
92 window = gtk.Window(gtk.WINDOW_TOPLEVEL) 73 window = gtk.Window(gtk.WINDOW_TOPLEVEL)
93 screen = window.get_screen() 74 screen = window.get_screen()
94 screen_size = (screen.get_width(), screen.get_height()) 75 screen_size = (screen.get_width(), screen.get_height())
95 window.set_size_request(*screen_size) 76 window.set_size_request(*screen_size)
96 drawing_area = gtk.DrawingArea() 77 drawing_area = gtk.DrawingArea()
97 window.add(drawing_area) 78 window.add(drawing_area)
98 window.show_all() 79 window.show_all()
99 self._fs_window = window 80 self._fs_window = window
100 drawing_area.connect('expose_event', pattern_callback) 81 drawing_area.connect('expose_event', pattern_callback)
101 82
102 def goto_next_pattern(self): 83 def goto_next_pattern(self):
103 if not self._pattern_queue: 84 if not self._pattern_queue:
104 gtk.main_quit() 85 gtk.main_quit()
105 return 86 return
106 self._current_pattern = self._pattern_queue.pop() 87 self._current_pattern = self._pattern_queue.pop()
107 name, cb_fn = self._current_pattern 88 name, cb_fn = self._current_pattern
108 self._status_map[name] = _ACTIVE 89 self._status_map[name] = ft.ACTIVE
109 self._current_pattern_shown = False 90 self._current_pattern_shown = False
110 91
111 def key_press_callback(self, widget, event): 92 def key_press_callback(self, widget, event):
112 pattern_name, pattern_cb = self._current_pattern 93 pattern_name, pattern_cb = self._current_pattern
113 if event.keyval == gtk.keysyms.space and not self._fs_window: 94 if event.keyval == gtk.keysyms.space and not self._fs_window:
114 self.display_full_screen(pattern_cb) 95 self.display_full_screen(pattern_cb)
115 return True 96 return True
116 97
117 def key_release_callback(self, widget, event): 98 def key_release_callback(self, widget, event):
118 pattern_name, pattern_cb = self._current_pattern 99 pattern_name, pattern_cb = self._current_pattern
119 if event.keyval == gtk.keysyms.space and self._fs_window is not None: 100 if event.keyval == gtk.keysyms.space and self._fs_window is not None:
120 self._fs_window.destroy() 101 self._fs_window.destroy()
121 self._fs_window = None 102 self._fs_window = None
122 self._current_pattern_shown = True 103 self._current_pattern_shown = True
123 elif event.keyval == gtk.keysyms.Tab and self._current_pattern_shown: 104 elif event.keyval == gtk.keysyms.Tab and self._current_pattern_shown:
124 self._status_map[pattern_name] = _FAILED 105 self._status_map[pattern_name] = ft.FAILED
125 self.goto_next_pattern() 106 self.goto_next_pattern()
126 elif event.keyval == gtk.keysyms.Return and self._current_pattern_shown: 107 elif event.keyval == gtk.keysyms.Return and self._current_pattern_shown:
127 self._status_map[pattern_name] = _PASSED 108 self._status_map[pattern_name] = ft.PASSED
128 self.goto_next_pattern() 109 self.goto_next_pattern()
129 elif event.keyval == ord('Q'): 110 elif event.keyval == ord('Q'):
130 factory_test.XXX_log('factory_Display exiting...')
131 gtk.main_quit() 111 gtk.main_quit()
132 else: 112 else:
133 factory_test.test_switch_on_trigger(event) 113 self._ft_state.exit_on_trigger(event)
134 self._test_widget.queue_draw() 114 self._test_widget.queue_draw()
135 return True 115 return True
136 116
137 def label_status_expose(self, widget, event, name=None): 117 def label_status_expose(self, widget, event, name=None):
138 status = self._status_map[name] 118 status = self._status_map[name]
139 widget.set_text(status) 119 widget.set_text(status)
140 widget.modify_fg(gtk.STATE_NORMAL, _LABEL_COLORS[status]) 120 widget.modify_fg(gtk.STATE_NORMAL, ft.LABEL_COLORS[status])
141 121
142 def make_pattern_label_box(self, name): 122 def make_pattern_label_box(self, name):
143 eb = gtk.EventBox() 123 eb = gtk.EventBox()
144 eb.modify_bg(gtk.STATE_NORMAL, _BLACK) 124 eb.modify_bg(gtk.STATE_NORMAL, ft.BLACK)
145 label_status = gtk.Label(_UNTESTED) 125 label_status = gtk.Label(ft.UNTESTED)
146 label_status.set_size_request(*_LABEL_STATUS_SIZE) 126 label_status.set_size_request(*_LABEL_STATUS_SIZE)
147 label_status.set_alignment(0, 0.5) 127 label_status.set_alignment(0, 0.5)
148 label_status.modify_font(_LABEL_STATUS_FONT) 128 label_status.modify_font(_LABEL_STATUS_FONT)
149 label_status.modify_fg(gtk.STATE_NORMAL, _LABEL_UNTESTED_FG) 129 label_status.modify_fg(gtk.STATE_NORMAL, _LABEL_UNTESTED_FG)
150 expose_cb = lambda *x: self.label_status_expose(*x, **{'name':name}) 130 expose_cb = lambda *x: self.label_status_expose(*x, **{'name':name})
151 label_status.connect('expose_event', expose_cb) 131 label_status.connect('expose_event', expose_cb)
152 label_en = gtk.Label(name) 132 label_en = gtk.Label(name)
153 label_en.set_alignment(1, 0.5) 133 label_en.set_alignment(1, 0.5)
154 label_en.modify_font(_LABEL_STATUS_FONT) 134 label_en.modify_font(_LABEL_STATUS_FONT)
155 label_en.modify_fg(gtk.STATE_NORMAL, _LABEL_FG) 135 label_en.modify_fg(gtk.STATE_NORMAL, _LABEL_FG)
156 label_sep = gtk.Label(' : ') 136 label_sep = gtk.Label(' : ')
157 label_sep.set_alignment(0.5, 0.5) 137 label_sep.set_alignment(0.5, 0.5)
158 label_sep.modify_font(_LABEL_FONT) 138 label_sep.modify_font(_LABEL_FONT)
159 label_sep.modify_fg(gtk.STATE_NORMAL, _LABEL_FG) 139 label_sep.modify_fg(gtk.STATE_NORMAL, _LABEL_FG)
160 hbox = gtk.HBox() 140 hbox = gtk.HBox()
161 hbox.pack_end(label_status, False, False) 141 hbox.pack_end(label_status, False, False)
162 hbox.pack_end(label_sep, False, False) 142 hbox.pack_end(label_sep, False, False)
163 hbox.pack_end(label_en, False, False) 143 hbox.pack_end(label_en, False, False)
164 eb.add(hbox) 144 eb.add(hbox)
165 return eb 145 return eb
166 146
167 def register_callbacks(self, window): 147 def register_callbacks(self, window):
168 window.connect('key-press-event', self.key_press_callback) 148 window.connect('key-press-event', self.key_press_callback)
169 window.add_events(gtk.gdk.KEY_PRESS_MASK) 149 window.add_events(gtk.gdk.KEY_PRESS_MASK)
170 window.connect('key-release-event', self.key_release_callback) 150 window.connect('key-release-event', self.key_release_callback)
171 window.add_events(gtk.gdk.KEY_RELEASE_MASK) 151 window.add_events(gtk.gdk.KEY_RELEASE_MASK)
172 152
173 def run_once(self, test_widget_size=None, trigger_set=None, 153 def run_once(self,
154 test_widget_size=None,
155 trigger_set=None,
174 result_file_path=None): 156 result_file_path=None):
175 157
176 factory_test.XXX_log('factory_Display') 158 factory.log('%s run_once' % self.__class__)
177 159
178 xset_status = os.system('xset r off') 160 xset_status = os.system('xset r off')
179 xmm_status = os.system('xmodmap -e "clear Lock"') 161 if xset_status:
180 if xset_status or xmm_status: 162 raise TestFail('ERROR: disabling key repeat')
181 raise TestFail('ERROR: disabling key repeat or caps lock')
182 163
183 factory_test.init(trigger_set=trigger_set, 164 self._ft_state = ft.State(
184 result_file_path=result_file_path) 165 trigger_set=trigger_set,
166 result_file_path=result_file_path)
185 167
186 self._pattern_queue = [x for x in reversed(_PATTERN_LIST)] 168 self._pattern_queue = [x for x in reversed(_PATTERN_LIST)]
187 self._status_map = dict((n, _UNTESTED) for n, f in _PATTERN_LIST) 169 self._status_map = dict((n, ft.UNTESTED) for n, f in _PATTERN_LIST)
188 170
189 prompt_label = gtk.Label('hold SPACE to display pattern,\n' 171 prompt_label = gtk.Label('hold SPACE to display pattern,\n'
190 'TAB to fail and RETURN to pass\n') 172 'TAB to fail and RETURN to pass\n')
191 prompt_label.modify_font(_LABEL_FONT) 173 prompt_label.modify_font(_LABEL_FONT)
192 prompt_label.set_alignment(0.5, 0.5) 174 prompt_label.set_alignment(0.5, 0.5)
193 prompt_label.modify_fg(gtk.STATE_NORMAL, _LABEL_FG) 175 prompt_label.modify_fg(gtk.STATE_NORMAL, _LABEL_FG)
194 self._prompt_label = prompt_label 176 self._prompt_label = prompt_label
195 177
196 vbox = gtk.VBox() 178 vbox = gtk.VBox()
197 vbox.pack_start(prompt_label, False, False) 179 vbox.pack_start(prompt_label, False, False)
198 180
199 for name, cb_fun in _PATTERN_LIST: 181 for name, cb_fun in _PATTERN_LIST:
200 label_box = self.make_pattern_label_box(name) 182 label_box = self.make_pattern_label_box(name)
201 vbox.pack_start(label_box, False, False) 183 vbox.pack_start(label_box, False, False)
202 184
203 test_widget = gtk.EventBox() 185 test_widget = gtk.EventBox()
204 test_widget.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('black')) 186 test_widget.modify_bg(gtk.STATE_NORMAL, ft.BLACK)
205 test_widget.add(vbox) 187 test_widget.add(vbox)
206 self._test_widget = test_widget 188 self._test_widget = test_widget
207 189
208 self.goto_next_pattern() 190 self.goto_next_pattern()
209 191
210 self._fs_window = None 192 self._fs_window = None
211 193
212 factory_test.run_test_widget( 194 self._ft_state.run_test_widget(
213 test_widget=test_widget, 195 test_widget=test_widget,
214 test_widget_size=test_widget_size, 196 test_widget_size=test_widget_size,
215 window_registration_callback=self.register_callbacks) 197 window_registration_callback=self.register_callbacks)
216 198
217 failed_set = set(name for name, status in self._status_map.items() 199 failed_set = set(name for name, status in self._status_map.items()
218 if status is not _PASSED) 200 if status is not ft.PASSED)
219 if failed_set: 201 if failed_set:
220 raise error.TestFail('some patterns failed (%s)' % 202 raise error.TestFail('some patterns failed (%s)' %
221 ', '.join(failed_set)) 203 ', '.join(failed_set))
222 204
223 factory_test.XXX_log('exiting factory_Display') 205 factory.log('%s run_once finished' % self.__class__)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698