From 6367e17c2a01a67fe015f4a94a1cbb30d7958dfc Mon Sep 17 00:00:00 2001 From: cmtice Date: Tue, 17 Jun 2014 16:30:45 -0700 Subject: Adding/updating a few more unittests for Crosperf. BUG=None Test=Ran all regression tests. Ran 'normal' crosperf. Change-Id: If1dcafee39f10c20c935908c466fbae8fdb23a35 Reviewed-on: https://chrome-internal-review.googlesource.com/166485 Reviewed-by: Han Shen Commit-Queue: Caroline Tice Tested-by: Caroline Tice --- crosperf/config_unittest.py | 2 +- crosperf/crosperf_unittest.py | 90 ++++++++++++++++ crosperf/experiment_file_unittest.py | 22 ++++ crosperf/flag_test_unittest.py | 2 +- crosperf/settings_factory_unittest.py | 95 ++++++++++++++++ crosperf/settings_unittest.py | 198 ++++++++++++++++++++++++++++++++++ 6 files changed, 407 insertions(+), 2 deletions(-) mode change 100644 => 100755 crosperf/config_unittest.py create mode 100644 crosperf/crosperf_unittest.py mode change 100644 => 100755 crosperf/flag_test_unittest.py create mode 100644 crosperf/settings_factory_unittest.py create mode 100644 crosperf/settings_unittest.py (limited to 'crosperf') diff --git a/crosperf/config_unittest.py b/crosperf/config_unittest.py old mode 100644 new mode 100755 index af2b8fc9..098ea7c7 --- a/crosperf/config_unittest.py +++ b/crosperf/config_unittest.py @@ -1,4 +1,4 @@ -#!/usr/bi/python +#!/usr/bin/python # # Copyright 2014 Google Inc. All Rights Reserved. diff --git a/crosperf/crosperf_unittest.py b/crosperf/crosperf_unittest.py new file mode 100644 index 00000000..9fc504a2 --- /dev/null +++ b/crosperf/crosperf_unittest.py @@ -0,0 +1,90 @@ +#!/usr/bin/python +# +# Copyright 2014 Google Inc. All Rights Reserved. + +"""Unittest for crosperf.""" +import atexit +import os +import optparse +import StringIO + + +import mock +import unittest + +import crosperf +import settings_factory +import experiment_file +import experiment_runner + +from help import Help + +from utils import command_executer +from utils import logger + +EXPERIMENT_FILE_1 = """ + board: x86-alex + remote: chromeos-alex3 + 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): + + def setUp(self): + input_file = StringIO.StringIO(EXPERIMENT_FILE_1) + self.exp_file = experiment_file.ExperimentFile(input_file) + + def test_setup_parser_options(self): + + parser = optparse.OptionParser(usage=Help().GetUsage(), + description=Help().GetHelp(), + formatter=crosperf.MyIndentedHelpFormatter(), + version="%prog 3.0") + parser.add_option("-l", "--log_dir", + dest="log_dir", + default="", + help="The log_dir, default is under /logs") + options_before = parser._get_all_options() + self.assertEqual(len(options_before), 3) + crosperf.SetupParserOptions(parser) + options_after = parser._get_all_options() + self.assertEqual(len(options_after), 25) + + + def test_convert_options_to_settings(self): + parser = optparse.OptionParser(usage=Help().GetUsage(), + description=Help().GetHelp(), + formatter=crosperf.MyIndentedHelpFormatter(), + version="%prog 3.0") + parser.add_option("-l", "--log_dir", + dest="log_dir", + default="", + help="The log_dir, default is under /logs") + crosperf.SetupParserOptions(parser) + argv = ['crosperf/crosperf.py', 'temp.exp', '--rerun=True'] + options, args = parser.parse_args(argv) + settings = crosperf.ConvertOptionsToSettings(options) + self.assertIsNotNone(settings) + self.assertIsInstance(settings, settings_factory.GlobalSettings) + self.assertEqual(len(settings.fields), 21) + self.assertTrue(settings.GetField('rerun')) + argv = ['crosperf/crosperf.py', 'temp.exp'] + options, args = parser.parse_args(argv) + settings = crosperf.ConvertOptionsToSettings(options) + self.assertFalse(settings.GetField('rerun')) + + +if __name__ == "__main__": + unittest.main() diff --git a/crosperf/experiment_file_unittest.py b/crosperf/experiment_file_unittest.py index 335a516b..41e4a4c6 100755 --- a/crosperf/experiment_file_unittest.py +++ b/crosperf/experiment_file_unittest.py @@ -64,6 +64,23 @@ EXPERIMENT_FILE_3 = """ } """ +OUTPUT_FILE="""remote: chromeos-alex3 +board: x86-alex +perf_args: record -a -e cycles + +benchmark: PageCycler { +\titerations: 3 +} + +label: image1 { +\tremote: chromeos-alex3 +\tchromeos_image: /usr/local/google/cros_image1.bin +} + +label: image2 { +\tremote: chromeos-lumpy1 +\tchromeos_image: /usr/local/google/cros_image2.bin +}\n\n""" class ExperimentFileTest(unittest.TestCase): def testLoadExperimentFile1(self): @@ -103,6 +120,11 @@ class ExperimentFileTest(unittest.TestCase): input_file = StringIO.StringIO(EXPERIMENT_FILE_3) self.assertRaises(Exception, ExperimentFile, input_file) + def testCanonicalize(self): + input_file = StringIO.StringIO(EXPERIMENT_FILE_1) + experiment_file = ExperimentFile(input_file) + res = experiment_file.Canonicalize() + self.assertEqual(res, OUTPUT_FILE) if __name__ == "__main__": unittest.main() diff --git a/crosperf/flag_test_unittest.py b/crosperf/flag_test_unittest.py old mode 100644 new mode 100755 index 71cce095..f3678cfd --- a/crosperf/flag_test_unittest.py +++ b/crosperf/flag_test_unittest.py @@ -1,4 +1,4 @@ -#!/usr/bi/python +#!/usr/bin/python # # Copyright 2014 Google Inc. All Rights Reserved. diff --git a/crosperf/settings_factory_unittest.py b/crosperf/settings_factory_unittest.py new file mode 100644 index 00000000..f3376db5 --- /dev/null +++ b/crosperf/settings_factory_unittest.py @@ -0,0 +1,95 @@ +#!/usr/bin/python +# +# Copyright 2014 Google Inc. All Rights Reserved. + +"""Unittest for crosperf.""" +import os + +import mock +import unittest + +import settings_factory +import settings + +from utils import command_executer +from utils import logger + +class BenchmarkSettingsTest(unittest.TestCase): + + def test_init(self): + res = settings_factory.BenchmarkSettings("b_settings") + self.assertIsNotNone(res) + self.assertEqual(len(res.fields), 4) + self.assertEqual(res.GetField('test_name'), '') + self.assertEqual(res.GetField('test_args'), '') + self.assertEqual(res.GetField('iterations'), 1) + self.assertEqual(res.GetField('suite'), '') + +class LabelSettingsTest(unittest.TestCase): + + def test_init(self): + res = settings_factory.LabelSettings("l_settings") + self.assertIsNotNone(res) + self.assertEqual(len(res.fields), 7) + self.assertEqual(res.GetField('chromeos_image'), '') + self.assertEqual(res.GetField('chromeos_root'), '') + self.assertEqual(res.GetField('remote'), []) + self.assertEqual(res.GetField('image_args'), '') + self.assertEqual(res.GetField('cache_dir'), '') + self.assertEqual(res.GetField('chrome_src'), '') + self.assertEqual(res.GetField('build'), '') + + +class GlobalSettingsTest(unittest.TestCase): + + def test_init(self): + res = settings_factory.GlobalSettings("g_settings") + self.assertIsNotNone(res) + self.assertEqual(len(res.fields), 21) + self.assertEqual(res.GetField('name'), '') + self.assertEqual(res.GetField('board'), '') + self.assertEqual(res.GetField('remote'), []) + self.assertEqual(res.GetField('rerun_if_failed'), False) + self.assertEqual(res.GetField('rm_chroot_tmp'), False) + self.assertEqual(res.GetField('email'), []) + self.assertEqual(res.GetField('rerun'), False) + self.assertEqual(res.GetField('same_specs'), True) + self.assertEqual(res.GetField('same_machine'), False) + self.assertEqual(res.GetField('iterations'), 1) + self.assertEqual(res.GetField('chromeos_root'), '') + self.assertEqual(res.GetField('logging_level'), 'average') + self.assertEqual(res.GetField('acquire_timeout'), 0) + self.assertEqual(res.GetField('perf_args'), '') + self.assertEqual(res.GetField('cache_dir'), '') + self.assertEqual(res.GetField('cache_only'), False) + self.assertEqual(res.GetField('no_email'), False) + self.assertEqual(res.GetField('show_all_results'), False) + self.assertEqual(res.GetField('share_users'), '') + self.assertEqual(res.GetField('results_dir'), '') + self.assertEqual(res.GetField('chrome_src'), '') + + +class SettingsFactoryTest(unittest.TestCase): + + def test_get_settings(self): + self.assertRaises (Exception, settings_factory.SettingsFactory.GetSettings, + 'global', 'bad_type') + + + l_settings = settings_factory.SettingsFactory().GetSettings ('label', 'label') + self.assertIsInstance(l_settings, settings_factory.LabelSettings) + self.assertEqual(len(l_settings.fields), 7) + + b_settings = settings_factory.SettingsFactory().GetSettings ('benchmark', + 'benchmark') + self.assertIsInstance(b_settings, settings_factory.BenchmarkSettings) + self.assertEqual(len(b_settings.fields), 4) + + g_settings = settings_factory.SettingsFactory().GetSettings ('global', + 'global') + self.assertIsInstance(g_settings, settings_factory.GlobalSettings) + self.assertEqual(len(g_settings.fields), 21) + + +if __name__ == "__main__": + unittest.main() diff --git a/crosperf/settings_unittest.py b/crosperf/settings_unittest.py new file mode 100644 index 00000000..dcb25906 --- /dev/null +++ b/crosperf/settings_unittest.py @@ -0,0 +1,198 @@ +#!/usr/bin/python +# +# Copyright 2014 Google Inc. All Rights Reserved. + +import mock +import unittest + +import settings +import settings_factory + +from field import IntegerField +from field import ListField +import download_images + +from utils import logger + +class TestSettings(unittest.TestCase): + + def setUp(self): + self.settings = settings.Settings('global_name', 'global') + + def test_init(self): + self.assertEqual(self.settings.name, 'global_name') + self.assertEqual(self.settings.settings_type, 'global') + self.assertIsNone(self.settings.parent) + + + def test_set_parent_settings(self): + self.assertIsNone(self.settings.parent) + settings_parent = { 'fake_parent_entry' : 0 } + self.settings.SetParentSettings(settings_parent) + self.assertIsNotNone(self.settings.parent) + self.assertEqual(type(self.settings.parent), dict) + self.assertEqual(self.settings.parent, settings_parent) + + + def test_add_field(self): + self.assertEqual (self.settings.fields, {}) + self.settings.AddField(IntegerField("iterations", default=1, required=False, + description="Number of iterations to run the " + "test.")) + self.assertEqual(len(self.settings.fields), 1) + # Adding the same field twice raises an exception. + self.assertRaises (Exception, self.settings.AddField, + (IntegerField("iterations", default=1, required=False, + description="Number of iterations to run the" + " test."))) + res = self.settings.fields['iterations'] + self.assertIsInstance(res, IntegerField) + self.assertEqual(res.Get(), 1) + + + def test_set_field(self): + self.assertEqual (self.settings.fields, {}) + self.settings.AddField(IntegerField("iterations", default=1, required=False, + description="Number of iterations to run the " + "test.")) + res = self.settings.fields['iterations'] + self.assertEqual(res.Get(), 1) + + self.settings.SetField('iterations', 10) + res = self.settings.fields['iterations'] + self.assertEqual(res.Get(), 10) + + # Setting a field that's not there raises an exception. + self.assertRaises (Exception, self.settings.SetField, 'remote', 'lumpy1.cros') + + self.settings.AddField(ListField("remote", default=[], description= + "A comma-separated list of ip's of chromeos" + "devices to run experiments on.")) + self.assertEqual(type(self.settings.fields), dict) + self.assertEqual(len(self.settings.fields), 2) + res = self.settings.fields['remote'] + self.assertEqual(res.Get(), []) + self.settings.SetField('remote', 'lumpy1.cros', append=True) + self.settings.SetField('remote', 'lumpy2.cros', append=True) + res = self.settings.fields['remote'] + self.assertEqual(res.Get(), [ 'lumpy1.cros', 'lumpy2.cros' ]) + + + def test_get_field(self): + # Getting a field that's not there raises an exception. + self.assertRaises (Exception, self.settings.GetField, 'iterations') + + # Getting a required field that hasn't been assigned raises an exception. + self.settings.AddField(IntegerField("iterations", required=True, + description="Number of iterations to run " + "the test.")) + self.assertIsNotNone(self.settings.fields['iterations']) + self.assertRaises (Exception, self.settings.GetField, 'iterations') + + # Set the value, then get it. + self.settings.SetField('iterations', 5) + res = self.settings.GetField('iterations') + self.assertEqual(res, 5) + + + def test_inherit(self): + parent_settings = settings_factory.SettingsFactory().GetSettings('global', + 'global') + label_settings = settings_factory.SettingsFactory().GetSettings('label', + 'label') + self.assertEqual(parent_settings.GetField('chromeos_root'), '') + self.assertEqual(label_settings.GetField('chromeos_root'), '') + self.assertIsNone(label_settings.parent) + + parent_settings.SetField('chromeos_root', '/tmp/chromeos') + label_settings.SetParentSettings (parent_settings) + self.assertEqual(parent_settings.GetField('chromeos_root'), '/tmp/chromeos') + self.assertEqual(label_settings.GetField('chromeos_root'), '') + label_settings.Inherit() + self.assertEqual(label_settings.GetField('chromeos_root'), '/tmp/chromeos') + + + def test_override(self): + self.settings.AddField(ListField("email", default=[], + description="Space-seperated" + "list of email addresses to send email to.")) + + + global_settings = settings_factory.SettingsFactory().GetSettings('global', + 'global') + + global_settings.SetField('email', 'john.doe@google.com', append=True) + global_settings.SetField('email', 'jane.smith@google.com', append=True) + + res = self.settings.GetField('email') + self.assertEqual(res, []) + + self.settings.Override(global_settings) + res = self.settings.GetField('email') + self.assertEqual(res, ['john.doe@google.com', 'jane.smith@google.com']) + + + def test_validate(self): + + self.settings.AddField(IntegerField("iterations", required=True, + description="Number of iterations to run the " + "test.")) + self.settings.AddField(ListField("remote", default=[], required=True, + description= + "A comma-separated list of ip's of chromeos" + "devices to run experiments on.")) + self.settings.AddField(ListField("email", default=[], + description="Space-seperated" + "list of email addresses to send email to.")) + + # 'required' fields have not been assigned; should raise an exception. + self.assertRaises (Exception, self.settings.Validate) + self.settings.SetField('iterations', 2) + self.settings.SetField('remote', 'x86-alex.cros', append=True) + # Should run without exception now. + self.settings.Validate() + + @mock.patch.object (logger,'GetLogger') + @mock.patch.object (download_images.ImageDownloader, 'Run') + @mock.patch.object (download_images, 'ImageDownloader') + def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger): + + + mock_run.return_value = [ 0, 'fake_xbuddy_translation' ] + mock_downloader.Run = mock_run + board = 'lumpy' + chromeos_root = '/tmp/chromeos' + log_level = 'average' + + trybot_str = 'trybot-lumpy-paladin/R34-5417.0.0-b1506' + official_str = 'lumpy-release/R34-5417.0.0' + xbuddy_str = 'latest-dev' + + self.settings.GetXbuddyPath(trybot_str, board, chromeos_root, log_level) + self.assertEqual(mock_run.call_count, 1) + self.assertEqual(mock_run.call_args_list[0][0], + ('/tmp/chromeos', + 'remote/trybot-lumpy-paladin/R34-5417.0.0-b1506',)) + + + mock_run.reset_mock() + self.settings.GetXbuddyPath(official_str, board, chromeos_root, log_level) + self.assertEqual(mock_run.call_count, 1) + self.assertEqual(mock_run.call_args_list[0][0], + ('/tmp/chromeos', + 'remote/lumpy-release/R34-5417.0.0',)) + + + mock_run.reset_mock() + self.settings.GetXbuddyPath(xbuddy_str, board, chromeos_root, log_level) + self.assertEqual(mock_run.call_count, 1) + self.assertEqual(mock_run.call_args_list[0][0], + ('/tmp/chromeos', + 'remote/lumpy/latest-dev',)) + + mock_run.return_value = [ 1, 'fake_xbuddy_translation' ] + self.assertRaises (Exception, self.settings.GetXbuddyPath, xbuddy_str, board, + chromeos_root, log_level) + +if __name__ == "__main__": + unittest.main() -- cgit v1.2.3