job_unittest.py revision 75cdfee87bfaa3cf3f9860832b228a6d32aaed2f
15bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh#!/usr/bin/python
25bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
375cdfee87bfaa3cf3f9860832b228a6d32aaed2fshowardimport logging, os, unittest, shutil, sys, time, StringIO
45bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighimport common
56f731364e6207c198ac8de748a043eba1e9223b3jadmanski
65bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighfrom autotest_lib.client.bin import job, boottool, config, sysinfo, harness
7b0b58a2ae3eee9cac2b36cce70ba4b1483d6b442mblighfrom autotest_lib.client.bin import test, xen, kernel, utils
875cdfee87bfaa3cf3f9860832b228a6d32aaed2fshowardfrom autotest_lib.client.common_lib import packages, error, log, logging_manager
975cdfee87bfaa3cf3f9860832b228a6d32aaed2fshowardfrom autotest_lib.client.common_lib import logging_config
105bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighfrom autotest_lib.client.common_lib.test_utils import mock
115bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
125bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
136f731364e6207c198ac8de748a043eba1e9223b3jadmanskiclass first_line_comparator(mock.argument_comparator):
146f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def __init__(self, first_line):
156f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.first_line = first_line
166f731364e6207c198ac8de748a043eba1e9223b3jadmanski
176f731364e6207c198ac8de748a043eba1e9223b3jadmanski
186f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def is_satisfied_by(self, parameter):
196f731364e6207c198ac8de748a043eba1e9223b3jadmanski        return self.first_line == parameter.splitlines()[0]
206f731364e6207c198ac8de748a043eba1e9223b3jadmanski
216f731364e6207c198ac8de748a043eba1e9223b3jadmanski
225bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighclass TestBaseJob(unittest.TestCase):
235bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def setUp(self):
245bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # make god
255bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god = mock.mock_god()
265bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
275bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # need to set some environ variables
285bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.autodir = "autodir"
295bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        os.environ['AUTODIR'] = self.autodir
305bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
315bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # set up some variables
325bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.control = "control"
335bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.jobtag = "jobtag"
345bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
357629f148feee19efa11bc041d49943aacc43c482showard        # get rid of stdout and logging
3654705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh        sys.stdout = StringIO.StringIO()
3775cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        logging_manager.configure_logging(logging_config.TestingConfig())
3875cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        logging.disable(logging.CRITICAL)
3975cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        def dummy_configure_logging(*args, **kwargs):
4075cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward            pass
4175cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        self.god.stub_with(logging_manager, 'configure_logging',
4275cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                           dummy_configure_logging)
4375cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        real_get_logging_manager = logging_manager.get_logging_manager
4475cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        def get_logging_manager_no_fds(manage_stdout_and_stderr=False,
4575cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                                       redirect_fds=False):
4675cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward            return real_get_logging_manager(manage_stdout_and_stderr, False)
4775cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        self.god.stub_with(logging_manager, 'get_logging_manager',
4875cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                           get_logging_manager_no_fds)
4954705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh
505bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # stub out some stuff
515bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(os.path, 'exists')
52c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.stub_function(os.path, 'isdir')
537629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(os, 'makedirs')
545bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(os, 'mkdir')
557629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(os, 'remove')
567629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(shutil, 'rmtree')
575bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(shutil, 'copyfile')
585bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(job, 'open')
595bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(utils, 'system')
6053da18eddf69243ca175d9a4603cba5b55300726mbligh        self.god.stub_function(utils, 'drop_caches')
615bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(harness, 'select')
625bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(sysinfo, 'log_per_reboot_data')
635bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
645bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_class(config, 'config')
655bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_class(boottool, 'boottool')
66cefe2653333168a08c891f72a708b66855f07853jadmanski        self.god.stub_class(sysinfo, 'sysinfo')
675bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
685bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
695bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def tearDown(self):
7054705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh        sys.stdout = sys.__stdout__
715bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.unstub_all()
725bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
735bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
745bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def construct_job(self, cont):
755bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # will construct class instance using __new__
765bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job = job.base_job.__new__(job.base_job)
775bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
785bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # now some specific stubs
795bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, '_load_state')
805bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, '_init_group_level')
815bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'config_get')
82d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.god.stub_function(self.job, 'config_set')
835bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'record')
845bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, '_increment_group_level')
856f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.stub_function(self.job, '_decrement_group_level')
865bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'get_state')
875bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
885bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # other setup
895bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        tmpdir = os.path.join(self.autodir, 'tmp')
905bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        results = os.path.join(self.autodir, 'results')
915bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        download = os.path.join(self.autodir, 'tests', 'download')
925bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        resultdir = os.path.join(self.autodir, 'results', self.jobtag)
93c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        pkgdir = os.path.join(self.autodir, 'packages')
945bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
955bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
967629f148feee19efa11bc041d49943aacc43c482showard        os.path.exists.expect_call(resultdir).and_return(False)
977629f148feee19efa11bc041d49943aacc43c482showard        os.makedirs.expect_call(resultdir)
987629f148feee19efa11bc041d49943aacc43c482showard
9953da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
1005bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job._load_state.expect_call()
10123afbec41f6275bef4e80c36726916b0be564204jadmanski        self.job.get_state.expect_call("__run_test_cleanup",
10223afbec41f6275bef4e80c36726916b0be564204jadmanski                                       default=True).and_return(True)
103c09fc1543a3f77026bab728770aa0191feaddd07jadmanski        job_sysinfo = sysinfo.sysinfo.expect_new(resultdir)
104c09fc1543a3f77026bab728770aa0191feaddd07jadmanski        self.job.get_state.expect_call("__sysinfo",
105c09fc1543a3f77026bab728770aa0191feaddd07jadmanski                                       None).and_return(None)
1060910844396c68a8747dc1ab580fb898ecff2469embligh        self.job.get_state.expect_call("__last_boot_tag",
1070910844396c68a8747dc1ab580fb898ecff2469embligh                                       default=None).and_return(None)
1085bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        if not cont:
1095bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.path.exists.expect_call(tmpdir).and_return(False)
1105bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.mkdir.expect_call(tmpdir)
111c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            os.path.exists.expect_call(pkgdir).and_return(False)
112c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            os.mkdir.expect_call(pkgdir)
1135bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.path.exists.expect_call(results).and_return(False)
1145bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.mkdir.expect_call(results)
1155bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.path.exists.expect_call(download).and_return(False)
1165bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.mkdir.expect_call(download)
1177629f148feee19efa11bc041d49943aacc43c482showard            os.path.exists.expect_call(resultdir).and_return(False)
1187629f148feee19efa11bc041d49943aacc43c482showard            os.makedirs.expect_call(os.path.join(resultdir, 'debug'))
1197629f148feee19efa11bc041d49943aacc43c482showard            os.makedirs.expect_call(os.path.join(resultdir, 'analysis'))
1205bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            shutil.copyfile.expect_call(mock.is_string_comparator(),
1215bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                                 os.path.join(resultdir, 'control'))
1225bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1235bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job._init_group_level.expect_call()
1245bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.config = config.config.expect_new(self.job)
1255bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        my_harness = self.god.create_mock_class(harness.harness,
1265bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                                                'my_harness')
1275bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        harness.select.expect_call(None,
1285bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                                   self.job).and_return(my_harness)
1295bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.config_get.expect_call(
1305bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                'boottool.executable').and_return(None)
1315bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        bootloader = boottool.boottool.expect_new(None)
132cefe2653333168a08c891f72a708b66855f07853jadmanski        job_sysinfo.log_per_reboot_data.expect_call()
1335bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        if not cont:
1345bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            self.job.record.expect_call('START', None, None)
1355bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            self.job._increment_group_level.expect_call()
1365bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1375bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        my_harness.run_start.expect_call()
1385bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.get_state.expect_call('__monitor_disk',
1395bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                                       default=0.0).and_return(0.0)
1405bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
141d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.god.stub_function(utils, 'read_one_line')
142d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        utils.read_one_line.expect_call('/proc/cmdline').and_return(
143d948bfb7729e94b457bafca91a13c963d7edcba6mbligh            'blah more-blah root=lala IDENT=81234567 blah-again console=tty1')
144d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.job.config_set.expect_call('boot.default_args',
145d948bfb7729e94b457bafca91a13c963d7edcba6mbligh                                        'more-blah console=tty1')
1465bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # finish constructor
147d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.job.__init__(self.control, self.jobtag, cont,
148d948bfb7729e94b457bafca91a13c963d7edcba6mbligh                          extra_copy_cmdline=['more-blah'])
1495bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1505bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # check
1515bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
1525bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
153c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
1545bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_constructor(self):
1555bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(False)
1565bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1575bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1585bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_monitor_disk_usage(self):
1595bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(True)
1605bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1615bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # setup
1625bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'set_state')
1635bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1645bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
1655bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        max_rate = 10.0
1665bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.set_state.expect_call('__monitor_disk', max_rate)
1675bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1685bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # test
1695bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.monitor_disk_usage(max_rate)
1705bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
1715bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1725bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1736ca37b61b4701964caf9af73bc988114cae663efjadmanski    def test_relative_path(self):
174c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
175c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        dummy = "asdf"
176c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        ret = self.job.relative_path(os.path.join(self.job.resultdir, dummy))
177c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertEquals(ret, dummy)
178c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
179c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
180c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_control_functions(self):
181c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
182c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        control_file = "blah"
183c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.job.control_set(control_file)
184c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertEquals(self.job.control_get(), os.path.abspath(control_file))
185c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
186c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
1875bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_harness_select(self):
1885bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(True)
1895bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1905bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
1915bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        which = "which"
1925bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        harness.select.expect_call(which, self.job).and_return(None)
1935bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1945bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # run and test
1955bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.harness_select(which)
1965bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
1975bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1985bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1995bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_config_set(self):
2005bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(True)
2015bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
202d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        # unstub config_set
203d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.god.unstub(self.job, 'config_set')
2045bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
2055bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        name = "foo"
2065bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        val = 10
2075bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.config.set.expect_call(name, val)
2085bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2095bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # run and test
2105bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.config_set(name, val)
2115bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
2125bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2135bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2145bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_config_get(self):
2155bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(True)
2165bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2175bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # unstub config_get
2185bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.unstub(self.job, 'config_get')
2195bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
2205bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        name = "foo"
2215bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        val = 10
2225bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.config.get.expect_call(name).and_return(val)
2235bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2245bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # run and test
2255bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.job.config_get(name)
2265bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
2275bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2285bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
229c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_setup_dirs_raise(self):
230c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
231c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
232c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # setup
233c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir = 'foo'
234c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        tmp_dir = 'bar'
235c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
236c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # record
237c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(tmp_dir).and_return(True)
238c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.isdir.expect_call(tmp_dir).and_return(False)
239c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
240c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # test
241c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertRaises(ValueError, self.job.setup_dirs, results_dir, tmp_dir)
242c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.check_playback()
243c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
244c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
245c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_setup_dirs(self):
246c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
247c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
248c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # setup
249c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir1 = os.path.join(self.job.resultdir, 'build')
250c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir2 = os.path.join(self.job.resultdir, 'build.2')
251c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir3 = os.path.join(self.job.resultdir, 'build.3')
252c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        tmp_dir = 'bar'
253c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
254c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # record
255c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(tmp_dir).and_return(False)
256c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.mkdir.expect_call(tmp_dir)
257c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.isdir.expect_call(tmp_dir).and_return(True)
258c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir1).and_return(True)
259c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir2).and_return(True)
260c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir3).and_return(False)
261c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir3).and_return(False)
262c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.mkdir.expect_call(results_dir3)
263c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
264c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # test
265c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertEqual(self.job.setup_dirs(None, tmp_dir),
266c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh                         (results_dir3, tmp_dir))
267c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.check_playback()
268c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
269c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
2706ca37b61b4701964caf9af73bc988114cae663efjadmanski    def test_xen(self):
2716ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.construct_job(True)
2726ca37b61b4701964caf9af73bc988114cae663efjadmanski
2736ca37b61b4701964caf9af73bc988114cae663efjadmanski        # setup
2746ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(self.job, "setup_dirs")
2756ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_class(xen, "xen")
2766ca37b61b4701964caf9af73bc988114cae663efjadmanski        results = 'results_dir'
2776ca37b61b4701964caf9af73bc988114cae663efjadmanski        tmp = 'tmp'
2786ca37b61b4701964caf9af73bc988114cae663efjadmanski        build = 'xen'
2796ca37b61b4701964caf9af73bc988114cae663efjadmanski        base_tree = object()
2806ca37b61b4701964caf9af73bc988114cae663efjadmanski
2816ca37b61b4701964caf9af73bc988114cae663efjadmanski        # record
2826ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.setup_dirs.expect_call(results,
2836ca37b61b4701964caf9af73bc988114cae663efjadmanski                                        tmp).and_return((results, tmp))
2846ca37b61b4701964caf9af73bc988114cae663efjadmanski        myxen = xen.xen.expect_new(self.job, base_tree, results, tmp, build,
2856ca37b61b4701964caf9af73bc988114cae663efjadmanski                                   False, None)
2866ca37b61b4701964caf9af73bc988114cae663efjadmanski
2876ca37b61b4701964caf9af73bc988114cae663efjadmanski        # run job and check
2886ca37b61b4701964caf9af73bc988114cae663efjadmanski        axen = self.job.xen(base_tree, results, tmp)
2896ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.check_playback()
2906ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.assertEquals(myxen, axen)
2916ca37b61b4701964caf9af73bc988114cae663efjadmanski
2926ca37b61b4701964caf9af73bc988114cae663efjadmanski
2936ca37b61b4701964caf9af73bc988114cae663efjadmanski    def test_kernel_rpm(self):
2946ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.construct_job(True)
2956ca37b61b4701964caf9af73bc988114cae663efjadmanski
2966ca37b61b4701964caf9af73bc988114cae663efjadmanski        # setup
2976ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(self.job, "setup_dirs")
2986ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_class(kernel, "rpm_kernel")
2996ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(kernel, "preprocess_path")
300c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.god.stub_function(self.job.pkgmgr, "fetch_pkg")
301e7785cc37c2081ebd3815673ef73750f7f10dfe0mbligh        self.god.stub_function(utils, "get_os_vendor")
3026ca37b61b4701964caf9af73bc988114cae663efjadmanski        results = 'results_dir'
3036ca37b61b4701964caf9af73bc988114cae663efjadmanski        tmp = 'tmp'
3046ca37b61b4701964caf9af73bc988114cae663efjadmanski        build = 'xen'
3056ca37b61b4701964caf9af73bc988114cae663efjadmanski        path = "somepath.rpm"
306c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        packages_dir = os.path.join("autodir/packages", path)
3076ca37b61b4701964caf9af73bc988114cae663efjadmanski
3086ca37b61b4701964caf9af73bc988114cae663efjadmanski        # record
3096ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.setup_dirs.expect_call(results,
3106ca37b61b4701964caf9af73bc988114cae663efjadmanski                                        tmp).and_return((results, tmp))
3116ca37b61b4701964caf9af73bc988114cae663efjadmanski        kernel.preprocess_path.expect_call(path).and_return(path)
3123bf79ca4d5490f9af09e1ddc39b8df5343b34d06mbligh        os.path.exists.expect_call(path).and_return(False)
313c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.job.pkgmgr.fetch_pkg.expect_call(path, packages_dir, repo_url='')
314e7785cc37c2081ebd3815673ef73750f7f10dfe0mbligh        utils.get_os_vendor.expect_call()
3151b160a0e5f3ce9877aefd143cd39327303916afembligh        mykernel = kernel.rpm_kernel.expect_new(self.job, [packages_dir],
316c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh                                                results)
3176ca37b61b4701964caf9af73bc988114cae663efjadmanski
3186ca37b61b4701964caf9af73bc988114cae663efjadmanski        # check
3196ca37b61b4701964caf9af73bc988114cae663efjadmanski        akernel = self.job.kernel(path, results, tmp)
3206ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.check_playback()
3216ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.assertEquals(mykernel, akernel)
3226ca37b61b4701964caf9af73bc988114cae663efjadmanski
3236ca37b61b4701964caf9af73bc988114cae663efjadmanski
3246ca37b61b4701964caf9af73bc988114cae663efjadmanski    def test_kernel(self):
3256ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.construct_job(True)
3266ca37b61b4701964caf9af73bc988114cae663efjadmanski
3276ca37b61b4701964caf9af73bc988114cae663efjadmanski        # setup
3286ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(self.job, "setup_dirs")
3296ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_class(kernel, "kernel")
3306ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(kernel, "preprocess_path")
3316ca37b61b4701964caf9af73bc988114cae663efjadmanski        results = 'results_dir'
3326ca37b61b4701964caf9af73bc988114cae663efjadmanski        tmp = 'tmp'
3336ca37b61b4701964caf9af73bc988114cae663efjadmanski        build = 'linux'
3346ca37b61b4701964caf9af73bc988114cae663efjadmanski        path = "somepath.deb"
3356ca37b61b4701964caf9af73bc988114cae663efjadmanski
3366ca37b61b4701964caf9af73bc988114cae663efjadmanski        # record
3376ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.setup_dirs.expect_call(results,
3386ca37b61b4701964caf9af73bc988114cae663efjadmanski                                        tmp).and_return((results, tmp))
3396ca37b61b4701964caf9af73bc988114cae663efjadmanski        kernel.preprocess_path.expect_call(path).and_return(path)
3406ca37b61b4701964caf9af73bc988114cae663efjadmanski        mykernel = kernel.kernel.expect_new(self.job, path, results, tmp,
3416ca37b61b4701964caf9af73bc988114cae663efjadmanski                                            build, False)
3426ca37b61b4701964caf9af73bc988114cae663efjadmanski
3436ca37b61b4701964caf9af73bc988114cae663efjadmanski        # check
3446ca37b61b4701964caf9af73bc988114cae663efjadmanski        akernel = self.job.kernel(path, results, tmp)
3456ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.check_playback()
3466ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.assertEquals(mykernel, akernel)
3476ca37b61b4701964caf9af73bc988114cae663efjadmanski
3486ca37b61b4701964caf9af73bc988114cae663efjadmanski
3496f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def test_run_test_logs_test_error_from_unhandled_error(self):
3506f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.construct_job(True)
3516f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3526f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up stubs
353c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.god.stub_function(self.job.pkgmgr, 'get_package_name')
3546f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.stub_function(self.job, "_runtest")
3556f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3566f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # create an unhandled error object
3576f731364e6207c198ac8de748a043eba1e9223b3jadmanski        class MyError(error.TestError):
3586f731364e6207c198ac8de748a043eba1e9223b3jadmanski            pass
3596f731364e6207c198ac8de748a043eba1e9223b3jadmanski        real_error = MyError("this is the real error message")
360c218083b6b96257788364ef8b7fa0fad5087fcbdmbligh        unhandled_error = error.UnhandledTestError(real_error)
3616f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3626f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up the recording
3636f731364e6207c198ac8de748a043eba1e9223b3jadmanski        testname = "error_test"
3646f731364e6207c198ac8de748a043eba1e9223b3jadmanski        outputdir = os.path.join(self.job.resultdir, testname)
365c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.job.pkgmgr.get_package_name.expect_call(
366c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            testname, 'test').and_return(("", testname))
367e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh        self.job.get_state.expect_call(
368e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh                self.job._RUN_NUMBER_STATE, default=0).and_return(0)
369e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh        self.job.get_state.expect_call(
370e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh                self.job._KERNEL_IN_TAG_STATE, default=False).and_return(False)
3716f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.path.exists.expect_call(outputdir).and_return(False)
3726f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.mkdir.expect_call(outputdir)
3736f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.record.expect_call("START", testname, testname)
3746f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._increment_group_level.expect_call()
3756f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._runtest.expect_call(testname, "", (), {}).and_raises(
3766f731364e6207c198ac8de748a043eba1e9223b3jadmanski            unhandled_error)
377ca7c6fe8e064d422986c633db16123b4e628a532jadmanski        self.job.record.expect_call("ERROR", testname, testname,
3786f731364e6207c198ac8de748a043eba1e9223b3jadmanski                                    first_line_comparator(str(real_error)))
3796f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._decrement_group_level.expect_call()
380b88d6dc723de628c0da22513c59997eab29ab1f3jadmanski        self.job.record.expect_call("END ERROR", testname, testname)
381b6eb2f19e1225b14dee3839c2945caf6bc90fa73jadmanski        self.job.harness.run_test_complete.expect_call()
38253da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
3836f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3846f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # run and check
3856f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.run_test(testname)
3866f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.check_playback()
3876f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3886f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3896f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def test_run_test_logs_non_test_error_from_unhandled_error(self):
3906f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.construct_job(True)
3916f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3926f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up stubs
393c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.god.stub_function(self.job.pkgmgr, 'get_package_name')
3946f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.stub_function(self.job, "_runtest")
3956f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3966f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # create an unhandled error object
3976f731364e6207c198ac8de748a043eba1e9223b3jadmanski        class MyError(Exception):
3986f731364e6207c198ac8de748a043eba1e9223b3jadmanski            pass
3996f731364e6207c198ac8de748a043eba1e9223b3jadmanski        real_error = MyError("this is the real error message")
400c218083b6b96257788364ef8b7fa0fad5087fcbdmbligh        unhandled_error = error.UnhandledTestError(real_error)
4016f731364e6207c198ac8de748a043eba1e9223b3jadmanski        reason = first_line_comparator("Unhandled MyError: %s" % real_error)
4026f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4036f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up the recording
4046f731364e6207c198ac8de748a043eba1e9223b3jadmanski        testname = "error_test"
4056f731364e6207c198ac8de748a043eba1e9223b3jadmanski        outputdir = os.path.join(self.job.resultdir, testname)
406c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.job.pkgmgr.get_package_name.expect_call(
407c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            testname, 'test').and_return(("", testname))
408e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh        self.job.get_state.expect_call(
409e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh                self.job._RUN_NUMBER_STATE, default=0).and_return(0)
410e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh        self.job.get_state.expect_call(
411e39c3c0dbe16caed55f4538af78dbf057deb7fadmbligh                self.job._KERNEL_IN_TAG_STATE, default=False).and_return(False)
4126f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.path.exists.expect_call(outputdir).and_return(False)
4136f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.mkdir.expect_call(outputdir)
4146f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.record.expect_call("START", testname, testname)
4156f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._increment_group_level.expect_call()
4166f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._runtest.expect_call(testname, "", (), {}).and_raises(
4176f731364e6207c198ac8de748a043eba1e9223b3jadmanski            unhandled_error)
418ca7c6fe8e064d422986c633db16123b4e628a532jadmanski        self.job.record.expect_call("ERROR", testname, testname, reason)
4196f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job._decrement_group_level.expect_call()
420b88d6dc723de628c0da22513c59997eab29ab1f3jadmanski        self.job.record.expect_call("END ERROR", testname, testname)
421b6eb2f19e1225b14dee3839c2945caf6bc90fa73jadmanski        self.job.harness.run_test_complete.expect_call()
42253da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
4236f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4246f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # run and check
4256f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.run_test(testname)
4266f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.check_playback()
4276f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4286ca37b61b4701964caf9af73bc988114cae663efjadmanski
4296ca37b61b4701964caf9af73bc988114cae663efjadmanski    def test_record(self):
4306ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.construct_job(True)
4316ca37b61b4701964caf9af73bc988114cae663efjadmanski
4326ca37b61b4701964caf9af73bc988114cae663efjadmanski        # steup
4336ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.group_level = 1
4346ca37b61b4701964caf9af73bc988114cae663efjadmanski        status = ''
4356ca37b61b4701964caf9af73bc988114cae663efjadmanski        status_code = "PASS"
4366ca37b61b4701964caf9af73bc988114cae663efjadmanski        subdir = "subdir"
4376ca37b61b4701964caf9af73bc988114cae663efjadmanski        operation = "super_fun"
4386ca37b61b4701964caf9af73bc988114cae663efjadmanski        mytime = "1234"
4396ca37b61b4701964caf9af73bc988114cae663efjadmanski        msg_tag = ""
4406ca37b61b4701964caf9af73bc988114cae663efjadmanski        if "." in self.job.log_filename:
4416ca37b61b4701964caf9af73bc988114cae663efjadmanski            msg_tag = self.job.log_filename.split(".", 1)[1]
4426ca37b61b4701964caf9af73bc988114cae663efjadmanski        epoch_time = int(mytime)
4436ca37b61b4701964caf9af73bc988114cae663efjadmanski        local_time = time.localtime(epoch_time)
4446ca37b61b4701964caf9af73bc988114cae663efjadmanski        optional_fields = {}
4456ca37b61b4701964caf9af73bc988114cae663efjadmanski        optional_fields["timestamp"] = str(epoch_time)
4466ca37b61b4701964caf9af73bc988114cae663efjadmanski        optional_fields["localtime"] = time.strftime("%b %d %H:%M:%S",
4476ca37b61b4701964caf9af73bc988114cae663efjadmanski                                                     local_time)
4486ca37b61b4701964caf9af73bc988114cae663efjadmanski        fields = [status_code, subdir, operation]
4496ca37b61b4701964caf9af73bc988114cae663efjadmanski        fields += ["%s=%s" % x for x in optional_fields.iteritems()]
4506ca37b61b4701964caf9af73bc988114cae663efjadmanski        fields.append(status)
4516ca37b61b4701964caf9af73bc988114cae663efjadmanski        msg = '\t'.join(str(x) for x in fields)
4526ca37b61b4701964caf9af73bc988114cae663efjadmanski        msg = '\t' * self.job.group_level + msg
4536ca37b61b4701964caf9af73bc988114cae663efjadmanski
4543cc04ee32e329ea228d33368bff679e05b2692c8jadmanski        self.god.stub_function(log, "is_valid_status")
4556ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(time, "time")
4566ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.stub_function(self.job, "open")
4576ca37b61b4701964caf9af73bc988114cae663efjadmanski
4586ca37b61b4701964caf9af73bc988114cae663efjadmanski
4596ca37b61b4701964caf9af73bc988114cae663efjadmanski        # record
4601b3b376d94edee8f235f8669a047dc00751bf97ambligh        log.is_valid_status.expect_call(status_code).and_return(True)
4616ca37b61b4701964caf9af73bc988114cae663efjadmanski        time.time.expect_call().and_return(mytime)
4626ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.harness.test_status_detail.expect_call(status_code, subdir,
4636ca37b61b4701964caf9af73bc988114cae663efjadmanski                                                        operation, '', msg_tag)
4646ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.harness.test_status.expect_call(msg, msg_tag)
4656ca37b61b4701964caf9af73bc988114cae663efjadmanski        myfile = self.god.create_mock_class(file, "file")
4666ca37b61b4701964caf9af73bc988114cae663efjadmanski        status_file = os.path.join(self.job.resultdir, self.job.log_filename)
4676ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.open.expect_call(status_file, "a").and_return(myfile)
4686ca37b61b4701964caf9af73bc988114cae663efjadmanski        myfile.write.expect_call(msg + "\n")
4696ca37b61b4701964caf9af73bc988114cae663efjadmanski
4706ca37b61b4701964caf9af73bc988114cae663efjadmanski        dir = os.path.join(self.job.resultdir, subdir)
4716ca37b61b4701964caf9af73bc988114cae663efjadmanski        status_file = os.path.join(dir, self.job.DEFAULT_LOG_FILENAME)
4726ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.open.expect_call(status_file, "a").and_return(myfile)
4736ca37b61b4701964caf9af73bc988114cae663efjadmanski        myfile.write.expect_call(msg + "\n")
4746ca37b61b4701964caf9af73bc988114cae663efjadmanski
4756ca37b61b4701964caf9af73bc988114cae663efjadmanski
4766ca37b61b4701964caf9af73bc988114cae663efjadmanski        # run test
4776ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.unstub(self.job, "record")
4786ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.job.record(status_code, subdir, operation)
4796ca37b61b4701964caf9af73bc988114cae663efjadmanski        self.god.check_playback()
4806ca37b61b4701964caf9af73bc988114cae663efjadmanski
4816ca37b61b4701964caf9af73bc988114cae663efjadmanski
482067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski    def test_end_boot(self):
483067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.construct_job(True)
484067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski
485067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        # set up the job class
486067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.job.group_level = 2
487067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski
488067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.job._decrement_group_level.expect_call()
489067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.job.record.expect_call("END GOOD", "sub", "reboot",
490067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski                                    optional_fields={"kernel": "2.6.15-smp",
491067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski                                                     "patch0": "patchname"})
492067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski
493067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        # run test
494067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.job.end_reboot("sub", "2.6.15-smp", ["patchname"])
495067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.god.check_playback()
496067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski
497067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski
498067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski    def test_end_boot_and_verify_success(self):
4991a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.construct_job(True)
5001a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5011a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        # set up the job class
5021a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.group_level = 2
5031a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
50453da18eddf69243ca175d9a4603cba5b55300726mbligh        self.god.stub_function(utils, "running_os_ident")
50553da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.running_os_ident.expect_call().and_return("2.6.15-smp")
5061a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5071a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        utils.read_one_line.expect_call("/proc/cmdline").and_return(
5081a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski            "blah more-blah root=lala IDENT=81234567 blah-again")
5091a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5103bf79ca4d5490f9af09e1ddc39b8df5343b34d06mbligh        self.god.stub_function(utils, "running_os_full_version")
5113bf79ca4d5490f9af09e1ddc39b8df5343b34d06mbligh        utils.running_os_full_version.expect_call().and_return("2.6.15-smp")
5123bf79ca4d5490f9af09e1ddc39b8df5343b34d06mbligh
5131a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.record.expect_call("GOOD", "sub", "reboot.verify",
5141a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski                                    "2.6.15-smp")
5151a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job._decrement_group_level.expect_call()
5161a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.record.expect_call("END GOOD", "sub", "reboot",
5171a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski                                    optional_fields={"kernel": "2.6.15-smp"})
5181a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5191a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        # run test
520067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.job.end_reboot_and_verify(81234567, "2.6.15-smp", "sub")
5211a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.god.check_playback()
5221a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5231a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
524067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski    def test_end_boot_and_verify_failure(self):
5251a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.construct_job(True)
5261a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5271a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        # set up the job class
5281a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.group_level = 2
5291a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
53053da18eddf69243ca175d9a4603cba5b55300726mbligh        self.god.stub_function(utils, "running_os_ident")
53153da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.running_os_ident.expect_call().and_return("2.6.15-smp")
5321a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5331a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        utils.read_one_line.expect_call("/proc/cmdline").and_return(
5341a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski            "blah more-blah root=lala IDENT=81234567 blah-again")
5351a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5361a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.record.expect_call("ABORT", "sub", "reboot.verify",
5371a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski                                    "boot failure")
5381a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job._decrement_group_level.expect_call()
5391a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.job.record.expect_call("END ABORT", "sub", "reboot",
5401a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski                                    optional_fields={"kernel": "2.6.15-smp"})
5411a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5421a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        # run test
543067b26c1f0db3592e788b748ccb7ee5710161fa2jadmanski        self.assertRaises(error.JobError, self.job.end_reboot_and_verify,
5441a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski                          91234567, "2.6.16-smp", "sub")
5451a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski        self.god.check_playback()
5461a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5471a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5485bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighif __name__ == "__main__":
5495bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    unittest.main()
550