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