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.
5 from telemetry import value as value_module
6 from telemetry.value import list_of_string_values
7 from telemetry.value import none_values
10 class StringValue(value_module.Value):
11 def __init__(self, page, name, units, value, important=True,
12 description=None, none_value_reason=None):
13 """A single value (float, integer or string) result from a test.
15 A test that output a hash of the content in a page might produce a
17 StringValue(page, 'page_hash', 'hash', '74E377FF')
19 super(StringValue, self).__init__(page, name, units, important, description)
20 assert value is None or isinstance(value, basestring)
21 none_values.ValidateNoneValueReason(value, none_value_reason)
23 self.none_value_reason = none_value_reason
27 page_name = self.page.url
30 return 'StringValue(%s, %s, %s, %s, important=%s, description=%s)' % (
38 def GetBuildbotDataType(self, output_context):
39 if self._IsImportantGivenOutputIntent(output_context):
43 def GetBuildbotValue(self):
44 # Buildbot's print_perf_results method likes to get lists for all values,
45 # even when they are scalar, so list-ize the return value.
48 def GetRepresentativeNumber(self):
51 def GetRepresentativeString(self):
52 return str(self.value)
55 def GetJSONTypeName():
59 d = super(StringValue, self).AsDict()
60 d['value'] = self.value
62 if self.none_value_reason is not None:
63 d['none_value_reason'] = self.none_value_reason
68 def FromDict(value_dict, page_dict):
69 kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict)
70 kwargs['value'] = value_dict['value']
72 if 'none_value_reason' in value_dict:
73 kwargs['none_value_reason'] = value_dict['none_value_reason']
75 return StringValue(**kwargs)
78 def MergeLikeValuesFromSamePage(cls, values):
79 assert len(values) > 0
81 return cls._MergeLikeValues(values, v0.page, v0.name)
84 def MergeLikeValuesFromDifferentPages(cls, values,
85 group_by_name_suffix=False):
86 assert len(values) > 0
88 name = v0.name_suffix if group_by_name_suffix else v0.name
89 return cls._MergeLikeValues(values, None, name)
92 def _MergeLikeValues(cls, values, page, name):
94 merged_value = [v.value for v in values]
95 none_value_reason = None
96 if None in merged_value:
98 none_value_reason = none_values.MERGE_FAILURE_REASON
99 return list_of_string_values.ListOfStringValues(
100 page, name, v0.units, merged_value, important=v0.important,
101 none_value_reason=none_value_reason)