• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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