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