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 gtest_progress_reporter
14 from telemetry.results import html_output_formatter
15 from telemetry.results import json_output_formatter
16 from telemetry.results import page_test_results
17 from telemetry.results import progress_reporter
19 # Allowed output formats. The default is the first item in the list.
20 _OUTPUT_FORMAT_CHOICES = ('html', 'buildbot', 'block', 'csv', 'gtest', 'json',
24 def AddResultsOptions(parser):
25 group = optparse.OptionGroup(parser, 'Results options')
26 group.add_option('--chartjson', action='store_true',
27 help='Output Chart JSON. Ignores --output-format.')
28 group.add_option('--output-format', action='append', dest='output_formats',
29 choices=_OUTPUT_FORMAT_CHOICES, default=[],
30 help='Output format. Defaults to "%%default". '
31 'Can be %s.' % ', '.join(_OUTPUT_FORMAT_CHOICES))
32 group.add_option('-o', '--output',
35 help='Redirects output to a file. Defaults to stdout.')
36 group.add_option('--output-trace-tag',
38 help='Append a tag to the key of each result trace.')
39 group.add_option('--reset-results', action='store_true',
40 help='Delete all stored results.')
41 group.add_option('--upload-results', action='store_true',
42 help='Upload the results to cloud storage.')
43 group.add_option('--results-label',
45 help='Optional label to use for the results of a run .')
46 group.add_option('--suppress_gtest_report',
48 help='Whether to suppress GTest progress report.')
49 parser.add_option_group(group)
52 def _GetOutputStream(output_format, output_file):
53 assert output_format in _OUTPUT_FORMAT_CHOICES, 'Must specify a valid format.'
54 assert output_format not in ('gtest', 'none'), (
55 'Cannot set stream for \'gtest\' or \'none\' output formats.')
57 if output_file is None:
58 if output_format != 'html' and output_format != 'json':
60 output_file = os.path.join(util.GetBaseDir(), 'results.' + output_format)
62 output_file = os.path.expanduser(output_file)
63 open(output_file, 'a').close() # Create file if it doesn't exist.
64 return open(output_file, 'r+')
67 def _GetProgressReporter(output_skipped_tests_summary, suppress_gtest_report):
68 if suppress_gtest_report:
69 return progress_reporter.ProgressReporter()
71 return gtest_progress_reporter.GTestProgressReporter(
72 sys.stdout, output_skipped_tests_summary=output_skipped_tests_summary)
75 def CreateResults(benchmark_metadata, options):
78 options: Contains the options specified in AddResultsOptions.
80 if not options.output_formats:
81 options.output_formats = [_OUTPUT_FORMAT_CHOICES[0]]
83 # TODO(chrishenry): It doesn't make sense to have a single output_file flag
84 # with multiple output formatters. We should explore other possible options:
85 # - Have an output_file per output formatter
86 # - Have --output-dir instead of --output-file
87 if len(options.output_formats) != 1 and options.output_file:
88 raise Exception('Cannot specify output_file flag with multiple output '
91 output_formatters = []
92 for output_format in options.output_formats:
93 if output_format == 'none' or output_format == "gtest" or options.chartjson:
96 output_stream = _GetOutputStream(output_format, options.output_file)
97 if output_format == 'csv':
98 output_formatters.append(csv_output_formatter.CsvOutputFormatter(
100 elif output_format == 'buildbot':
101 output_formatters.append(
102 buildbot_output_formatter.BuildbotOutputFormatter(
103 output_stream, trace_tag=options.output_trace_tag))
104 elif output_format == 'html':
105 # TODO(chrishenry): We show buildbot output so that users can grep
106 # through the results easily without needing to open the html
107 # file. Another option for this is to output the results directly
108 # in gtest-style results (via some sort of progress reporter),
109 # as we plan to enable gtest-style output for all output formatters.
110 output_formatters.append(
111 buildbot_output_formatter.BuildbotOutputFormatter(
112 sys.stdout, trace_tag=options.output_trace_tag))
113 output_formatters.append(html_output_formatter.HtmlOutputFormatter(
114 output_stream, benchmark_metadata, options.reset_results,
115 options.upload_results, options.browser_type,
116 options.results_label, trace_tag=options.output_trace_tag))
117 elif output_format == 'json':
118 output_formatters.append(json_output_formatter.JsonOutputFormatter(
119 output_stream, benchmark_metadata))
120 elif output_format == 'chartjson':
121 output_formatters.append(
122 chart_json_output_formatter.ChartJsonOutputFormatter(
123 output_stream, benchmark_metadata))
125 # Should never be reached. The parser enforces the choices.
126 raise Exception('Invalid --output-format "%s". Valid choices are: %s'
127 % (output_format, ', '.join(_OUTPUT_FORMAT_CHOICES)))
129 # TODO(chrishenry): This is here to not change the output of
130 # gtest. Let's try enabling skipped tests summary for gtest test
131 # results too (in a separate patch), and see if we break anything.
132 output_skipped_tests_summary = 'gtest' in options.output_formats
134 reporter = _GetProgressReporter(output_skipped_tests_summary,
135 options.suppress_gtest_report)
136 return page_test_results.PageTestResults(
137 output_formatters=output_formatters, progress_reporter=reporter)