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