Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / value / list_of_scalar_values.py
1 # Copyright 2013 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
5 import numbers
6
7 from telemetry import value as value_module
8 from telemetry.value import none_values
9
10
11 def _Mean(values):
12   return float(sum(values)) / len(values) if len(values) > 0 else 0.0
13
14
15 class ListOfScalarValues(value_module.Value):
16   def __init__(self, page, name, units, values,
17                important=True, description=None, none_value_reason=None,
18                same_page_merge_policy=value_module.CONCATENATE):
19     super(ListOfScalarValues, self).__init__(page, name, units, important,
20                                              description)
21     if values is not None:
22       assert isinstance(values, list)
23       assert len(values) > 0
24       assert all(isinstance(v, numbers.Number) for v in values)
25     none_values.ValidateNoneValueReason(values, none_value_reason)
26     self.values = values
27     self.none_value_reason = none_value_reason
28     self.same_page_merge_policy = same_page_merge_policy
29
30   def __repr__(self):
31     if self.page:
32       page_name = self.page.url
33     else:
34       page_name = None
35     if self.same_page_merge_policy == value_module.CONCATENATE:
36       merge_policy = 'CONCATENATE'
37     else:
38       merge_policy = 'PICK_FIRST'
39     return ('ListOfScalarValues(%s, %s, %s, %s, '
40             'important=%s, description=%s, same_page_merge_policy=%s)') % (
41               page_name,
42               self.name,
43               self.units,
44               repr(self.values),
45               self.important,
46               self.description,
47               merge_policy)
48
49   def GetBuildbotDataType(self, output_context):
50     if self._IsImportantGivenOutputIntent(output_context):
51       return 'default'
52     return 'unimportant'
53
54   def GetBuildbotValue(self):
55     return self.values
56
57   def GetRepresentativeNumber(self):
58     return _Mean(self.values)
59
60   def GetRepresentativeString(self):
61     return repr(self.values)
62
63   def IsMergableWith(self, that):
64     return (super(ListOfScalarValues, self).IsMergableWith(that) and
65             self.same_page_merge_policy == that.same_page_merge_policy)
66
67   @staticmethod
68   def GetJSONTypeName():
69     return 'list_of_scalar_values'
70
71   def AsDict(self):
72     d = super(ListOfScalarValues, self).AsDict()
73     d['values'] = self.values
74
75     if self.none_value_reason is not None:
76       d['none_value_reason'] = self.none_value_reason
77
78     return d
79
80   @staticmethod
81   def FromDict(value_dict, page_dict):
82     kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict)
83     kwargs['values'] = value_dict['values']
84
85     if 'none_value_reason' in value_dict:
86       kwargs['none_value_reason'] = value_dict['none_value_reason']
87
88     return ListOfScalarValues(**kwargs)
89
90   @classmethod
91   def MergeLikeValuesFromSamePage(cls, values):
92     assert len(values) > 0
93     v0 = values[0]
94
95     if v0.same_page_merge_policy == value_module.PICK_FIRST:
96       return ListOfScalarValues(
97           v0.page, v0.name, v0.units,
98           values[0].values,
99           important=v0.important,
100           same_page_merge_policy=v0.same_page_merge_policy,
101           none_value_reason=v0.none_value_reason)
102
103     assert v0.same_page_merge_policy == value_module.CONCATENATE
104     return cls._MergeLikeValues(values, v0.page, v0.name)
105
106   @classmethod
107   def MergeLikeValuesFromDifferentPages(cls, values,
108                                         group_by_name_suffix=False):
109     assert len(values) > 0
110     v0 = values[0]
111     name = v0.name_suffix if group_by_name_suffix else v0.name
112     return cls._MergeLikeValues(values, None, name)
113
114   @classmethod
115   def _MergeLikeValues(cls, values, page, name):
116     v0 = values[0]
117     merged_values = []
118     none_value_reason = None
119     for v in values:
120       if v.values is None:
121         merged_values = None
122         none_value_reason = none_values.MERGE_FAILURE_REASON
123         break
124       merged_values.extend(v.values)
125     return ListOfScalarValues(
126         page, name, v0.units,
127         merged_values,
128         important=v0.important,
129         same_page_merge_policy=v0.same_page_merge_policy,
130         none_value_reason=none_value_reason)