xref: /aosp_15_r20/external/toolchain-utils/crosperf/crosperf_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# -*- coding: utf-8 -*-
3*760c253cSXin Li#
4*760c253cSXin Li# Copyright 2014 The ChromiumOS Authors
5*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
6*760c253cSXin Li# found in the LICENSE file.
7*760c253cSXin Li
8*760c253cSXin Li"""Unittest for crosperf."""
9*760c253cSXin Li
10*760c253cSXin Li
11*760c253cSXin Liimport argparse
12*760c253cSXin Liimport io
13*760c253cSXin Liimport tempfile
14*760c253cSXin Liimport unittest
15*760c253cSXin Liimport unittest.mock as mock
16*760c253cSXin Li
17*760c253cSXin Liimport crosperf
18*760c253cSXin Liimport experiment_file
19*760c253cSXin Liimport settings_factory
20*760c253cSXin Li
21*760c253cSXin Li
22*760c253cSXin LiEXPERIMENT_FILE_1 = """
23*760c253cSXin Li  board: x86-alex
24*760c253cSXin Li  remote: chromeos-alex3
25*760c253cSXin Li  locks_dir: /tmp
26*760c253cSXin Li  perf_args: record -a -e cycles
27*760c253cSXin Li  benchmark: PageCycler {
28*760c253cSXin Li    iterations: 3
29*760c253cSXin Li  }
30*760c253cSXin Li
31*760c253cSXin Li  image1 {
32*760c253cSXin Li    chromeos_image: /usr/local/google/cros_image1.bin
33*760c253cSXin Li  }
34*760c253cSXin Li
35*760c253cSXin Li  image2 {
36*760c253cSXin Li    remote: chromeos-lumpy1
37*760c253cSXin Li    chromeos_image: /usr/local/google/cros_image2.bin
38*760c253cSXin Li  }
39*760c253cSXin Li  """
40*760c253cSXin Li
41*760c253cSXin Li
42*760c253cSXin Liclass CrosperfTest(unittest.TestCase):
43*760c253cSXin Li    """Crosperf test class."""
44*760c253cSXin Li
45*760c253cSXin Li    def setUp(self):
46*760c253cSXin Li        input_file = io.StringIO(EXPERIMENT_FILE_1)
47*760c253cSXin Li        self.exp_file = experiment_file.ExperimentFile(input_file)
48*760c253cSXin Li
49*760c253cSXin Li    def testDryRun(self):
50*760c253cSXin Li        with tempfile.NamedTemporaryFile("w", encoding="utf-8") as f:
51*760c253cSXin Li            f.write(EXPERIMENT_FILE_1)
52*760c253cSXin Li            f.flush()
53*760c253cSXin Li            crosperf.Main(["", f.name, "--dry_run"])
54*760c253cSXin Li
55*760c253cSXin Li    def testConvertOptionsToSettings(self):
56*760c253cSXin Li        parser = argparse.ArgumentParser()
57*760c253cSXin Li        parser.add_argument(
58*760c253cSXin Li            "-l",
59*760c253cSXin Li            "--log_dir",
60*760c253cSXin Li            dest="log_dir",
61*760c253cSXin Li            default="",
62*760c253cSXin Li            help="The log_dir, default is under " "<crosperf_logs>/logs",
63*760c253cSXin Li        )
64*760c253cSXin Li        crosperf.SetupParserOptions(parser)
65*760c253cSXin Li        argv = ["crosperf/crosperf.py", "temp.exp", "--rerun=True"]
66*760c253cSXin Li        options, _ = parser.parse_known_args(argv)
67*760c253cSXin Li        settings = crosperf.ConvertOptionsToSettings(options)
68*760c253cSXin Li        self.assertIsNotNone(settings)
69*760c253cSXin Li        self.assertIsInstance(settings, settings_factory.GlobalSettings)
70*760c253cSXin Li        self.assertEqual(len(settings.fields), 42)
71*760c253cSXin Li        self.assertTrue(settings.GetField("rerun"))
72*760c253cSXin Li        argv = ["crosperf/crosperf.py", "temp.exp"]
73*760c253cSXin Li        options, _ = parser.parse_known_args(argv)
74*760c253cSXin Li        settings = crosperf.ConvertOptionsToSettings(options)
75*760c253cSXin Li        self.assertFalse(settings.GetField("rerun"))
76*760c253cSXin Li
77*760c253cSXin Li    def testExceptionPrintTraceback(self):
78*760c253cSXin Li        """Test the main function can print traceback in exception."""
79*760c253cSXin Li
80*760c253cSXin Li        def mock_RunCrosperf(*_args, **_kwargs):
81*760c253cSXin Li            return 10 / 0
82*760c253cSXin Li
83*760c253cSXin Li        with mock.patch("crosperf.RunCrosperf", new=mock_RunCrosperf):
84*760c253cSXin Li            with self.assertRaises(ZeroDivisionError) as context:
85*760c253cSXin Li                crosperf.Main([])
86*760c253cSXin Li            self.assertEqual("division by zero", str(context.exception))
87*760c253cSXin Li
88*760c253cSXin Li
89*760c253cSXin Liif __name__ == "__main__":
90*760c253cSXin Li    unittest.main()
91