Index: client/bin/factory.py |
diff --git a/client/bin/factory.py b/client/bin/factory.py |
index 962d7cdec7b9a7ef1124b40b41e50b9e5fa9ce0c..3d0d4a7995d81ae7eab6855dba2ca1522f065edf 100644 |
--- a/client/bin/factory.py |
+++ b/client/bin/factory.py |
@@ -51,7 +51,8 @@ class FactoryAutotestTest(FactoryTest): |
class OperatorTest(FactoryAutotestTest): |
def __init__(self, label_en='', label_zw='', autotest_name=None, |
- kbd_shortcut=None, dargs={}, drop_caches=False): |
+ kbd_shortcut=None, dargs={}, drop_caches=False, |
+ unique_name=None): |
self.__dict__.update(vars()) |
class InformationScreen(OperatorTest): |
@@ -60,18 +61,18 @@ class InformationScreen(OperatorTest): |
class AutomatedSequence(FactoryTest): |
def __init__(self, label_en='', label_zw='', subtest_tag_prefix=None, |
- kbd_shortcut=None, subtest_list=[]): |
+ kbd_shortcut=None, subtest_list=[], unique_name=None): |
self.__dict__.update(vars()) |
class AutomatedSubTest(FactoryAutotestTest): |
def __init__(self, label_en='', label_zw='', autotest_name=None, |
- dargs={}, drop_caches=False): |
+ dargs={}, drop_caches=False, unique_name=None): |
self.__dict__.update(vars()) |
class AutomatedRebootSubTest(FactoryAutotestTest): |
def __init__(self, label_en='', label_zw='', iterations=None, |
autotest_name='factory_RebootStub', dargs={}, |
- drop_caches=False): |
+ drop_caches=False, unique_name=None): |
self.__dict__.update(vars()) |
@@ -100,8 +101,12 @@ class TestDatabase: |
self.seq_test_set], [])) |
self._subtest_map = dict((self._tag_prefix_map[st], st) |
for st in self.subtest_set) |
- self._unique_name_map = dict((self.get_unique_name(t), t) |
- for t in self._tag_prefix_map) |
+ self.all_tests = set(test_list) | self.subtest_set |
+ self._unique_name_map = dict((t.unique_name, t) for t in self.all_tests |
+ if isinstance(t, FactoryAutotestTest) |
+ and t.unique_name is not None) |
+ self._unique_details_map = dict((self.get_unique_details(t), t) |
+ for t in self.all_tests) |
self._kbd_shortcut_map = dict((test.kbd_shortcut, test) |
for test in test_list) |
self.kbd_shortcut_set = set(self._kbd_shortcut_map) |
@@ -115,23 +120,23 @@ class TestDatabase: |
(test.label_en, collision.label_en, test.kbd_shortcut)) |
assert not delta |
- def get_test_by_details(self, autotest_name, tag_prefix): |
- unique_name = '%s.%s' % (autotest_name, tag_prefix) |
- return self._unique_name_map.get(unique_name) |
- |
- def get_test_by_kbd_shortcut(self, kbd_shortcut): |
- return self._kbd_shortcut_map.get(kbd_shortcut) |
+ def get_tag_prefix(self, test): |
+ return self._tag_prefix_map[test] |
- def get_unique_name(self, test): |
+ def get_unique_details(self, test): |
if isinstance(test, AutomatedSequence): |
return test.subtest_tag_prefix |
- return '%s.%s' % (test.autotest_name, self._tag_prefix_map[test]) |
+ return '%s.%s' % (test.autotest_name, self.get_tag_prefix(test)) |
- def get_tag_prefix(self, test): |
- return self._tag_prefix_map[test] |
+ def get_test_by_unique_details(self, autotest_name, tag_prefix): |
+ unique_details = '%s.%s' % (autotest_name, tag_prefix) |
+ return self._unique_details_map.get(unique_details) |
+ |
+ def get_test_by_kbd_shortcut(self, kbd_shortcut): |
+ return self._kbd_shortcut_map.get(kbd_shortcut) |
- def get_all_tests(self): |
- return set(self.test_queue) | self.subtest_set |
+ def get_test_by_unique_name(self, unique_name): |
+ return self._unique_name_map.get(unique_name) |
def get_subtest_parent(self, test): |
return self._subtest_parent_map.get(test) |
@@ -152,7 +157,7 @@ class StatusMap: |
def __init__(self, test_list, status_file_path): |
self.test_db = TestDatabase(test_list) |
- all_tests = self.test_db.get_all_tests() |
+ all_tests = self.test_db.all_tests |
self._status_map = dict((t, StatusMap.Entry()) for t in all_tests) |
self._status_file_path = status_file_path |
self._status_file_pos = 0 |
@@ -187,8 +192,8 @@ class StatusMap: |
def next_untested(self): |
remaining = self.filter(UNTESTED) |
- unique_names = [self.test_db.get_unique_name(t) for t in remaining] |
- log('remaining untested = [%s]' % ', '.join(unique_names)) |
+ unique_details = [self.test_db.get_unique_details(t) for t in remaining] |
+ log('remaining untested = [%s]' % ', '.join(unique_details)) |
return remaining is not [] and remaining.pop() or None |
def read_new_data(self): |
@@ -206,7 +211,7 @@ class StatusMap: |
% (code, test_id, error_msg)) |
autotest_name, _, tag = test_id.rpartition('.') |
tag_prefix, _, count = tag.rpartition('_') |
- test = self.test_db.get_test_by_details( |
+ test = self.test_db.get_test_by_unique_details( |
autotest_name, tag_prefix) |
if test is None: |
log('ignoring update (%s) for test "%s" "%s"' % |
@@ -231,23 +236,23 @@ class StatusMap: |
parent_seq_test = self.test_db.get_subtest_parent(test) |
active_tests -= set([parent_seq_test]) |
for bad_test in active_tests: |
- unique_name = self.test_db.get_unique_name(bad_test) |
+ unique_details = self.test_db.get_unique_details(bad_test) |
log('WARNING: assuming test %s FAILED (status log has no data)' % |
- unique_name) |
+ unique_details) |
self.update(bad_test, FAILED, self.lookup_count(bad_test), |
'assumed FAILED (status log has no data)') |
def update(self, test, status, count, error_msg): |
entry = self._status_map[test] |
- unique_name = self.test_db.get_unique_name(test) |
+ unique_details = self.test_db.get_unique_details(test) |
if count < entry.count: |
log('ERROR: count regression for %s (%d -> %d)' % |
- (unique_name, entry.count, count)) |
+ (unique_details, entry.count, count)) |
if isinstance(test, InformationScreen) and status in [PASSED, FAILED]: |
status = UNTESTED |
if status != entry.status: |
log('status change for %s : %s/%s -> %s/%s' % |
- (unique_name, entry.status, entry.count, status, count)) |
+ (unique_details, entry.status, entry.count, status, count)) |
if entry.label_box is not None: |
entry.label_box.update(status) |
if status == ACTIVE: |
@@ -255,15 +260,18 @@ class StatusMap: |
entry.status = status |
entry.count = count |
entry.error_msg = error_msg |
- log('%s new status = %s' % (unique_name, self._status_map[test].status)) |
+ log('%s new status = %s' % |
+ (unique_details, self._status_map[test].status)) |
def update_seq_test(self, test): |
subtest_status_set = set(map(self.lookup_status, test.subtest_list)) |
max_count = max(map(self.lookup_count, test.subtest_list)) |
if len(subtest_status_set) == 1: |
status = subtest_status_set.pop() |
+ elif subtest_status_set == set([PASSED, FAILED]): |
+ status = FAILED |
else: |
- status = ACTIVE in subtest_status_set and ACTIVE or FAILED |
+ status = ACTIVE |
self.update(test, status, max_count, None) |
def set_label_box(self, test, label_box): |