blob: ccd49d28f92d6edc078b34d0ad40615da9c215ce [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
from telemetry.value import summary as summary_module
class OutputFormatter(object):
"""A formatter for PageTestResults.
An OutputFormatter takes PageTestResults, formats the results
(telemetry.value.Value instances), and output the formatted results
in the given output stream.
Examples of output formatter: CsvOutputFormatter produces results in
CSV format."""
def __init__(self, output_stream):
"""Constructs a new formatter that writes to the output_stream.
Args:
output_stream: The stream to write the formatted output to.
"""
self._output_stream = output_stream
def Format(self, page_test_results):
"""Formats the given PageTestResults into the output stream.
This will be called once at the end of a benchmark.
Args:
page_test_results: A PageTestResults object containing all results
from the current benchmark run.
"""
raise NotImplementedError()
def PrintViewResults(self):
print 'View result at file://' + os.path.abspath(self.output_stream.name)
def FormatDisabled(self):
"""Formats disabled results into the output stream.
This will be called once when a benchmark is run but disabled.
"""
pass
@property
def output_stream(self):
return self._output_stream
def SummarizePageSpecificValues(page_specific_values):
"""Summarize results appropriately for TBM and legacy benchmarks.
For benchmarks that are timeline-based, we need to summarize not once, but
twice, once by name and tir_label (default) and again by name only. But for
benchmarks that are not timeline-based, since no tir_labels are set, we will
end up duplicating values.
Thus, we only want to summarize once if the benchmark is not timeline-based,
but twice, using the two different key functions, otherwise.
"""
# Default summary uses merge_values.DefaultKeyFunc to summarize both by name
# and tir_label.
summary = summary_module.Summary(page_specific_values)
values = summary.interleaved_computed_per_page_values_and_summaries
if any(v.tir_label for v in page_specific_values):
summary_by_name_only = summary_module.Summary(
page_specific_values,
key_func=lambda v: v.name)
values.extend(
summary_by_name_only.interleaved_computed_per_page_values_and_summaries
)
return values