Index: tools/telemetry/third_party/typ/typ/json_results.py |
diff --git a/tools/telemetry/third_party/typ/typ/json_results.py b/tools/telemetry/third_party/typ/typ/json_results.py |
deleted file mode 100644 |
index 807c7548aca3eab23e17333b4a1deaca06ff0857..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/typ/typ/json_results.py |
+++ /dev/null |
@@ -1,185 +0,0 @@ |
-# Copyright 2014 Google Inc. All rights reserved. |
-# |
-# Licensed under the Apache License, Version 2.0 (the "License"); |
-# you may not use this file except in compliance with the License. |
-# You may obtain a copy of the License at |
-# |
-# http://www.apache.org/licenses/LICENSE-2.0 |
-# |
-# Unless required by applicable law or agreed to in writing, software |
-# distributed under the License is distributed on an "AS IS" BASIS, |
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-# See the License for the specific language governing permissions and |
-# limitations under the License. |
- |
-from collections import OrderedDict |
- |
-import json |
- |
- |
-class ResultType(object): |
- Pass = 'Pass' |
- Failure = 'Failure' |
- ImageOnlyFailure = 'ImageOnlyFailure' |
- Timeout = 'Timeout' |
- Crash = 'Crash' |
- Skip = 'Skip' |
- |
- values = (Pass, Failure, ImageOnlyFailure, Timeout, Crash, Skip) |
- |
- |
-class Result(object): |
- # too many instance attributes pylint: disable=R0902 |
- # too many arguments pylint: disable=R0913 |
- |
- def __init__(self, name, actual, started, took, worker, |
- expected=None, unexpected=False, |
- flaky=False, code=0, out='', err='', pid=0): |
- self.name = name |
- self.actual = actual |
- self.started = started |
- self.took = took |
- self.worker = worker |
- self.expected = expected or [ResultType.Pass] |
- self.unexpected = unexpected |
- self.flaky = flaky |
- self.code = code |
- self.out = out |
- self.err = err |
- self.pid = pid |
- |
- |
-class ResultSet(object): |
- |
- def __init__(self): |
- self.results = [] |
- |
- def add(self, result): |
- self.results.append(result) |
- |
- |
-TEST_SEPARATOR = '.' |
- |
- |
-def make_full_results(metadata, seconds_since_epoch, all_test_names, results): |
- """Convert the typ results to the Chromium JSON test result format. |
- |
- See http://www.chromium.org/developers/the-json-test-results-format |
- """ |
- |
- # We use OrderedDicts here so that the output is stable. |
- full_results = OrderedDict() |
- full_results['version'] = 3 |
- full_results['interrupted'] = False |
- full_results['path_delimiter'] = TEST_SEPARATOR |
- full_results['seconds_since_epoch'] = seconds_since_epoch |
- |
- for md in metadata: |
- key, val = md.split('=', 1) |
- full_results[key] = val |
- |
- passing_tests = _passing_test_names(results) |
- failed_tests = failed_test_names(results) |
- skipped_tests = set(all_test_names) - passing_tests - failed_tests |
- |
- full_results['num_failures_by_type'] = OrderedDict() |
- full_results['num_failures_by_type']['FAIL'] = len(failed_tests) |
- full_results['num_failures_by_type']['PASS'] = len(passing_tests) |
- full_results['num_failures_by_type']['SKIP'] = len(skipped_tests) |
- |
- full_results['tests'] = OrderedDict() |
- |
- for test_name in all_test_names: |
- value = OrderedDict() |
- if test_name in skipped_tests: |
- value['expected'] = 'SKIP' |
- value['actual'] = 'SKIP' |
- else: |
- value['expected'] = 'PASS' |
- value['actual'] = _actual_results_for_test(test_name, results) |
- if value['actual'].endswith('FAIL'): |
- value['is_unexpected'] = True |
- _add_path_to_trie(full_results['tests'], test_name, value) |
- |
- return full_results |
- |
- |
-def make_upload_request(test_results_server, builder, master, testtype, |
- full_results): |
- url = 'http://%s/testfile/upload' % test_results_server |
- attrs = [('builder', builder), |
- ('master', master), |
- ('testtype', testtype)] |
- content_type, data = _encode_multipart_form_data(attrs, full_results) |
- return url, content_type, data |
- |
- |
-def exit_code_from_full_results(full_results): |
- return 1 if num_failures(full_results) else 0 |
- |
- |
-def num_failures(full_results): |
- return full_results['num_failures_by_type']['FAIL'] |
- |
- |
-def failed_test_names(results): |
- names = set() |
- for r in results.results: |
- if r.actual == ResultType.Failure: |
- names.add(r.name) |
- elif r.actual == ResultType.Pass and r.name in names: |
- names.remove(r.name) |
- return names |
- |
- |
-def _passing_test_names(results): |
- return set(r.name for r in results.results if r.actual == ResultType.Pass) |
- |
- |
-def _actual_results_for_test(test_name, results): |
- actuals = [] |
- for r in results.results: |
- if r.name == test_name: |
- if r.actual == ResultType.Failure: |
- actuals.append('FAIL') |
- elif r.actual == ResultType.Pass: |
- actuals.append('PASS') |
- |
- assert actuals, 'We did not find any result data for %s.' % test_name |
- return ' '.join(actuals) |
- |
- |
-def _add_path_to_trie(trie, path, value): |
- if TEST_SEPARATOR not in path: |
- trie[path] = value |
- return |
- directory, rest = path.split(TEST_SEPARATOR, 1) |
- if directory not in trie: |
- trie[directory] = {} |
- _add_path_to_trie(trie[directory], rest, value) |
- |
- |
-def _encode_multipart_form_data(attrs, test_results): |
- # Cloned from webkitpy/common/net/file_uploader.py |
- BOUNDARY = '-J-S-O-N-R-E-S-U-L-T-S---B-O-U-N-D-A-R-Y-' |
- CRLF = '\r\n' |
- lines = [] |
- |
- for key, value in attrs: |
- lines.append('--' + BOUNDARY) |
- lines.append('Content-Disposition: form-data; name="%s"' % key) |
- lines.append('') |
- lines.append(value) |
- |
- lines.append('--' + BOUNDARY) |
- lines.append('Content-Disposition: form-data; name="file"; ' |
- 'filename="full_results.json"') |
- lines.append('Content-Type: application/json') |
- lines.append('') |
- lines.append(json.dumps(test_results)) |
- |
- lines.append('--' + BOUNDARY + '--') |
- lines.append('') |
- body = CRLF.join(lines) |
- content_type = 'multipart/form-data; boundary=%s' % BOUNDARY |
- return content_type, body |