| OLD | NEW |
| 1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
| 2 # | 2 # |
| 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 AUTHOR = "Chrome OS Team" | 7 AUTHOR = "Chrome OS Team" |
| 8 NAME = "Factory" | 8 NAME = "Factory" |
| 9 TIME = "LONG" | 9 TIME = "LONG" |
| 10 TEST_CATEGORY = "Functional" | 10 TEST_CATEGORY = "Functional" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 import time | 28 import time |
| 29 | 29 |
| 30 | 30 |
| 31 _FACTORY_LOG_PATH = '/var/log/factory.log' | 31 _FACTORY_LOG_PATH = '/var/log/factory.log' |
| 32 _RESULT_FILE_PATH = '/var/run/factory_test_result' | 32 _RESULT_FILE_PATH = '/var/run/factory_test_result' |
| 33 | 33 |
| 34 _REBOOT_SEQ_ITERATIONS = 2 | 34 _REBOOT_SEQ_ITERATIONS = 2 |
| 35 | 35 |
| 36 | 36 |
| 37 def XXX_log(s): | 37 def XXX_log(s): |
| 38 print >> sys.stderr, '--- XXX : ' + s | 38 print >> sys.stderr, 'FACTORY: ' + s |
| 39 | 39 |
| 40 | 40 |
| 41 # Hack to work around autotest's obsession with GRUB. | 41 # Hack to work around autotest's obsession with GRUB. |
| 42 job.bootloader.set_default = lambda x: None | 42 job.bootloader.set_default = lambda x: None |
| 43 job.bootloader.boot_once = lambda x: None | 43 job.bootloader.boot_once = lambda x: None |
| 44 | 44 |
| 45 | 45 |
| 46 # This is the definition of the test_data class, which holds | 46 # This is the definition of the test_data class, which holds |
| 47 # factory-specific information on the tests to be run. Specifically, | 47 # factory-specific information on the tests to be run. Specifically, |
| 48 # the order of items in the list reflect the order they are to be run | 48 # the order of items in the list reflect the order they are to be run |
| (...skipping 23 matching lines...) Expand all Loading... |
| 72 | 72 |
| 73 | 73 |
| 74 test_list = [ | 74 test_list = [ |
| 75 test_data( | 75 test_data( |
| 76 label_en='start', | 76 label_en='start', |
| 77 formal_name='factory_Dummy', | 77 formal_name='factory_Dummy', |
| 78 trigger='a', | 78 trigger='a', |
| 79 dargs={'quit_key':ord(' '), | 79 dargs={'quit_key':ord(' '), |
| 80 'msg':'Hit SPACE to start testing...\n按 "空白鍵" 開始測試...'}), | 80 'msg':'Hit SPACE to start testing...\n按 "空白鍵" 開始測試...'}), |
| 81 test_data( | 81 test_data( |
| 82 label_en='sync', |
| 83 formal_name='factory_ScriptWrapper', |
| 84 trigger='s', |
| 85 dargs={'cmdline':'/usr/local/autotest/exscr'}), |
| 86 test_data( |
| 87 label_en='leds', |
| 88 formal_name='factory_Dummy', |
| 89 trigger='l', |
| 90 dargs={'msg':'LEDs test, one day...'}), |
| 91 test_data( |
| 92 label_en='usb', |
| 93 formal_name='factory_ExternalStorage', |
| 94 trigger='u'), |
| 95 test_data( |
| 96 label_en='display', |
| 97 formal_name='factory_Display', |
| 98 trigger='m'), |
| 99 test_data( |
| 100 label_en='camera', |
| 101 formal_name='factory_Dummy', |
| 102 trigger='c', |
| 103 dargs={'msg':'camera test, one day...'}), |
| 104 test_data( |
| 105 label_en='keyboard', |
| 106 label_zw='鍵盤', |
| 107 formal_name='factory_Keyboard', |
| 108 trigger='k', |
| 109 dargs={'layout':'en_us'}), |
| 110 test_data( |
| 111 label_en='touchpad', |
| 112 label_zw='觸控板', |
| 113 formal_name='factory_Synaptics', |
| 114 trigger='t'), |
| 115 test_data( |
| 82 label_en='run-in', | 116 label_en='run-in', |
| 83 formal_name='step_runin', | 117 formal_name='step_runin', |
| 84 automated_seq=[ | 118 automated_seq=[ |
| 85 test_data( | 119 test_data( |
| 86 label_en='component validation', | 120 label_en='component validation', |
| 87 formal_name='hardware_Components'), | 121 formal_name='hardware_Components', |
| 122 dargs={'approved_db':'qualified_components'}), |
| 88 test_data( | 123 test_data( |
| 89 label_en='gpio switch check', | 124 label_en='gpio switch check', |
| 90 formal_name='hardware_GPIOSwitches'), | 125 formal_name='hardware_GPIOSwitches'), |
| 91 test_data( | 126 test_data( |
| 92 label_en='system stress', | 127 label_en='system stress', |
| 93 formal_name='hardware_SAT'), | 128 formal_name='hardware_SAT'), |
| 94 test_data( | 129 test_data( |
| 95 label_en='reboot (%s times)' % _REBOOT_SEQ_ITERATIONS, | 130 label_en='reboot (%s times)' % _REBOOT_SEQ_ITERATIONS, |
| 96 formal_name='factory_RebootStub')], | 131 formal_name='factory_RebootStub')], |
| 97 trigger='r'), | 132 trigger='r'), |
| 98 test_data( | 133 test_data( |
| 99 label_en='camera', | 134 label_en='end', |
| 100 formal_name='factory_Dummy', | 135 formal_name='factory_Dummy', |
| 101 trigger='c', | 136 trigger='e', |
| 102 dargs={'msg':'camera test, one day...'}), | 137 dargs={'msg':'end of testing...\n(chinese)...'}), |
| 103 test_data( | |
| 104 label_en='keyboard', | |
| 105 label_zw='鍵盤', | |
| 106 formal_name='factory_Keyboard', | |
| 107 trigger='k', | |
| 108 dargs={'layout':'en_us'}), | |
| 109 test_data( | |
| 110 label_en='trackpad', | |
| 111 label_zw='觸控板', | |
| 112 formal_name='hardware_Touchpad', | |
| 113 trigger='t'), | |
| 114 ] | 138 ] |
| 115 | 139 |
| 116 for test in test_list: | 140 for test in test_list: |
| 117 test.tag_prefix = test.trigger | 141 test.tag_prefix = test.trigger |
| 118 for subtest in test.automated_seq: | 142 for subtest in test.automated_seq: |
| 119 subtest.tag_prefix = test.formal_name | 143 subtest.tag_prefix = test.formal_name |
| 120 | 144 |
| 121 def test_map_index(formal_name, tag_prefix): | 145 def test_map_index(formal_name, tag_prefix): |
| 122 return formal_name + '.' + tag_prefix | 146 return formal_name + '.' + tag_prefix |
| 123 | 147 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 self.send(('switch_to', trigger)) | 180 self.send(('switch_to', trigger)) |
| 157 | 181 |
| 158 def recv(self): | 182 def recv(self): |
| 159 return eval(self._proc.stdout.readline().rstrip()) | 183 return eval(self._proc.stdout.readline().rstrip()) |
| 160 | 184 |
| 161 def recv_target_test_update(self): | 185 def recv_target_test_update(self): |
| 162 update = self.recv() | 186 update = self.recv() |
| 163 XXX_log('control recv target test %s' % repr(update)) | 187 XXX_log('control recv target test %s' % repr(update)) |
| 164 formal_name, tag_prefix, count = update | 188 formal_name, tag_prefix, count = update |
| 165 test = test_map.get(test_map_index(formal_name, tag_prefix), None) | 189 test = test_map.get(test_map_index(formal_name, tag_prefix), None) |
| 166 if test is not None: | 190 return (test, count) |
| 167 test.count = count | |
| 168 return test | |
| 169 | 191 |
| 170 | 192 |
| 171 def step_reboot_seq(i, tag): | 193 def step_reboot_seq(i, tag): |
| 172 if i < _REBOOT_SEQ_ITERATIONS: | 194 if i < _REBOOT_SEQ_ITERATIONS: |
| 173 job.next_step([step_reboot_seq, i + 1, tag]) | 195 job.next_step_prepend([step_reboot_seq, i + 1, tag]) |
| 174 XXX_log('rebooting (iteration %d)' % i) | 196 XXX_log('rebooting (iteration %d)' % i) |
| 175 time.sleep(5) | 197 time.sleep(5) |
| 176 job.reboot() | 198 job.reboot() |
| 177 else: | 199 else: |
| 178 job.run_test('factory_RebootStub', tag=tag) | 200 job.run_test('factory_RebootStub', tag=tag) |
| 179 step_init() | 201 step_init() |
| 180 | 202 |
| 181 | 203 |
| 182 def step_runin(ui, tag): | 204 def step_runin(ui, tag): |
| 183 job.run_test('hardware_Components', | 205 job.run_test('hardware_Components', |
| 184 approved_db='qualified_components', | 206 approved_db='qualified_components', |
| 185 tag=tag) | 207 tag=tag) |
| 186 ui.send() | |
| 187 job.run_test('hardware_GPIOSwitches', tag=tag) | 208 job.run_test('hardware_GPIOSwitches', tag=tag) |
| 188 ui.send() | |
| 189 job.drop_caches_between_iterations = True | 209 job.drop_caches_between_iterations = True |
| 190 job.run_test('hardware_SAT', tag=tag) | 210 job.run_test('hardware_SAT', tag=tag) |
| 191 job.drop_caches_between_iterations = False | 211 job.drop_caches_between_iterations = False |
| 192 ui.send() | |
| 193 step_reboot_seq(0, tag) | 212 step_reboot_seq(0, tag) |
| 194 | 213 |
| 195 | 214 |
| 196 def step_init(): | 215 def step_init(): |
| 197 | 216 |
| 198 '''Launch the factory UI, which will then make decisions on which | 217 '''Launch the factory UI, which will then make decisions on which |
| 199 tests to run in which order. This is to support user driven | 218 tests to run in which order. This is to support user driven |
| 200 out-of-order test execution based on keyboard shortcuts. | 219 out-of-order test execution based on keyboard shortcuts. |
| 201 | 220 |
| 202 For each test, a trigger (possibly None) is communicated to the | 221 For each test, a trigger (possibly None) is communicated to the |
| 203 UI, which then replies with the test name and a count number that | 222 UI, which then replies with the test name and a count number that |
| 204 becomes the autotest tag to allow repeated test execution while | 223 becomes the autotest tag to allow repeated test execution while |
| 205 preserving logs. | 224 preserving logs. |
| 206 | 225 |
| 207 When the tests themselves run, they are expected to look for | 226 When the tests themselves run, they are expected to look for |
| 208 (using the factory_test library) keyboard events that match test | 227 (using the factory_test library) keyboard events that match test |
| 209 switching triggers. When a trigger happens, it should be written | 228 switching triggers. When a trigger happens, it should be written |
| 210 to the _RESULT_FILE_PATH, which will be read after the test | 229 to the _RESULT_FILE_PATH, which will be read after the test |
| 211 completed and the result comminicated onwards to the UI.''' | 230 completed and the result comminicated onwards to the UI.''' |
| 212 | 231 |
| 232 job.next_step([step_init]) |
| 233 |
| 213 status_file_path = job.autodir + '/results/default/status' | 234 status_file_path = job.autodir + '/results/default/status' |
| 214 factory_ui_path = job.autodir + '/factory_ui' | 235 factory_ui_path = job.autodir + '/deps/factory/ui' |
| 215 | 236 |
| 216 ui = factory_ui(factory_ui_path) | 237 ui = factory_ui(factory_ui_path) |
| 217 | 238 |
| 218 ui.send(test_data_class_def) | 239 ui.send(test_data_class_def) |
| 219 ui.send(test_list) | 240 ui.send(test_list) |
| 220 ui.send(status_file_path) | 241 ui.send(status_file_path) |
| 221 ui.send(_FACTORY_LOG_PATH) | 242 ui.send(_FACTORY_LOG_PATH) |
| 222 | 243 |
| 223 test_widget_size = ui.recv() | 244 test_widget_size = ui.recv() |
| 224 XXX_log('received test_widget_size = %s' % repr(test_widget_size)) | 245 XXX_log('received test_widget_size = %s' % repr(test_widget_size)) |
| 225 | 246 |
| 226 ui.send_cmd_next_test() | 247 ui.send_cmd_next_test() |
| 227 test = ui.recv_target_test_update() | 248 test, test_count = ui.recv_target_test_update() |
| 228 | 249 |
| 229 while test is not None: | 250 while test is not None: |
| 230 if test.automated_seq: | 251 if test.automated_seq: |
| 231 tag = '%s_%s' % (test.formal_name, test.count) | 252 tag = '%s_%s' % (test.formal_name, test_count) |
| 232 exec('%s(ui, "%s")' % (test.formal_name, tag)) | 253 exec('%s(ui, "%s")' % (test.formal_name, tag)) |
| 233 result = None | 254 result = None |
| 234 else: | 255 else: |
| 235 dargs = test.dargs | 256 dargs = test.dargs |
| 236 dargs.update({ | 257 dargs.update({ |
| 237 'tag': '%s_%s' % (test.tag_prefix, test.count), | 258 'tag': '%s_%s' % (test.tag_prefix, test_count), |
| 259 'test_tag_prefix': test.tag_prefix, |
| 260 'test_count': test_count, |
| 238 'test_widget_size': test_widget_size, | 261 'test_widget_size': test_widget_size, |
| 239 'trigger_set': trigger_set, | 262 'trigger_set': trigger_set, |
| 240 'result_file_path': _RESULT_FILE_PATH}) | 263 'result_file_path': _RESULT_FILE_PATH}) |
| 241 with open(_RESULT_FILE_PATH, 'w') as file: | 264 with open(_RESULT_FILE_PATH, 'w') as file: |
| 242 file.write('None\n') | 265 file.write('None\n') |
| 243 job.run_test(test.formal_name, **dargs) | 266 job.run_test(test.formal_name, **dargs) |
| 244 with open(_RESULT_FILE_PATH, 'r') as file: | 267 with open(_RESULT_FILE_PATH, 'r') as file: |
| 245 result = eval(file.readline()) | 268 result = eval(file.readline()) |
| 246 | 269 |
| 247 if result is not None: | 270 if result is not None: |
| 248 ui.send_cmd_switch_to(result) | 271 ui.send_cmd_switch_to(result) |
| 249 else: | 272 else: |
| 250 ui.send_cmd_next_test() | 273 ui.send_cmd_next_test() |
| 251 | 274 |
| 252 test = ui.recv_target_test_update() | 275 test, test_count = ui.recv_target_test_update() |
| 253 | 276 |
| 254 XXX_log('factory testing completed') | 277 XXX_log('factory testing completed') |
| OLD | NEW |