• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
5import optparse
6import os
7import sys
8
9from telemetry.core import util
10from telemetry.page import page_measurement
11from telemetry.results import block_page_measurement_results
12from telemetry.results import buildbot_page_measurement_results
13from telemetry.results import csv_page_measurement_results
14from telemetry.results import gtest_test_results
15from telemetry.results import html_page_measurement_results
16from telemetry.results import page_measurement_results
17
18
19# Allowed output formats. The default is the first item in the list.
20_OUTPUT_FORMAT_CHOICES = ('html', 'buildbot', 'block', 'csv', 'gtest', 'none')
21
22
23def 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',
31                    dest='output_file',
32                    help='Redirects output to a file. Defaults to stdout.')
33  group.add_option('--output-trace-tag',
34                    default='',
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',
41                    default=None,
42                    help='Optional label to use for the results of a run .')
43  parser.add_option_group(group)
44
45
46def PrepareResults(test, options):
47  if not isinstance(test, page_measurement.PageMeasurement):
48    # Sort of hacky. The default for non-Measurements should be "gtest."
49    if options.output_format != 'none':
50      options.output_format = 'gtest'
51
52  if options.output_format == 'html' and not options.output_file:
53    options.output_file = os.path.join(util.GetBaseDir(), 'results.html')
54
55  if hasattr(options, 'output_file') and options.output_file:
56    output_file = os.path.expanduser(options.output_file)
57    open(output_file, 'a').close()  # Create file if it doesn't exist.
58    output_stream = open(output_file, 'r+')
59  else:
60    output_stream = sys.stdout
61  if not hasattr(options, 'output_format'):
62    options.output_format = _OUTPUT_FORMAT_CHOICES[0]
63  if not hasattr(options, 'output_trace_tag'):
64    options.output_trace_tag = ''
65
66  if options.output_format == 'none':
67    return page_measurement_results.PageMeasurementResults(
68        output_stream, trace_tag=options.output_trace_tag)
69  elif options.output_format == 'csv':
70    return csv_page_measurement_results.CsvPageMeasurementResults(
71      output_stream, test.results_are_the_same_on_every_page)
72  elif options.output_format == 'block':
73    return block_page_measurement_results.BlockPageMeasurementResults(
74      output_stream)
75  elif options.output_format == 'buildbot':
76    return buildbot_page_measurement_results.BuildbotPageMeasurementResults(
77        output_stream, trace_tag=options.output_trace_tag)
78  elif options.output_format == 'gtest':
79    return gtest_test_results.GTestTestResults(output_stream)
80  elif options.output_format == 'html':
81    return html_page_measurement_results.HtmlPageMeasurementResults(
82        output_stream, test.__class__.__name__, options.reset_results,
83        options.upload_results, options.browser_type,
84        options.results_label, trace_tag=options.output_trace_tag)
85  else:
86    # Should never be reached. The parser enforces the choices.
87    raise Exception('Invalid --output-format "%s". Valid choices are: %s'
88                    % (options.output_format,
89                       ', '.join(_OUTPUT_FORMAT_CHOICES)))
90