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