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 5from telemetry import value as value_module 6from telemetry.results import page_test_results 7from telemetry.value import value_backcompat 8 9class PageMeasurementResults(page_test_results.PageTestResults): 10 def __init__(self, output_stream=None, trace_tag=''): 11 super(PageMeasurementResults, self).__init__(output_stream) 12 self._done = False 13 self._trace_tag = trace_tag 14 15 self._current_page = None 16 self._page_specific_values_for_current_page = None 17 18 self._representative_values_for_each_value_name = {} 19 20 self._all_summary_values = [] 21 self._all_page_specific_values = [] 22 23 @property 24 def pages_that_succeeded(self): 25 pages = set([value.page for value in self._all_page_specific_values]) 26 pages.difference_update(self.pages_that_had_errors_or_failures) 27 return pages 28 29 @property 30 def current_page(self): 31 return self._current_page 32 33 @property 34 def all_value_names_that_have_been_seen(self): 35 return list(self._representative_values_for_each_value_name.keys()) 36 37 def GetUnitsForValueName(self, value_name): 38 return self._representative_values_for_each_value_name[value_name].units 39 40 @property 41 def all_page_specific_values(self): 42 return self._all_page_specific_values 43 44 @property 45 def page_specific_values_for_current_page(self): 46 assert self._current_page 47 return self._page_specific_values_for_current_page 48 49 def WillMeasurePage(self, page): 50 assert not self._current_page 51 self._current_page = page 52 self._page_specific_values_for_current_page = [] 53 54 def Add(self, trace_name, units, value, chart_name=None, data_type='default'): 55 # TODO(isherman): Remove this as well. 56 value = value_backcompat.ConvertOldCallingConventionToValue( 57 self._current_page, 58 trace_name, units, value, chart_name, data_type) 59 self.AddValue(value) 60 61 def AddValue(self, value): 62 self._ValidateValue(value) 63 self._page_specific_values_for_current_page.append(value) 64 self._all_page_specific_values.append(value) 65 66 def AddSummaryValue(self, value): 67 assert value.page is None 68 self._ValidateValue(value) 69 self._all_summary_values.append(value) 70 71 def _ValidateValue(self, value): 72 assert isinstance(value, value_module.Value) 73 74 if value.name not in self._representative_values_for_each_value_name: 75 self._representative_values_for_each_value_name[value.name] = value 76 77 representative_value = self._representative_values_for_each_value_name[ 78 value.name] 79 80 assert value.IsMergableWith(representative_value) 81 82 def DidMeasurePage(self): 83 assert self._current_page, 'Failed to call WillMeasurePage' 84 self._current_page = None 85 self._page_specific_values_for_current_page = None 86 87 88 def FindPageSpecificValuesForPage(self, page, value_name): 89 values = [] 90 for value in self._all_page_specific_values: 91 if value.page == page and value.name == value_name: 92 values.append(value) 93 return values 94 95 96 def FindAllPageSpecificValuesNamed(self, value_name): 97 values = [] 98 for value in self._all_page_specific_values: 99 if value.name == value_name: 100 values.append(value) 101 return values 102