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 csv_output_formatter
12 from telemetry.results import gtest_progress_reporter
13 from telemetry.results import html_output_formatter
14 from telemetry.results import json_output_formatter
15 from telemetry.results import page_test_results
16 from telemetry.results import progress_reporter
18 # Allowed output formats. The default is the first item in the list.
19 _OUTPUT_FORMAT_CHOICES = ('html', 'buildbot', 'block', 'csv', 'gtest',
23 def AddResultsOptions(parser):
24 group = optparse.OptionGroup(parser, 'Results options')
25 group.add_option('--output-format',
26 default=_OUTPUT_FORMAT_CHOICES[0],
27 choices=_OUTPUT_FORMAT_CHOICES,
28 help='Output format. Defaults to "%%default". '
29 'Can be %s.' % ', '.join(_OUTPUT_FORMAT_CHOICES))
30 group.add_option('-o', '--output',
32 help='Redirects output to a file. Defaults to stdout.')
33 group.add_option('--output-trace-tag',
35 help='Append a tag to the key of each result trace.')
36 group.add_option('--reset-results', action='store_true',
37 help='Delete all stored results.')
38 group.add_option('--upload-results', action='store_true',
39 help='Upload the results to cloud storage.')
40 group.add_option('--results-label',
42 help='Optional label to use for the results of a run .')
43 group.add_option('--suppress_gtest_report',
45 help='Whether to suppress GTest progress report.')
46 parser.add_option_group(group)
49 def CreateResults(metadata, options):
52 options: Contains the options specified in AddResultsOptions.
54 # TODO(chrishenry): This logic prevents us from having multiple
55 # OutputFormatters. We should have an output_file per OutputFormatter.
56 # Maybe we should have --output-dir instead of --output-file?
57 if options.output_format == 'html' and not options.output_file:
58 options.output_file = os.path.join(util.GetBaseDir(), 'results.html')
59 elif options.output_format == 'json' and not options.output_file:
60 options.output_file = os.path.join(util.GetBaseDir(), 'results.json')
62 if hasattr(options, 'output_file') and options.output_file:
63 output_file = os.path.expanduser(options.output_file)
64 open(output_file, 'a').close() # Create file if it doesn't exist.
65 output_stream = open(output_file, 'r+')
67 output_stream = sys.stdout
68 if not hasattr(options, 'output_format'):
69 options.output_format = _OUTPUT_FORMAT_CHOICES[0]
70 if not hasattr(options, 'output_trace_tag'):
71 options.output_trace_tag = ''
73 output_formatters = []
74 output_skipped_tests_summary = True
76 if options.output_format == 'none':
78 elif options.output_format == 'csv':
79 output_formatters.append(csv_output_formatter.CsvOutputFormatter(
81 elif options.output_format == 'buildbot':
82 output_formatters.append(buildbot_output_formatter.BuildbotOutputFormatter(
83 output_stream, trace_tag=options.output_trace_tag))
84 elif options.output_format == 'gtest':
85 # TODO(chrishenry): This is here to not change the output of
86 # gtest. Let's try enabling skipped tests summary for gtest test
87 # results too (in a separate patch), and see if we break anything.
88 output_skipped_tests_summary = False
89 elif options.output_format == 'html':
90 # TODO(chrishenry): We show buildbot output so that users can grep
91 # through the results easily without needing to open the html
92 # file. Another option for this is to output the results directly
93 # in gtest-style results (via some sort of progress reporter),
94 # as we plan to enable gtest-style output for all output formatters.
95 output_formatters.append(buildbot_output_formatter.BuildbotOutputFormatter(
96 sys.stdout, trace_tag=options.output_trace_tag))
97 output_formatters.append(html_output_formatter.HtmlOutputFormatter(
98 output_stream, metadata, options.reset_results,
99 options.upload_results, options.browser_type,
100 options.results_label, trace_tag=options.output_trace_tag))
101 elif options.output_format == 'json':
102 output_formatters.append(
103 json_output_formatter.JsonOutputFormatter(output_stream, metadata))
105 # Should never be reached. The parser enforces the choices.
106 raise Exception('Invalid --output-format "%s". Valid choices are: %s'
107 % (options.output_format,
108 ', '.join(_OUTPUT_FORMAT_CHOICES)))
110 if options.suppress_gtest_report:
111 reporter = progress_reporter.ProgressReporter()
113 reporter = gtest_progress_reporter.GTestProgressReporter(
114 sys.stdout, output_skipped_tests_summary=output_skipped_tests_summary)
115 return page_test_results.PageTestResults(
116 output_formatters=output_formatters, progress_reporter=reporter)