Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / results / csv_page_measurement_results.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 import csv
5
6 from telemetry.results import page_measurement_results
7 from telemetry.value import merge_values
8
9
10 class CsvPageMeasurementResults(
11     page_measurement_results.PageMeasurementResults):
12   def __init__(self, output_stream, output_after_every_page=None):
13     super(CsvPageMeasurementResults, self).__init__(output_stream)
14     self._results_writer = csv.writer(self._output_stream)
15     self._did_output_header = False
16     self._header_names_written_to_writer = None
17     self._output_after_every_page = output_after_every_page
18
19   def DidMeasurePage(self):
20     try:
21       assert self.page_specific_values_for_current_page != None
22
23       values = self.page_specific_values_for_current_page
24       if not values or not self._output_after_every_page:
25         # Do not output if no results were added on this page or if output flag
26         # is not set.
27         return
28
29       if not self._did_output_header:
30         self._OutputHeader()
31       else:
32         self._ValidateOutputNamesForCurrentPage()
33       self._OutputValuesForPage(values[0].page, values)
34     finally:
35       super(CsvPageMeasurementResults, self).DidMeasurePage()
36
37   def PrintSummary(self):
38     try:
39       if self._output_after_every_page:
40         return
41
42       self._OutputHeader()
43       values = merge_values.MergeLikeValuesFromSamePage(
44           self.all_page_specific_values)
45       value_groups_by_page = merge_values.GroupStably(
46           values, lambda value: value.page.url)
47       for values_for_page in value_groups_by_page:
48         self._OutputValuesForPage(values_for_page[0].page, values_for_page)
49     finally:
50       super(CsvPageMeasurementResults, self).PrintSummary()
51
52   def _ValidateOutputNamesForCurrentPage(self):
53     assert self._did_output_header
54     current_page_value_names = set([
55       value.name for value in self.page_specific_values_for_current_page])
56     header_names_written_to_writer = set(self._header_names_written_to_writer)
57     assert header_names_written_to_writer >= current_page_value_names, \
58         """To use CsvPageMeasurementResults, you must add the same
59 result names for every page. In this case, the following extra results were
60 added:
61 %s
62 """ % (current_page_value_names - header_names_written_to_writer)
63
64   def _OutputHeader(self):
65     assert not self._did_output_header
66     all_value_names = list(
67       self.all_value_names_that_have_been_seen)
68     all_value_names.sort()
69     self._did_output_header = True
70     self._header_names_written_to_writer = list(all_value_names)
71
72     row = ['page_name']
73     for value_name in all_value_names:
74       units = self.GetUnitsForValueName(value_name)
75       row.append('%s (%s)' % (value_name, units))
76     self._results_writer.writerow(row)
77     self._output_stream.flush()
78
79   def _OutputValuesForPage(self, page, page_values):
80     row = [page.display_name]
81     values_by_value_name = {}
82     for value in page_values:
83       values_by_value_name[value.name] = value
84
85     for value_name in self._header_names_written_to_writer:
86       value = values_by_value_name.get(value_name, None)
87       if value and value.GetRepresentativeNumber():
88         row.append('%s' % value.GetRepresentativeNumber())
89       else:
90         row.append('-')
91     self._results_writer.writerow(row)
92     self._output_stream.flush()