1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
9 from telemetry.core import util
10 from telemetry.results import buildbot_output_formatter
11 from telemetry.results import chart_json_output_formatter
12 from telemetry.results import csv_output_formatter
13 from telemetry.results import csv_pivot_table_output_formatter
14 from telemetry.results import gtest_progress_reporter
15 from telemetry.results import html_output_formatter
16 from telemetry.results import json_output_formatter
17 from telemetry.results import page_test_results
18 from telemetry.results import progress_reporter
20 # Allowed output formats. The default is the first item in the list.
21 _OUTPUT_FORMAT_CHOICES = ('html', 'buildbot', 'csv', 'gtest', 'json',
22 'chartjson', 'csv-pivot-table', 'none')
25 # Filenames to use for given output formats.
26 _OUTPUT_FILENAME_LOOKUP = {
27 'html': 'results.html',
29 'json': 'results.json',
30 'chartjson': 'results-chart.json',
31 'csv-pivot-table': 'results-pivot-table.csv'
35 def AddResultsOptions(parser):
36 group = optparse.OptionGroup(parser, 'Results options')
37 group.add_option('--chartjson', action='store_true',
38 help='Output Chart JSON. Ignores --output-format.')
39 group.add_option('--output-format', action='append', dest='output_formats',
40 choices=_OUTPUT_FORMAT_CHOICES, default=[],
41 help='Output format. Defaults to "%%default". '
42 'Can be %s.' % ', '.join(_OUTPUT_FORMAT_CHOICES))
43 group.add_option('-o', '--output',
46 help='Redirects output to a file. Defaults to stdout.')
47 group.add_option('--output-dir', default=util.GetBaseDir(),
48 help='Where to save output data after the run.')
49 group.add_option('--output-trace-tag',
51 help='Append a tag to the key of each result trace. Use '
52 'with html, buildbot, csv-pivot-table output formats.')
53 group.add_option('--reset-results', action='store_true',
54 help='Delete all stored results.')
55 group.add_option('--upload-results', action='store_true',
56 help='Upload the results to cloud storage.')
57 group.add_option('--results-label',
59 help='Optional label to use for the results of a run .')
60 group.add_option('--suppress_gtest_report',
62 help='Whether to suppress GTest progress report.')
63 parser.add_option_group(group)
66 def ProcessCommandLineArgs(parser, args):
67 # TODO(ariblue): Delete this flag entirely at some future data, when the
68 # existence of such a flag has been long forgotten.
70 parser.error('This flag is deprecated. Please use --output-dir instead.')
73 os.makedirs(args.output_dir)
75 # Do nothing if the output directory already exists. Existing files will
79 args.output_dir = os.path.expanduser(args.output_dir)
82 def _GetOutputStream(output_format, output_dir):
83 assert output_format in _OUTPUT_FORMAT_CHOICES, 'Must specify a valid format.'
84 assert output_format not in ('gtest', 'none'), (
85 'Cannot set stream for \'gtest\' or \'none\' output formats.')
87 if output_format == 'buildbot':
90 assert output_format in _OUTPUT_FILENAME_LOOKUP, (
91 'No known filename for the \'%s\' output format' % output_format)
92 output_file = os.path.join(output_dir, _OUTPUT_FILENAME_LOOKUP[output_format])
93 open(output_file, 'a').close() # Create file if it doesn't exist.
94 return open(output_file, 'r+')
97 def _GetProgressReporter(output_skipped_tests_summary, suppress_gtest_report):
98 if suppress_gtest_report:
99 return progress_reporter.ProgressReporter()
101 return gtest_progress_reporter.GTestProgressReporter(
102 sys.stdout, output_skipped_tests_summary=output_skipped_tests_summary)
105 def CreateResults(benchmark_metadata, options):
108 options: Contains the options specified in AddResultsOptions.
110 if not options.output_formats:
111 options.output_formats = [_OUTPUT_FORMAT_CHOICES[0]]
113 output_formatters = []
114 for output_format in options.output_formats:
115 if output_format == 'none' or output_format == "gtest" or options.chartjson:
118 output_stream = _GetOutputStream(output_format, options.output_dir)
119 if output_format == 'csv':
120 output_formatters.append(csv_output_formatter.CsvOutputFormatter(
122 elif output_format == 'csv-pivot-table':
123 output_formatters.append(
124 csv_pivot_table_output_formatter.CsvPivotTableOutputFormatter(
125 output_stream, trace_tag=options.output_trace_tag))
126 elif output_format == 'buildbot':
127 output_formatters.append(
128 buildbot_output_formatter.BuildbotOutputFormatter(
129 output_stream, trace_tag=options.output_trace_tag))
130 elif output_format == 'html':
131 # TODO(chrishenry): We show buildbot output so that users can grep
132 # through the results easily without needing to open the html
133 # file. Another option for this is to output the results directly
134 # in gtest-style results (via some sort of progress reporter),
135 # as we plan to enable gtest-style output for all output formatters.
136 output_formatters.append(
137 buildbot_output_formatter.BuildbotOutputFormatter(
138 sys.stdout, trace_tag=options.output_trace_tag))
139 output_formatters.append(html_output_formatter.HtmlOutputFormatter(
140 output_stream, benchmark_metadata, options.reset_results,
141 options.upload_results, options.browser_type,
142 options.results_label, trace_tag=options.output_trace_tag))
143 elif output_format == 'json':
144 output_formatters.append(json_output_formatter.JsonOutputFormatter(
145 output_stream, options.output_dir, benchmark_metadata))
146 elif output_format == 'chartjson':
147 output_formatters.append(
148 chart_json_output_formatter.ChartJsonOutputFormatter(
149 output_stream, benchmark_metadata))
151 # Should never be reached. The parser enforces the choices.
152 raise Exception('Invalid --output-format "%s". Valid choices are: %s'
153 % (output_format, ', '.join(_OUTPUT_FORMAT_CHOICES)))
155 # TODO(chrishenry): This is here to not change the output of
156 # gtest. Let's try enabling skipped tests summary for gtest test
157 # results too (in a separate patch), and see if we break anything.
158 output_skipped_tests_summary = 'gtest' in options.output_formats
160 reporter = _GetProgressReporter(output_skipped_tests_summary,
161 options.suppress_gtest_report)
162 return page_test_results.PageTestResults(
163 output_formatters=output_formatters, progress_reporter=reporter)