| #!/usr/bin/env python |
| # Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. |
| # |
| # Use of this source code is governed by a BSD-style license |
| # that can be found in the LICENSE file in the root of the source |
| # tree. An additional intellectual property rights grant can be found |
| # in the file PATENTS. All contributing project authors may |
| # be found in the AUTHORS file in the root of the source tree. |
| |
| import os |
| import sys |
| |
| SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) |
| CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) |
| sys.path.insert(0, os.path.join(CHECKOUT_ROOT, 'third_party', 'catapult', |
| 'tracing')) |
| sys.path.append(os.path.join(CHECKOUT_ROOT, 'third_party', 'pymock')) |
| |
| import json |
| import mock |
| import unittest |
| |
| import histogram_util as u |
| |
| from tracing.value import histogram |
| from tracing.value.diagnostics import generic_set |
| from tracing.value.diagnostics import reserved_infos |
| |
| |
| class HistogramUploaderUnittest(unittest.TestCase): |
| |
| def testLoadHistogramsWithValues(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "values": [0.6, 0.5, 0.7], |
| "units": "unitless_biggerIsBetter" |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "unitless_biggerIsBetter") |
| self.assertEqual(stats[0].sample_values, [0.6, 0.5, 0.7]) |
| |
| def testLoadHistogramsWithValue(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "value": 0.3, |
| "units": "unitless_biggerIsBetter" |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "unitless_biggerIsBetter") |
| self.assertEqual(stats[0].sample_values, [0.3]) |
| |
| def testLoadHistogramsWithUnknownUnit(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "value": 0.3, |
| "units": "good_score_biggerIsBetter" |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "unitless") |
| self.assertEqual(stats[0].sample_values, [0.3]) |
| |
| def testLoadHistogramsWithStd(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "value": 0.3, |
| "std": 0.1, |
| "units": "unitless", |
| "higher_is_better": true |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "unitless_biggerIsBetter") |
| self.assertEqual(stats[0].sample_values, [0.3]) |
| |
| def testLoadHistogramsMsBiggerIsBetter(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "value": 0.3, |
| "std": 0.1, |
| "units": "ms", |
| "improvement_direction": "bigger_is_better" |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "msBestFitFormat_biggerIsBetter") |
| self.assertEqual(stats[0].sample_values, [0.3]) |
| |
| def testLoadHistogramsBps(self): |
| data = json.loads(""" |
| { |
| "format_version": "1.0", |
| "charts": { |
| "audio_score": { |
| "AV": { |
| "type": "scalar", |
| "values": [240, 160], |
| "std": 0.1, |
| "units": "bps" |
| } |
| } |
| } |
| } |
| """) |
| stats = u.LoadHistograms(data) |
| self.assertEqual(len(stats), 1) |
| self.assertEqual(stats[0].name, "audio_score") |
| self.assertEqual(stats[0].unit, "bytesPerSecond") |
| self.assertEqual(stats[0].sample_values, [30, 20]) |
| |
| def testMakeWebRtcHistogramSet(self): |
| h = histogram.Histogram("audio_score", "unitless_biggerIsBetter", |
| histogram.HistogramBinBoundaries.SINGULAR) |
| h.AddSample(0.5) |
| h.diagnostics[reserved_infos.STORIES.name] = generic_set.GenericSet(["AV"]) |
| h.CustomizeSummaryOptions({ |
| "std": False, |
| "avg": False, |
| "count": False, |
| "max": False, |
| "min": False, |
| "sum": False |
| }) |
| stats = [h] |
| build_url = ('https://ci.chromium.org/p/webrtc/builders/ci/' |
| 'Android64%20%28M%20Nexus5X%29%28dbg%29') |
| hs = u.MakeWebRtcHistogramSet( |
| stats, commit_pos=123456789, |
| commit_hash="da39a3ee5e6b4b0d3255bfef95601890afd80709", |
| master="master", bot="bot", test_suite="webrtc_test_suite", |
| build_url=build_url) |
| |
| expected = [{ |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": [123456789] |
| }, { |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": ["webrtc_test_suite"] |
| }, { |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": ["bot"] |
| }, { |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": ["master"] |
| }, { |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": ["da39a3ee5e6b4b0d3255bfef95601890afd80709"] |
| }, { |
| "guid": mock.ANY, |
| "type": "GenericSet", |
| "values": [build_url] |
| }, { |
| "sampleValues": [0.5], |
| "name": "audio_score", |
| "running": [1, 0.5, -0.6931471805599453, 0.5, 0.5, 0.5, 0], |
| "diagnostics": { |
| "benchmarks": mock.ANY, |
| "bots": mock.ANY, |
| "buildUrls": mock.ANY, |
| "pointId": mock.ANY, |
| "masters": mock.ANY, |
| "stories": { |
| "type": "GenericSet", |
| "values": ["AV"] |
| }, |
| "webrtcRevisions": mock.ANY |
| }, |
| "allBins": [[1]], |
| "summaryOptions": { |
| "avg": False, |
| "count": False, |
| "max": False, |
| "min": False, |
| "std": False, |
| "sum": False |
| }, |
| "unit": "unitless_biggerIsBetter" |
| }] |
| self.maxDiff = None # pylint: disable=C0103 |
| self.assertItemsEqual(expected, hs.AsDicts()) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |