OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 """ | |
7 This is a script for generating JSON from JUnit XML output (generated by | |
8 google tests with --gtest_output=xml option). | |
9 """ | |
10 import logging | |
11 import optparse | |
12 import os | |
13 import sys | |
14 import time | |
15 | |
16 from xml.dom import minidom | |
17 | |
18 from layout_package import json_results_generator | |
19 from layout_package import path_utils | |
20 from layout_package import test_expectations | |
21 | |
22 # Builder base URL where we have the archived test results. | |
23 BUILDER_BASE_URL = "http://build.chromium.org/buildbot/gtest-results/" | |
24 | |
25 | |
26 class JSONGeneratorFromXML(object): | |
27 | |
28 def __init__(self, options): | |
29 self._options = options | |
30 | |
31 # Check the results directory | |
32 if not os.path.exists(self._options.results_directory): | |
33 os.mkdir(self._options.results_directory) | |
34 | |
35 results_xml_file = None | |
36 try: | |
37 results_xml_file = open(self._options.input_results_xml) | |
38 except IOError, e: | |
39 logging.fatal("Cannot open file %s", | |
40 self._options.input_results_xml) | |
41 sys.exit(1) | |
42 | |
43 summary = self._ParseTestResultsXML( | |
44 minidom.parse(results_xml_file).documentElement) | |
45 results_xml_file.close() | |
46 | |
47 json_results_generator.JSONResultsGenerator( | |
48 self._options.builder_name, self._options.build_name, | |
49 self._options.build_number, self._options.results_directory, | |
50 self._options.builder_base_url, | |
51 self._test_timings, | |
52 self._failures, self._passed_tests, self._skipped_tests, | |
53 self._tests_list) | |
54 | |
55 def _ParseTestResultsXML(self, node): | |
56 self._tests_list = set() | |
57 self._passed_tests = set() | |
58 self._skipped_tests = set() | |
59 self._test_timings = {} | |
60 self._failures = {} | |
61 | |
62 testcases = node.getElementsByTagName('testcase') | |
63 for testcase in testcases: | |
64 name = testcase.getAttribute('name') | |
65 classname = testcase.getAttribute('classname') | |
66 test_name = "%s.%s" % (classname, name) | |
67 | |
68 status = testcase.getAttribute('status') | |
69 if status == 'notrun': | |
70 if name.startswith('DISABLED_'): | |
71 self._skipped_tests.add(test_name) | |
72 continue | |
73 | |
74 failures = testcase.getElementsByTagName('failure') | |
75 if failures: | |
76 self._failures[test_name] = test_expectations.TEXT | |
77 else: | |
78 self._passed_tests.add(test_name) | |
79 | |
80 self._test_timings[test_name] = float( | |
81 testcase.getAttribute('time')) | |
82 self._tests_list.add(test_name) | |
83 | |
84 | |
85 def main(options, args): | |
86 """Parse the tests results and generate JSON files. | |
87 | |
88 Args: | |
89 options: a dictionary of command line options | |
90 args: a list of sub directories or files to test | |
91 """ | |
92 | |
93 if not options.test_type: | |
94 logging.error("--test-type needs to be specified.") | |
95 sys.exit(1) | |
96 | |
97 canon_test_type = options.test_type.replace("-", "_") | |
98 if not options.input_results_xml: | |
99 options.input_results_xml = "%s.xml" % (canon_test_type) | |
100 if not options.builder_base_url: | |
101 options.builder_base_url = "%s%s/" % (BUILDER_BASE_URL, | |
102 options.test_type) | |
103 | |
104 JSONGeneratorFromXML(options) | |
105 | |
106 return | |
107 | |
108 if '__main__' == __name__: | |
109 option_parser = optparse.OptionParser() | |
110 option_parser.add_option("", "--test-type", default="", | |
111 help="Test type that generated the results XML," | |
112 " e.g. unit-tests.") | |
113 option_parser.add_option("", "--results-directory", default="./", | |
114 help="Output results directory source dir.") | |
115 option_parser.add_option("", "--input-results-xml", default="", | |
116 help="Test results xml file (input for us)." | |
117 " default is TEST_TYPE.xml") | |
118 option_parser.add_option("", "--builder-base-url", default="", | |
119 help=("A URL where we have the archived test " | |
120 "results. (default=%sTEST_TYPE_results/)" | |
121 % BUILDER_BASE_URL)) | |
122 option_parser.add_option("", "--builder-name", | |
123 default="DUMMY_BUILDER_NAME", | |
124 help="The name of the builder shown on the " | |
125 "waterfall running this script e.g. WebKit.") | |
126 option_parser.add_option("", "--build-name", | |
127 default="DUMMY_BUILD_NAME", | |
128 help="The name of the builder used in its path, " | |
129 "e.g. webkit-rel.") | |
130 option_parser.add_option("", "--build-number", | |
131 default="DUMMY_BUILD_NUMBER", | |
132 help="The build number of the builder running" | |
133 "this script.") | |
134 options, args = option_parser.parse_args() | |
135 main(options, args) | |
OLD | NEW |