aboutsummaryrefslogtreecommitdiff
path: root/crosperf/crosperf_unittest.py
blob: 7b52f2e027f8d04b395beae4b66720b24b96e248 (plain)
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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittest for crosperf."""


import argparse
import io
import tempfile
import unittest
import unittest.mock as mock

import crosperf
import experiment_file
import settings_factory


EXPERIMENT_FILE_1 = """
  board: x86-alex
  remote: chromeos-alex3
  locks_dir: /tmp
  perf_args: record -a -e cycles
  benchmark: PageCycler {
    iterations: 3
  }

  image1 {
    chromeos_image: /usr/local/google/cros_image1.bin
  }

  image2 {
    remote: chromeos-lumpy1
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """


class CrosperfTest(unittest.TestCase):
    """Crosperf test class."""

    def setUp(self):
        input_file = io.StringIO(EXPERIMENT_FILE_1)
        self.exp_file = experiment_file.ExperimentFile(input_file)

    def testDryRun(self):
        with tempfile.NamedTemporaryFile("w", encoding="utf-8") as f:
            f.write(EXPERIMENT_FILE_1)
            f.flush()
            crosperf.Main(["", f.name, "--dry_run"])

    def testConvertOptionsToSettings(self):
        parser = argparse.ArgumentParser()
        parser.add_argument(
            "-l",
            "--log_dir",
            dest="log_dir",
            default="",
            help="The log_dir, default is under " "<crosperf_logs>/logs",
        )
        crosperf.SetupParserOptions(parser)
        argv = ["crosperf/crosperf.py", "temp.exp", "--rerun=True"]
        options, _ = parser.parse_known_args(argv)
        settings = crosperf.ConvertOptionsToSettings(options)
        self.assertIsNotNone(settings)
        self.assertIsInstance(settings, settings_factory.GlobalSettings)
        self.assertEqual(len(settings.fields), 40)
        self.assertTrue(settings.GetField("rerun"))
        argv = ["crosperf/crosperf.py", "temp.exp"]
        options, _ = parser.parse_known_args(argv)
        settings = crosperf.ConvertOptionsToSettings(options)
        self.assertFalse(settings.GetField("rerun"))

    def testExceptionPrintTraceback(self):
        """Test the main function can print traceback in exception."""

        def mock_RunCrosperf(*_args, **_kwargs):
            return 10 / 0

        with mock.patch("crosperf.RunCrosperf", new=mock_RunCrosperf):
            with self.assertRaises(ZeroDivisionError) as context:
                crosperf.Main([])
            self.assertEqual("division by zero", str(context.exception))


if __name__ == "__main__":
    unittest.main()