OLD | NEW |
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__) |
OLD | NEW |