Index: client/site_tests/suite_Factory/control.ui |
diff --git a/client/site_tests/suite_Factory/control.ui b/client/site_tests/suite_Factory/control.ui |
index c6ea8ffdd14761d0acad644ac3c2704c4c3bcef6..bc39ca79cfd9172b064be56c987c7525585ff59a 100644 |
--- a/client/site_tests/suite_Factory/control.ui |
+++ b/client/site_tests/suite_Factory/control.ui |
@@ -31,6 +31,8 @@ import time |
_FACTORY_LOG_PATH = '/var/log/factory.log' |
_RESULT_FILE_PATH = '/var/run/factory_test_result' |
+_REBOOT_SEQ_ITERATIONS = 2 |
+ |
def XXX_log(s): |
print >> sys.stderr, '--- XXX : ' + s |
@@ -41,32 +43,6 @@ job.bootloader.set_default = lambda x: None |
job.bootloader.boot_once = lambda x: None |
-class factory_ui: |
- '''Support communication with the factory_ui process. To simplify |
- surrounding code, this communication is an exchange of well formed |
- python expressions. Basically send wraps its arguments in a call |
- to repr() and recv calls eval() to re-generate the python data.''' |
- |
- def __init__(self, factory_ui_path): |
- self._proc = subprocess.Popen(factory_ui_path, |
- stdin=subprocess.PIPE, |
- stdout=subprocess.PIPE) |
- |
- def __del__(self): |
- XXX_log('factory_ui __del__') |
- self._proc.terminate() |
- time.sleep(1) |
- if self._proc.poll() is None: |
- self._proc.kill() |
- |
- def send(self, x): |
- print >> self._proc.stdin, repr(x) |
- self._proc.stdin.flush() |
- |
- def recv(self): |
- return eval(self._proc.stdout.readline().rstrip()) |
- |
- |
# This is the definition of the test_data class, which holds |
# factory-specific information on the tests to be run. Specifically, |
# the order of items in the list reflect the order they are to be run |
@@ -81,8 +57,8 @@ class factory_ui: |
test_data_class_def = ''' |
class test_data: |
- def __init__(self, label_en='', label_zw='', formal_name='', |
- trigger=None, dargs={}): |
+ def __init__(self, label_en='', label_zw='', formal_name=None, |
+ tag_prefix=None, trigger=None, automated_seq=[], dargs={}): |
self.__dict__.update(vars()) |
def __repr__(self): |
@@ -97,20 +73,33 @@ exec(test_data_class_def) |
test_list = [ |
test_data( |
- label_en='dummy A', |
+ label_en='start', |
formal_name='factory_Dummy', |
trigger='a', |
- dargs={'msg':'Hello World'}), |
+ dargs={'quit_key':ord(' '), |
+ 'msg':'Hit SPACE to start testing...\n按 "空白鍵" 開始測試...'}), |
test_data( |
- label_en='dummy B', |
- formal_name='factory_Dummy', |
- trigger='b', |
- dargs={'msg':'Hello Factory'}), |
+ label_en='run-in', |
+ formal_name='step_runin', |
+ automated_seq=[ |
+ test_data( |
+ label_en='component validation', |
+ formal_name='hardware_Components'), |
+ test_data( |
+ label_en='gpio switch check', |
+ formal_name='hardware_GPIOSwitches'), |
+ test_data( |
+ label_en='system stress', |
+ formal_name='hardware_SAT'), |
Nick Sanders
2010/06/02 08:06:36
is there any way to get the test list specified in
Tammo Spalink
2010/06/07 03:40:21
You mean like scrape the names out from the step_r
|
+ test_data( |
+ label_en='reboot (%s times)' % _REBOOT_SEQ_ITERATIONS, |
+ formal_name='factory_RebootStub')], |
+ trigger='r'), |
test_data( |
- label_en='dummy C', |
+ label_en='camera', |
formal_name='factory_Dummy', |
trigger='c', |
- dargs={'msg':'Hello Mom...'}), |
+ dargs={'msg':'camera test, one day...'}), |
test_data( |
label_en='keyboard', |
label_zw='鍵盤', |
@@ -124,19 +113,88 @@ test_list = [ |
trigger='t'), |
] |
+for test in test_list: |
+ test.tag_prefix = test.trigger |
+ for subtest in test.automated_seq: |
+ subtest.tag_prefix = test.formal_name |
-test_map = dict((test.label_en, test) for test in test_list) |
+def test_map_index(formal_name, tag_prefix): |
+ return formal_name + '.' + tag_prefix |
+test_map = dict((test_map_index(test.formal_name, test.tag_prefix), test) |
+ for test in test_list) |
trigger_set = set(test.trigger for test in test_list) |
-def step_init(): |
- job.next_step([step_run_ui]) |
- step_run_ui() |
+class factory_ui: |
+ '''Support communication with the factory_ui process. To simplify |
+ surrounding code, this communication is an exchange of well formed |
+ python expressions. Basically send wraps its arguments in a call |
+ to repr() and recv calls eval() to re-generate the python data.''' |
+ |
+ def __init__(self, factory_ui_path): |
+ self._proc = subprocess.Popen(factory_ui_path, |
+ stdin=subprocess.PIPE, |
+ stdout=subprocess.PIPE) |
+ def __del__(self): |
+ XXX_log('control deleting factory_ui subprocess') |
+ self._proc.terminate() |
+ time.sleep(1) |
+ if self._proc.poll() is None: |
+ self._proc.kill() |
+ |
+ def send(self, x=None): |
+ print >> self._proc.stdin, repr(x) |
+ self._proc.stdin.flush() |
+ |
+ def send_cmd_next_test(self): |
+ self.send(('next_test', None)) |
+ |
+ def send_cmd_switch_to(self, trigger): |
+ self.send(('switch_to', trigger)) |
+ |
+ def recv(self): |
+ return eval(self._proc.stdout.readline().rstrip()) |
+ |
+ def recv_target_test_update(self): |
+ update = self.recv() |
+ XXX_log('control recv target test %s' % repr(update)) |
+ formal_name, tag_prefix, count = update |
+ test = test_map.get(test_map_index(formal_name, tag_prefix), None) |
+ if test is not None: |
+ test.count = count |
+ return test |
+ |
+ |
+def step_reboot_seq(i, tag): |
+ if i < _REBOOT_SEQ_ITERATIONS: |
+ job.next_step([step_reboot_seq, i + 1, tag]) |
+ XXX_log('rebooting (iteration %d)' % i) |
+ time.sleep(5) |
+ job.reboot() |
+ else: |
+ job.run_test('factory_RebootStub', tag=tag) |
+ step_init() |
+ |
+ |
+def step_runin(ui, tag): |
+ job.run_test('hardware_Components', |
+ approved_db='qualified_components', |
+ tag=tag) |
+ ui.send() |
+ job.run_test('hardware_GPIOSwitches', tag=tag) |
+ ui.send() |
+ job.drop_caches_between_iterations = True |
+ job.run_test('hardware_SAT', tag=tag) |
+ job.drop_caches_between_iterations = False |
+ ui.send() |
+ step_reboot_seq(0, tag) |
+ |
+ |
+def step_init(): |
-def step_run_ui(): |
'''Launch the factory UI, which will then make decisions on which |
tests to run in which order. This is to support user driven |
out-of-order test execution based on keyboard shortcuts. |
@@ -165,28 +223,32 @@ def step_run_ui(): |
test_widget_size = ui.recv() |
XXX_log('received test_widget_size = %s' % repr(test_widget_size)) |
- # Send initial 'None' trigger. |
- ui.send(None) |
- |
- while True: |
- next_test_name, count = ui.recv() |
- |
- XXX_log('next_test_name = %s , count = %s' % (next_test_name, count)) |
- if next_test_name is None: |
- XXX_log('factory testing completed') |
- break |
- |
- test = test_map[next_test_name] |
- dargs = test.dargs |
- dargs.update({ |
- 'tag': str(count), |
- 'test_widget_size': test_widget_size, |
- 'trigger_set': trigger_set, |
- 'result_file_path': _RESULT_FILE_PATH}) |
- |
- with open(_RESULT_FILE_PATH, 'w') as file: |
- file.write('None\n') |
- job.run_test(test.formal_name, **dargs) |
- with open(_RESULT_FILE_PATH, 'r') as file: |
- result = eval(file.readline()) |
- ui.send(result) |
+ ui.send_cmd_next_test() |
+ test = ui.recv_target_test_update() |
+ |
+ while test is not None: |
+ if test.automated_seq: |
+ tag = '%s_%s' % (test.formal_name, test.count) |
+ exec('%s(ui, "%s")' % (test.formal_name, tag)) |
+ result = None |
+ else: |
+ dargs = test.dargs |
+ dargs.update({ |
+ 'tag': '%s_%s' % (test.tag_prefix, test.count), |
+ 'test_widget_size': test_widget_size, |
+ 'trigger_set': trigger_set, |
+ 'result_file_path': _RESULT_FILE_PATH}) |
+ with open(_RESULT_FILE_PATH, 'w') as file: |
+ file.write('None\n') |
+ job.run_test(test.formal_name, **dargs) |
+ with open(_RESULT_FILE_PATH, 'r') as file: |
+ result = eval(file.readline()) |
+ |
+ if result is not None: |
+ ui.send_cmd_switch_to(result) |
+ else: |
+ ui.send_cmd_next_test() |
+ |
+ test = ui.recv_target_test_update() |
+ |
+ XXX_log('factory testing completed') |