OLD | NEW |
| (Empty) |
1 # Copyright (c) 2012 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 from collections import defaultdict | |
5 from telemetry.page_test import PageTestResults | |
6 from telemetry.perf_tests_helper import PrintPerfResult | |
7 from telemetry.page_benchmark_value import PageBenchmarkValue | |
8 | |
9 class ValuesForSinglePage(object): | |
10 def __init__(self, page): | |
11 self.page = page | |
12 self.values = [] | |
13 | |
14 def AddValue(self, value): | |
15 self.values.append(value) | |
16 | |
17 @property | |
18 def measurement_names(self): | |
19 return [value.measurement_name for value in self.values] | |
20 | |
21 def FindValueByMeasurementName(self, measurement_name): | |
22 values = [value for value in self.values | |
23 if value.measurement_name == measurement_name] | |
24 assert len(values) <= 1 | |
25 if len(values): | |
26 return values[0] | |
27 return None | |
28 | |
29 def __getitem__(self, trace_name): | |
30 return self.FindValueByTraceName(trace_name) | |
31 | |
32 def __contains__(self, trace_name): | |
33 return self.FindValueByTraceName(trace_name) != None | |
34 | |
35 def FindValueByTraceName(self, trace_name): | |
36 values = [value for value in self.values | |
37 if value.trace_name == trace_name] | |
38 assert len(values) <= 1 | |
39 if len(values): | |
40 return values[0] | |
41 return None | |
42 | |
43 class PageBenchmarkResults(PageTestResults): | |
44 def __init__(self): | |
45 super(PageBenchmarkResults, self).__init__() | |
46 self._page_results = [] | |
47 | |
48 self._all_measurements_that_have_been_seen = {} | |
49 | |
50 self._values_for_current_page = {} | |
51 | |
52 def __getitem__(self, i): | |
53 """Shorthand for self.page_results[i]""" | |
54 return self._page_results[i] | |
55 | |
56 def __len__(self): | |
57 return len(self._page_results) | |
58 | |
59 @property | |
60 def values_for_current_page(self): | |
61 return self._values_for_current_page | |
62 | |
63 @property | |
64 def page_results(self): | |
65 return self._page_results | |
66 | |
67 def WillMeasurePage(self, page): | |
68 self._values_for_current_page = ValuesForSinglePage(page) | |
69 | |
70 @property | |
71 def all_measurements_that_have_been_seen(self): | |
72 return self._all_measurements_that_have_been_seen | |
73 | |
74 def Add(self, trace_name, units, value, chart_name=None, data_type='default'): | |
75 value = PageBenchmarkValue(trace_name, units, value, chart_name, data_type) | |
76 measurement_name = value.measurement_name | |
77 | |
78 # Sanity checks. | |
79 assert measurement_name != 'url', 'The name url cannot be used' | |
80 if measurement_name in self._all_measurements_that_have_been_seen: | |
81 measurement_data = \ | |
82 self._all_measurements_that_have_been_seen[measurement_name] | |
83 last_seen_units = measurement_data['units'] | |
84 last_seen_data_type = measurement_data['type'] | |
85 assert last_seen_units == units, \ | |
86 'Unit cannot change for a name once it has been provided' | |
87 assert last_seen_data_type == data_type, \ | |
88 'Unit cannot change for a name once it has been provided' | |
89 else: | |
90 self._all_measurements_that_have_been_seen[measurement_name] = { | |
91 'units': units, | |
92 'type': data_type} | |
93 | |
94 self._values_for_current_page.AddValue(value) | |
95 | |
96 def DidMeasurePage(self): | |
97 assert self._values_for_current_page, 'Failed to call WillMeasurePage' | |
98 self._page_results.append(self._values_for_current_page) | |
99 self._values_for_current_page = None | |
100 | |
101 def _PrintPerfResult(self, measurement, trace, values, units, | |
102 result_type='default'): | |
103 PrintPerfResult(measurement, trace, values, units, result_type) | |
104 | |
105 def PrintSummary(self, trace_tag): | |
106 if self.page_failures: | |
107 return | |
108 | |
109 # Build the results summary. | |
110 results_summary = defaultdict(list) | |
111 for measurement_name in \ | |
112 self._all_measurements_that_have_been_seen.iterkeys(): | |
113 for page_values in self._page_results: | |
114 value = page_values.FindValueByMeasurementName(measurement_name) | |
115 if not value: | |
116 continue | |
117 measurement_units_type = (measurement_name, | |
118 value.units, | |
119 value.data_type) | |
120 if value.data_type == 'histogram': | |
121 value_url = (value.value, page_values.page.url) | |
122 else: | |
123 value_url = (value.output_value, page_values.page.url) | |
124 results_summary[measurement_units_type].append(value_url) | |
125 | |
126 # Output the results summary sorted by name, then units, then data type. | |
127 for measurement_units_type, value_url_list in sorted( | |
128 results_summary.iteritems()): | |
129 measurement, units, data_type = measurement_units_type | |
130 | |
131 if data_type == 'histogram': | |
132 # For histograms, the _by_url data is important. | |
133 by_url_data_type = 'histogram' | |
134 else: | |
135 # For non-histograms, the _by_url data is unimportant. | |
136 by_url_data_type = 'unimportant' | |
137 if '.' in measurement: | |
138 measurement, trace = measurement.split('.', 1) | |
139 trace += (trace_tag or '') | |
140 else: | |
141 trace = measurement + (trace_tag or '') | |
142 | |
143 if not trace_tag: | |
144 for value, url in value_url_list: | |
145 self._PrintPerfResult(measurement + '_by_url', url, [value], units, | |
146 by_url_data_type) | |
147 | |
148 # For histograms, we don't print the average data, only the _by_url. | |
149 if not data_type == 'histogram': | |
150 values = [i[0] for i in value_url_list] | |
151 self._PrintPerfResult(measurement, trace, values, units, data_type) | |
OLD | NEW |