1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import pathlib
import tempfile
import unittest
import unittest.mock
import crossbench_result_converter
class CrossbenchResultConverterTest(unittest.TestCase):
def call_converter(self, subdir):
in_dir = (pathlib.Path(__file__).parent / 'testdata/crossbench_output' /
subdir)
# Patched version of pathlib.Path.open method, to handle paths that start
# with /example/path
def patched_open(p, *args):
EXAMPLE_PATH = '/example/path'
try:
p = in_dir / p.relative_to(EXAMPLE_PATH)
except ValueError:
pass
return open(p, *args)
with tempfile.TemporaryDirectory() as out_dir:
histogram_path = pathlib.Path(out_dir) / 'perf_results.json'
with unittest.mock.patch.object(pathlib.Path, 'open', patched_open):
crossbench_result_converter.convert(in_dir, histogram_path)
with histogram_path.open() as f:
return json.load(f)
def list_to_dict(self, histogram):
"""Convert histogram data from list to dict for easier checking."""
result = {}
for item in histogram:
if 'name' in item:
result[item['name']] = item
return result
def process_crossbench_result(self, subdir):
return self.list_to_dict(self.call_converter(subdir))
def check_result(self, result, metric, value, unit, sample_size=1):
sample_values = result[metric]['sampleValues']
self.assertIsInstance(sample_values, list)
self.assertEqual(len(sample_values), sample_size)
self.assertAlmostEqual(sample_values[0], value)
self.assertEqual(result[metric]['unit'], unit)
def test_jetstream_2_1(self):
result = self.process_crossbench_result('jetstream_2.1')
self.check_result(result, 'Total', 188.41971083937912,
'unitless_biggerIsBetter')
self.check_result(result, '3d-cube-SP', 396.15488423869766,
'unitless_biggerIsBetter')
def test_motionmark_1_2(self):
result = self.process_crossbench_result('motionmark_1.2')
self.check_result(result, 'score', 896.5337146572772,
'unitless_biggerIsBetter')
self.check_result(result, 'Suits', 884.8798336963456,
'unitless_biggerIsBetter')
def test_motionmark_1_3(self):
result = self.process_crossbench_result('motionmark_1.3')
self.check_result(result, 'score', 455.7206962615359,
'unitless_biggerIsBetter')
self.check_result(result, 'Suits', 443.96956820438845,
'unitless_biggerIsBetter')
def test_speedometer_2_1(self):
result = self.process_crossbench_result('speedometer_2.1')
self.check_result(result, 'Score', 245.31113999440205,
'unitless_biggerIsBetter')
self.check_result(result, 'jQuery-TodoMVC', 228.69504639975204,
'ms_smallerIsBetter')
def test_speedometer_3_0(self):
result = self.process_crossbench_result('speedometer_3.0')
self.check_result(result, 'Score', 13.271380101090333,
'unitless_biggerIsBetter')
self.check_result(result, 'TodoMVC-jQuery', 259.5599999189377,
'ms_smallerIsBetter')
def test_embedder(self):
result = self.process_crossbench_result('embedder')
self.check_result(result, 'Some.Histogram1_mean', 165.0,
'ms_smallerIsBetter', sample_size=50)
self.check_result(result, 'MetricFoo', 207,
'ms_smallerIsBetter', sample_size=50)
if __name__ == '__main__':
unittest.main()
|