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