blob: 51d9982d7bc89d492025aae6946e623350204de5 [file] [log] [blame]
Patrik Höglundcb0b8742019-11-18 13:46:38 +01001#!/usr/bin/env python
2# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3#
4# Use of this source code is governed by a BSD-style license
5# that can be found in the LICENSE file in the root of the source
6# tree. An additional intellectual property rights grant can be found
7# in the file PATENTS. All contributing project authors may
8# be found in the AUTHORS file in the root of the source tree.
9
10import os
11import sys
12
13SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
14CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))
15sys.path.insert(0, os.path.join(CHECKOUT_ROOT, 'third_party', 'catapult',
16 'tracing'))
17sys.path.append(os.path.join(CHECKOUT_ROOT, 'third_party', 'pymock'))
18
19import json
20import mock
21import unittest
22
23import histogram_util as u
24
25from tracing.value import histogram
26from tracing.value.diagnostics import generic_set
27from tracing.value.diagnostics import reserved_infos
28
29
30class HistogramUploaderUnittest(unittest.TestCase):
31
32 def testLoadHistogramsWithValues(self):
33 data = json.loads("""
34 {
35 "format_version": "1.0",
36 "charts": {
37 "audio_score": {
38 "AV": {
39 "type": "scalar",
40 "values": [0.6, 0.5, 0.7],
41 "units": "unitless_biggerIsBetter"
42 }
43 }
44 }
45 }
46 """)
47 stats = u.LoadHistograms(data)
48 self.assertEqual(len(stats), 1)
49 self.assertEqual(stats[0].name, "audio_score")
50 self.assertEqual(stats[0].unit, "unitless_biggerIsBetter")
51 self.assertEqual(stats[0].sample_values, [0.6, 0.5, 0.7])
52
53 def testLoadHistogramsWithValue(self):
54 data = json.loads("""
55 {
56 "format_version": "1.0",
57 "charts": {
58 "audio_score": {
59 "AV": {
60 "type": "scalar",
61 "value": 0.3,
62 "units": "unitless_biggerIsBetter"
63 }
64 }
65 }
66 }
67 """)
68 stats = u.LoadHistograms(data)
69 self.assertEqual(len(stats), 1)
70 self.assertEqual(stats[0].name, "audio_score")
71 self.assertEqual(stats[0].unit, "unitless_biggerIsBetter")
72 self.assertEqual(stats[0].sample_values, [0.3])
73
74 def testLoadHistogramsWithUnknownUnit(self):
75 data = json.loads("""
76 {
77 "format_version": "1.0",
78 "charts": {
79 "audio_score": {
80 "AV": {
81 "type": "scalar",
82 "value": 0.3,
83 "units": "good_score_biggerIsBetter"
84 }
85 }
86 }
87 }
88 """)
89 stats = u.LoadHistograms(data)
90 self.assertEqual(len(stats), 1)
91 self.assertEqual(stats[0].name, "audio_score")
92 self.assertEqual(stats[0].unit, "unitless")
93 self.assertEqual(stats[0].sample_values, [0.3])
94
95 def testLoadHistogramsWithStd(self):
96 data = json.loads("""
97 {
98 "format_version": "1.0",
99 "charts": {
100 "audio_score": {
101 "AV": {
102 "type": "scalar",
103 "value": 0.3,
104 "std": 0.1,
105 "units": "unitless",
106 "higher_is_better": true
107 }
108 }
109 }
110 }
111 """)
112 stats = u.LoadHistograms(data)
113 self.assertEqual(len(stats), 1)
114 self.assertEqual(stats[0].name, "audio_score")
115 self.assertEqual(stats[0].unit, "unitless_biggerIsBetter")
116 self.assertEqual(stats[0].sample_values, [0.3])
117
118 def testLoadHistogramsMsBiggerIsBetter(self):
119 data = json.loads("""
120 {
121 "format_version": "1.0",
122 "charts": {
123 "audio_score": {
124 "AV": {
125 "type": "scalar",
126 "value": 0.3,
127 "std": 0.1,
128 "units": "ms",
129 "improvement_direction": "bigger_is_better"
130 }
131 }
132 }
133 }
134 """)
135 stats = u.LoadHistograms(data)
136 self.assertEqual(len(stats), 1)
137 self.assertEqual(stats[0].name, "audio_score")
138 self.assertEqual(stats[0].unit, "msBestFitFormat_biggerIsBetter")
139 self.assertEqual(stats[0].sample_values, [0.3])
140
141 def testLoadHistogramsBps(self):
142 data = json.loads("""
143 {
144 "format_version": "1.0",
145 "charts": {
146 "audio_score": {
147 "AV": {
148 "type": "scalar",
149 "values": [240, 160],
150 "std": 0.1,
151 "units": "bps"
152 }
153 }
154 }
155 }
156 """)
157 stats = u.LoadHistograms(data)
158 self.assertEqual(len(stats), 1)
159 self.assertEqual(stats[0].name, "audio_score")
160 self.assertEqual(stats[0].unit, "bytesPerSecond")
161 self.assertEqual(stats[0].sample_values, [30, 20])
162
163 def testMakeWebRtcHistogramSet(self):
164 h = histogram.Histogram("audio_score", "unitless_biggerIsBetter",
165 histogram.HistogramBinBoundaries.SINGULAR)
166 h.AddSample(0.5)
167 h.diagnostics[reserved_infos.STORIES.name] = generic_set.GenericSet(["AV"])
168 h.CustomizeSummaryOptions({
169 "std": False,
170 "avg": False,
171 "count": False,
172 "max": False,
173 "min": False,
174 "sum": False
175 })
176 stats = [h]
177 build_url = ('https://ci.chromium.org/p/webrtc/builders/ci/'
178 'Android64%20%28M%20Nexus5X%29%28dbg%29')
179 hs = u.MakeWebRtcHistogramSet(
180 stats, commit_pos=123456789,
181 commit_hash="da39a3ee5e6b4b0d3255bfef95601890afd80709",
182 master="master", bot="bot", test_suite="webrtc_test_suite",
183 build_url=build_url)
184
185 expected = [{
186 "guid": mock.ANY,
187 "type": "GenericSet",
188 "values": [123456789]
189 }, {
190 "guid": mock.ANY,
191 "type": "GenericSet",
192 "values": ["webrtc_test_suite"]
193 }, {
194 "guid": mock.ANY,
195 "type": "GenericSet",
196 "values": ["bot"]
197 }, {
198 "guid": mock.ANY,
199 "type": "GenericSet",
200 "values": ["master"]
201 }, {
202 "guid": mock.ANY,
203 "type": "GenericSet",
204 "values": ["da39a3ee5e6b4b0d3255bfef95601890afd80709"]
205 }, {
206 "guid": mock.ANY,
207 "type": "GenericSet",
208 "values": [build_url]
209 }, {
210 "sampleValues": [0.5],
211 "name": "audio_score",
212 "running": [1, 0.5, -0.6931471805599453, 0.5, 0.5, 0.5, 0],
213 "diagnostics": {
214 "benchmarks": mock.ANY,
215 "bots": mock.ANY,
216 "buildUrls": mock.ANY,
217 "pointId": mock.ANY,
218 "masters": mock.ANY,
219 "stories": {
220 "type": "GenericSet",
221 "values": ["AV"]
222 },
223 "webrtcRevisions": mock.ANY
224 },
225 "allBins": [[1]],
226 "summaryOptions": {
227 "avg": False,
228 "count": False,
229 "max": False,
230 "min": False,
231 "std": False,
232 "sum": False
233 },
234 "unit": "unitless_biggerIsBetter"
235 }]
236 self.maxDiff = None # pylint: disable=C0103
237 self.assertItemsEqual(expected, hs.AsDicts())
238
239
240if __name__ == "__main__":
241 unittest.main()