1# Copyright 2024 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import json 6import unittest 7 8from crossbench import path as pth 9from crossbench import plt 10from crossbench.cli.config.probe import ProbeListConfig 11from crossbench.probes.all import TraceProcessorProbe 12from tests import test_helper 13from tests.crossbench.base import BaseCrossbenchTestCase 14 15 16class TraceProcessorProbeTestCase(unittest.TestCase): 17 18 @unittest.skipIf(not plt.PLATFORM.which("trace_processor"), 19 "trace_processor not available") 20 def test_parse_example_config(self): 21 config_file = ( 22 test_helper.config_dir() / "doc/probe/trace_processor.config.hjson") 23 self.assertTrue(config_file.is_file()) 24 probes = ProbeListConfig.parse_path(config_file).probes 25 self.assertEqual(len(probes), 2) 26 probe = probes[0] 27 self.assertIsInstance(probe, TraceProcessorProbe) 28 29 30class TraceProcessorResultTestCase(BaseCrossbenchTestCase): 31 32 def test_merge_browsers(self): 33 probe: TraceProcessorProbe = TraceProcessorProbe.from_config("") 34 35 browser = unittest.mock.MagicMock() 36 browser.label = "browser" 37 browser.unique_name = "browser" 38 39 story = unittest.mock.MagicMock() 40 story.name = "story" 41 42 result1 = unittest.mock.MagicMock() 43 csv1 = self.create_file("run1/query.csv", contents="foo,bar\n1,2\n") 44 json1 = self.create_file( 45 "run1/metric.json", contents=json.dumps({"foo": { 46 "bar": 7 47 }})) 48 result1.csv_list = [csv1] 49 result1.json_list = [json1] 50 51 run1 = unittest.mock.MagicMock() 52 run1.repetition = 0 53 run1.results = {probe: result1} 54 run1.browser = browser 55 run1.story = story 56 run1.temperature = "default" 57 58 result2 = unittest.mock.MagicMock() 59 csv2 = self.create_file("run2/query.csv", contents="foo,bar\n3,4\n") 60 json2 = self.create_file( 61 "run2/metric.json", contents=json.dumps({"foo": { 62 "bar": 9 63 }})) 64 result2.csv_list = [csv2] 65 result2.json_list = [json2] 66 67 run2 = unittest.mock.MagicMock() 68 run2.repetition = 1 69 run2.results = {probe: result2} 70 run2.browser = browser 71 run2.story = story 72 run2.temperature = "default" 73 74 rep_group = unittest.mock.MagicMock() 75 rep_group.story = story 76 rep_group.runs = [run1, run2] 77 78 story_group = unittest.mock.MagicMock() 79 story_group.browser = browser 80 story_group.repetitions_groups = [rep_group] 81 82 browsers_run_group = unittest.mock.MagicMock() 83 browsers_run_group.get_local_probe_result_path = unittest.mock.MagicMock( 84 return_value=pth.LocalPath("result/")) 85 browsers_run_group.story_groups = [story_group] 86 browsers_run_group.runs = [run1, run2] 87 88 merged_result = probe.merge_browsers(browsers_run_group) 89 self.assertEqual(len(merged_result.csv_list), 1) 90 self.assertEqual(len(merged_result.json_list), 1) 91 92 expected_csv = ("foo,bar,cb_browser,cb_story,cb_temperature,cb_run\n" 93 "1,2,browser,story,default,0\n" 94 "3,4,browser,story,default,1\n") 95 with merged_result.csv.open("r") as f: 96 self.assertEqual(f.read(), expected_csv) 97 98 with merged_result.json.open("r") as f: 99 metrics = json.load(f) 100 self.assertTrue("foo/bar" in metrics) 101 self.assertTrue("values" in metrics["foo/bar"]) 102 self.assertEqual([7, 9], metrics["foo/bar"]["values"]) 103 104 105if __name__ == "__main__": 106 test_helper.run_pytest(__file__) 107