Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / results / results_options.py
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.
4
5 import optparse
6 import os
7 import sys
8
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
19
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')
23
24
25 # Filenames to use for given output formats.
26 _OUTPUT_FILENAME_LOOKUP = {
27     'html': 'results.html',
28     'csv': 'results.csv',
29     'json': 'results.json',
30     'chartjson': 'results-chart.json',
31     'csv-pivot-table': 'results-pivot-table.csv'
32 }
33
34
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',
44                     dest='output_file',
45                     default=None,
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',
50                     default='',
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',
58                     default=None,
59                     help='Optional label to use for the results of a run .')
60   group.add_option('--suppress_gtest_report',
61                    default=False,
62                    help='Whether to suppress GTest progress report.')
63   parser.add_option_group(group)
64
65
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.
69   if args.output_file:
70     parser.error('This flag is deprecated. Please use --output-dir instead.')
71
72   try:
73     os.makedirs(args.output_dir)
74   except OSError:
75     # Do nothing if the output directory already exists. Existing files will
76     # get overwritten.
77     pass
78
79   args.output_dir = os.path.expanduser(args.output_dir)
80
81
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.')
86
87   if output_format == 'buildbot':
88     return sys.stdout
89
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+')
95
96
97 def _GetProgressReporter(output_skipped_tests_summary, suppress_gtest_report):
98   if suppress_gtest_report:
99     return progress_reporter.ProgressReporter()
100
101   return gtest_progress_reporter.GTestProgressReporter(
102       sys.stdout, output_skipped_tests_summary=output_skipped_tests_summary)
103
104
105 def CreateResults(benchmark_metadata, options):
106   """
107   Args:
108     options: Contains the options specified in AddResultsOptions.
109   """
110   if not options.output_formats:
111     options.output_formats = [_OUTPUT_FORMAT_CHOICES[0]]
112
113   output_formatters = []
114   for output_format in options.output_formats:
115     if output_format == 'none' or output_format == "gtest" or options.chartjson:
116       continue
117
118     output_stream = _GetOutputStream(output_format, options.output_dir)
119     if output_format == 'csv':
120       output_formatters.append(csv_output_formatter.CsvOutputFormatter(
121           output_stream))
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))
150     else:
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)))
154
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
159
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)