blob: 5607ffad1a0485b6635ac5447b42152e56c11e78 [file] [edit]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import unittest
import six
from tracing.value import gtest_json_converter
from tracing.value import histogram
from tracing.value import legacy_unit_info
from tracing.value.diagnostics import reserved_infos
NANO_TO_MILLISECONDS = 0.000001
class GtestJsonConverterUnittest(unittest.TestCase):
def testConvertBasic(self):
data = {
'metric1': {
'units': 'ms',
'traces': {
'story1': ['10.12345', '0.54321'],
'story2': ['30', '0'],
}
},
'metric2': {
'units': 'ns',
'traces': {
'story1': ['100000.0', '2543.543'],
'story2': ['12345.6789', '301.2'],
},
}
}
histograms = gtest_json_converter.ConvertGtestJson(data)
self.assertEqual(len(histograms), 4)
metric_histograms = histograms.GetHistogramsNamed('metric1')
self.assertEqual(len(metric_histograms), 2)
story1 = None
story2 = None
if metric_histograms[0].diagnostics[
reserved_infos.STORIES.name].GetOnlyElement() == 'story1':
story1 = metric_histograms[0]
story2 = metric_histograms[1]
else:
story2 = metric_histograms[0]
story1 = metric_histograms[1]
# assertAlmostEqual necessary to avoid floating point precision issues.
self.assertAlmostEqual(story1.average, 10.12345)
self.assertAlmostEqual(story1.standard_deviation, 0.54321)
self.assertAlmostEqual(story1.sum, story1.num_values * story1.average)
self.assertEqual(story2.average, 30)
self.assertEqual(story2.standard_deviation, 0)
self.assertEqual(story2.sum, story2.num_values * story2.average)
self.assertEqual(story1.unit, story2.unit)
self.assertEqual(story1.unit, 'ms_smallerIsBetter')
metric_histograms = histograms.GetHistogramsNamed('metric2')
self.assertEqual(len(metric_histograms), 2)
if metric_histograms[0].diagnostics[
reserved_infos.STORIES.name].GetOnlyElement() == 'story1':
story1 = metric_histograms[0]
story2 = metric_histograms[1]
else:
story2 = metric_histograms[0]
story1 = metric_histograms[1]
# assertAlmostEqual necessary to avoid floating point precision issues.
# We expect the numbers to be different than what was initially provided
# since this should be converted to milliseconds.
self.assertAlmostEqual(story1.average, 100000 * NANO_TO_MILLISECONDS)
self.assertAlmostEqual(story1.standard_deviation,
2543.543 * NANO_TO_MILLISECONDS)
self.assertAlmostEqual(story1.sum, story1.num_values * story1.average)
self.assertAlmostEqual(story2.average, 12345.6789 * NANO_TO_MILLISECONDS)
self.assertAlmostEqual(story2.standard_deviation,
301.2 * NANO_TO_MILLISECONDS)
self.assertAlmostEqual(story2.sum, story2.num_values * story2.average)
self.assertEqual(story1.unit, story2.unit)
self.assertEqual(story1.unit, 'msBestFitFormat_smallerIsBetter')
def testConvertOverlappingUnit(self):
# Some units in the legacy unit mapping are the same as the units defined
# for histograms - the former should be used since it gives us improvement
# direction.
data = {
'metric1': {
'units': 'Hz',
'traces': {
'story1': ['60', '0'],
}
}
}
histograms = gtest_json_converter.ConvertGtestJson(data)
self.assertEqual(len(histograms), 1)
self.assertEqual(histograms.GetFirstHistogram().unit, 'Hz_biggerIsBetter')
def testConvertKnownNonLegacyUnit(self):
# A unit not in the legacy mapping but present in the list of histogram
# units should still be converted to a non-unitless unit.
data = {
'metric1': {
'units': 'V',
'traces': {
'story1': ['10', '1'],
},
},
'metric2': {
'units': 'V_smallerIsBetter',
'traces': {
'story1': ['1', '1'],
},
},
}
histograms = gtest_json_converter.ConvertGtestJson(data)
self.assertEqual(len(histograms), 2)
self.assertEqual(histograms.GetHistogramsNamed('metric1')[0].unit, 'V')
self.assertEqual(
histograms.GetHistogramsNamed('metric2')[0].unit, 'V_smallerIsBetter')
def testConvertWithLabel(self):
data = {
'metric1': {
'units': 'V',
'traces': {
'story1': ['10', '1'],
},
},
}
label = 'Commit abc'
histograms = gtest_json_converter.ConvertGtestJson(data, label=label)
metric_histograms = histograms.GetHistogramsNamed('metric1')
self.assertEqual(len(metric_histograms), 1)
labels = metric_histograms[0].diagnostics[reserved_infos.LABELS.name]
self.assertEqual(len(labels), 1)
self.assertEqual(labels.GetOnlyElement(), 'Commit abc')
def testConvertUnknownUnit(self):
data = {
'metric1': {
'units': 'SomeUnknownUnit',
'traces': {
'story1': ['10', '1'],
'story2': ['123.4', '7.89'],
},
},
}
histograms = gtest_json_converter.ConvertGtestJson(data)
self.assertEqual(len(histograms), 2)
metric_histograms = histograms.GetHistogramsNamed('metric1')
self.assertEqual(len(metric_histograms), 2)
story1 = None
story2 = None
if metric_histograms[0].diagnostics[
reserved_infos.STORIES.name].GetOnlyElement() == 'story1':
story1 = metric_histograms[0]
story2 = metric_histograms[1]
else:
story2 = metric_histograms[0]
story1 = metric_histograms[1]
self.assertEqual(story1.average, 10)
self.assertEqual(story1.standard_deviation, 1)
self.assertEqual(story1.sum, story1.num_values * story1.average)
self.assertAlmostEqual(story2.average, 123.4)
self.assertAlmostEqual(story2.standard_deviation, 7.89)
self.assertAlmostEqual(story2.sum, story2.num_values * story2.average)
self.assertEqual(story1.unit, story2.unit)
self.assertEqual(story1.unit, 'unitless_smallerIsBetter')
def testLegacyUnitNamesValid(self):
# Test that all the legacy unit names are recognized by histograms.
for legacy_unit in six.itervalues(legacy_unit_info.LEGACY_UNIT_INFO):
self.assertTrue(legacy_unit.name in histogram.UNIT_NAMES)