Index: scripts/slave/recipe_modules/json/util.py |
diff --git a/scripts/slave/recipe_modules/json/util.py b/scripts/slave/recipe_modules/json/util.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7efd813b7181a70c8e0477eb6532034238fb7077 |
--- /dev/null |
+++ b/scripts/slave/recipe_modules/json/util.py |
@@ -0,0 +1,71 @@ |
+def convert_trie_to_flat_paths(trie, prefix=None): |
+ # Cloned from webkitpy.layout_tests.layout_package.json_results_generator |
+ # so that this code can stand alone. |
+ result = {} |
+ for name, data in trie.iteritems(): |
+ if prefix: |
+ name = prefix + "/" + name |
+ |
+ if len(data) and not "actual" in data and not "expected" in data: |
+ result.update(convert_trie_to_flat_paths(data, name)) |
+ else: |
+ result[name] = data |
+ |
+ return result |
+ |
+ |
+class TestResults(object): |
+ def __init__(self, jsonish=None): |
+ self.raw = jsonish or {} |
+ |
+ self.tests = convert_trie_to_flat_paths(self.raw.get('tests', {})) |
+ self.passes = {} |
+ self.unexpected_passes = {} |
+ self.failures = {} |
+ self.unexpected_failures = {} |
+ self.flakes = {} |
+ self.unexpected_flakes = {} |
+ |
+ for (test, result) in self.tests.iteritems(): |
+ key = 'unexpected_' if result.get('is_unexpected') else '' |
+ actual_result = result['actual'] |
+ data = actual_result |
+ if ' PASS' in actual_result: |
+ key += 'flakes' |
+ elif actual_result == 'PASS': |
+ key += 'passes' |
+ data = result |
+ else: |
+ key += 'failures' |
+ getattr(self, key)[test] = data |
+ |
+ def __getattr__(self, key): |
+ if key in self.raw: |
+ return self.raw[key] |
+ raise AttributeError("'%s' object has no attribute '%s'" % |
+ (self.__class__, key)) # pragma: no cover |
+ |
+ def add_result(self, name, expected, actual=None): |
+ """Adds a test result to a 'json test results' compatible object. |
+ Args: |
+ name - A full test name delimited by '/'. ex. 'some/category/test.html' |
+ expected - The string value for the 'expected' result of this test. |
+ actual (optional) - If not None, this is the actual result of the test. |
+ Otherwise this will be set equal to expected. |
+ |
+ The test will also get an 'is_unexpected' key if actual != expected. |
+ """ |
+ actual = actual or expected |
+ entry = self.tests |
+ for token in name.split('/'): |
+ entry = entry.setdefault(token, {}) |
+ entry['expected'] = expected |
+ entry['actual'] = actual |
+ if expected != actual: |
+ entry['is_unexpected'] = True |
+ |
+ def as_jsonish(self): |
+ ret = self.raw.copy() |
+ ret.setdefault('tests', {}).update(self.tests) |
+ return ret |
+ |