Index: client/site_tests/suite_Factory/control |
diff --git a/client/site_tests/suite_Factory/control b/client/site_tests/suite_Factory/control |
index 3b8bcc80ccd8f8c45ddf248bca553db933503109..948d865de6e0abf7ce36da0f33e089d18d7f2acd 100644 |
--- a/client/site_tests/suite_Factory/control |
+++ b/client/site_tests/suite_Factory/control |
@@ -72,53 +72,63 @@ job.bootloader.boot_once = lambda x: None |
def start_ui(): |
ui_proc_args = [FACTORY_UI_PATH, TEST_LIST_PATH, |
STATUS_FILE_PATH, str(os.getpid())] |
- factory.log('starting ui -- %s' % repr(ui_proc_args)) |
+ factory.log('starting ui %s' % repr(ui_proc_args)) |
sp = subprocess.Popen(ui_proc_args, stdout=subprocess.PIPE) |
factory.log('waiting for ui to come up...') |
- factory.log('got message from UI : %s' % repr(sp.stdout.readline().strip())) |
+ factory.log('got message from ui : %s' % repr(sp.stdout.readline().strip())) |
-def step_reboot_seq(tag_prefix, total_iterations, i=0): |
+def step_reboot_seq(next_subtest_info, total_iterations, i=0): |
if i < total_iterations: |
- job.next_step_prepend([step_reboot_seq, tag_prefix, |
+ job.next_step_prepend([step_reboot_seq, next_subtest_info, |
total_iterations, i + 1]) |
factory.log('rebooting (iteration %d of %d)' % (i, total_iterations)) |
job.reboot() |
else: |
- step_init(intentional_reboot_subtest_tag_prefix=tag_prefix) |
+ step_init(next_subtest_info) |
-def step_init(intentional_reboot_subtest_tag_prefix=None): |
+def step_init(next_subtest_info=None): |
job.next_step([step_init]) |
start_ui() |
+ test_db = factory.TestDatabase(TEST_LIST) |
status_map = factory.StatusMap(TEST_LIST, STATUS_FILE_PATH) |
control_state = factory.ControlState( |
- job, TEST_LIST, status_map, STATUS_FILE_PATH, |
+ job, TEST_LIST, test_db, status_map, STATUS_FILE_PATH, |
parallel.fork_nuke_subprocess) |
- if intentional_reboot_subtest_tag_prefix: |
- reboot_subtest = status_map.test_db.get_subtest_by_tag_prefix( |
- intentional_reboot_subtest_tag_prefix) |
- control_state.run_test(reboot_subtest) |
+ def run_automated_sequence(test, count, start_index=0): |
+ for subtest in test.subtest_list[start_index:]: |
+ if isinstance(subtest, factory.AutomatedRebootSubTest): |
+ next_subtest_info = (test_db.get_tag_prefix(subtest), count) |
+ step_reboot_seq(next_subtest_info, subtest.iterations) |
+ else: |
+ shortcut_target = control_state.run_test(subtest, count) |
+ status_map.read_new_data() |
+ if shortcut_target: |
+ return shortcut_target |
+ if status_map.lookup_status(test) == factory.FAILED: |
+ return None |
+ |
+ if next_subtest_info: |
+ tag_prefix, count = next_subtest_info |
+ reboot_subtest = test_db.get_subtest_by_tag_prefix(tag_prefix) |
+ control_state.run_test(reboot_subtest, count) |
status_map.read_new_data() |
+ automated_seq = test_db.get_subtest_parent(reboot_subtest) |
+ rst_index = automated_seq.subtest_list.index(reboot_subtest) |
+ run_automated_sequence(automated_seq, count, start_index=rst_index + 1) |
test = status_map.next_untested() |
while test is not None: |
- factory.log('next test = %s' % |
- status_map.test_db.get_unique_details(test)) |
+ unique_id_str = test_db.get_unique_id_str(test) |
+ count = status_map.lookup_count(test) + 1 |
+ factory.log('control running test %s/%s' % (unique_id_str, count)) |
if isinstance(test, factory.AutomatedSequence): |
- for subtest in test.subtest_list: |
- if isinstance(subtest, factory.AutomatedRebootSubTest): |
- tag_prefix = status_map.test_db.get_tag_prefix(subtest) |
- step_reboot_seq(tag_prefix, subtest.iterations) |
- else: |
- control_state.run_test(subtest) |
- if control_state.activated_kbd_shortcut_test: |
- break |
+ shortcut_target = run_automated_sequence(test, count) |
else: |
- control_state.run_test(test) |
- status_map.read_new_data() |
- test = (control_state.activated_kbd_shortcut_test or |
- status_map.next_untested()) |
+ shortcut_target = control_state.run_test(test, count) |
+ status_map.read_new_data() |
+ test = shortcut_target or status_map.next_untested() |