• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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