15bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh#!/usr/bin/python
29aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette# pylint: disable=missing-docstring
35bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
467ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport logging
567ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport os
667ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport shutil
767ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport StringIO
867ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport sys
967ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport unittest
106f731364e6207c198ac8de748a043eba1e9223b3jadmanski
1167ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgiimport common
129aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnettefrom autotest_lib.client.bin import job, sysinfo, harness
139aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnettefrom autotest_lib.client.bin import utils
149aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnettefrom autotest_lib.client.common_lib import error
150d0f67d6abcf6599ad626042d3236020e093558fmblighfrom autotest_lib.client.common_lib import logging_manager, logging_config
160d0f67d6abcf6599ad626042d3236020e093558fmblighfrom autotest_lib.client.common_lib import base_job_unittest
1767ad67d564fd605dc0ac3671b1620a601cfc6c90Justin Giorgifrom autotest_lib.client.common_lib.test_utils import mock
185bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
195bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
200d0f67d6abcf6599ad626042d3236020e093558fmblighclass job_test_case(unittest.TestCase):
210d0f67d6abcf6599ad626042d3236020e093558fmbligh    """Generic job TestCase class that defines a standard job setUp and
220d0f67d6abcf6599ad626042d3236020e093558fmbligh    tearDown, with some standard stubs."""
230d0f67d6abcf6599ad626042d3236020e093558fmbligh
240d0f67d6abcf6599ad626042d3236020e093558fmbligh    job_class = job.base_client_job
250d0f67d6abcf6599ad626042d3236020e093558fmbligh
260d0f67d6abcf6599ad626042d3236020e093558fmbligh    def setUp(self):
27861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li        self.god = mock.mock_god(ut=self)
280d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_with(job.base_client_job, '_get_environ_autodir',
290d0f67d6abcf6599ad626042d3236020e093558fmbligh                           classmethod(lambda cls: '/adir'))
300d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.job = self.job_class.__new__(self.job_class)
310d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.job._job_directory = base_job_unittest.stub_job_directory
320d0f67d6abcf6599ad626042d3236020e093558fmbligh
330d0f67d6abcf6599ad626042d3236020e093558fmbligh
340d0f67d6abcf6599ad626042d3236020e093558fmbligh    def tearDown(self):
350d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.unstub_all()
360d0f67d6abcf6599ad626042d3236020e093558fmbligh
370d0f67d6abcf6599ad626042d3236020e093558fmbligh
380d0f67d6abcf6599ad626042d3236020e093558fmblighclass test_find_base_directories(
390d0f67d6abcf6599ad626042d3236020e093558fmbligh        base_job_unittest.test_find_base_directories.generic_tests,
400d0f67d6abcf6599ad626042d3236020e093558fmbligh        job_test_case):
410d0f67d6abcf6599ad626042d3236020e093558fmbligh
420d0f67d6abcf6599ad626042d3236020e093558fmbligh    def test_autodir_equals_clientdir(self):
430d0f67d6abcf6599ad626042d3236020e093558fmbligh        autodir, clientdir, _ = self.job._find_base_directories()
440d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.assertEqual(autodir, '/adir')
450d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.assertEqual(clientdir, '/adir')
460d0f67d6abcf6599ad626042d3236020e093558fmbligh
470d0f67d6abcf6599ad626042d3236020e093558fmbligh
480d0f67d6abcf6599ad626042d3236020e093558fmbligh    def test_serverdir_is_none(self):
490d0f67d6abcf6599ad626042d3236020e093558fmbligh        _, _, serverdir = self.job._find_base_directories()
500d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.assertEqual(serverdir, None)
510d0f67d6abcf6599ad626042d3236020e093558fmbligh
520d0f67d6abcf6599ad626042d3236020e093558fmbligh
530d0f67d6abcf6599ad626042d3236020e093558fmblighclass abstract_test_init(base_job_unittest.test_init.generic_tests):
540d0f67d6abcf6599ad626042d3236020e093558fmbligh    """Generic client job mixin used when defining variations on the
550d0f67d6abcf6599ad626042d3236020e093558fmbligh    job.__init__ generic tests."""
560d0f67d6abcf6599ad626042d3236020e093558fmbligh    OPTIONAL_ATTRIBUTES = (
570d0f67d6abcf6599ad626042d3236020e093558fmbligh        base_job_unittest.test_init.generic_tests.OPTIONAL_ATTRIBUTES
589aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette        - set(['control', 'harness']))
590d0f67d6abcf6599ad626042d3236020e093558fmbligh
600d0f67d6abcf6599ad626042d3236020e093558fmbligh
610d0f67d6abcf6599ad626042d3236020e093558fmblighclass test_init_minimal_options(abstract_test_init, job_test_case):
620d0f67d6abcf6599ad626042d3236020e093558fmbligh    def call_init(self):
630d0f67d6abcf6599ad626042d3236020e093558fmbligh        # TODO(jadmanski): refactor more of the __init__ code to not need to
640d0f67d6abcf6599ad626042d3236020e093558fmbligh        # stub out countless random APIs
650d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.os, 'mkdir', None)
660d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.os.path, 'exists', True)
670d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(self.job, '_load_state', None)
680d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(self.job, 'record', None)
690d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.shutil, 'copyfile', None)
700d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.logging_manager,
710d0f67d6abcf6599ad626042d3236020e093558fmbligh                                         'configure_logging', None)
720d0f67d6abcf6599ad626042d3236020e093558fmbligh        class manager:
730d0f67d6abcf6599ad626042d3236020e093558fmbligh            def start_logging(self):
740d0f67d6abcf6599ad626042d3236020e093558fmbligh                return None
750d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.logging_manager,
760d0f67d6abcf6599ad626042d3236020e093558fmbligh                                         'get_logging_manager', manager())
770d0f67d6abcf6599ad626042d3236020e093558fmbligh        class stub_sysinfo:
780d0f67d6abcf6599ad626042d3236020e093558fmbligh            def log_per_reboot_data(self):
790d0f67d6abcf6599ad626042d3236020e093558fmbligh                return None
800d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.sysinfo, 'sysinfo',
810d0f67d6abcf6599ad626042d3236020e093558fmbligh                                         stub_sysinfo())
820d0f67d6abcf6599ad626042d3236020e093558fmbligh        class stub_harness:
830d0f67d6abcf6599ad626042d3236020e093558fmbligh            run_start = lambda self: None
840d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.harness, 'select', stub_harness())
850d0f67d6abcf6599ad626042d3236020e093558fmbligh        class options:
860d0f67d6abcf6599ad626042d3236020e093558fmbligh            tag = ''
870d0f67d6abcf6599ad626042d3236020e093558fmbligh            verbose = False
880d0f67d6abcf6599ad626042d3236020e093558fmbligh            cont = False
890d0f67d6abcf6599ad626042d3236020e093558fmbligh            harness = 'stub'
908a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li            harness_args = None
910d0f67d6abcf6599ad626042d3236020e093558fmbligh            hostname = None
920d0f67d6abcf6599ad626042d3236020e093558fmbligh            user = None
930d0f67d6abcf6599ad626042d3236020e093558fmbligh            log = False
94808f4b1663600ba7e735c4d78125825c52bb804fjadmanski            args = ''
958adf78936c915df6fd1edb6c592f40a7ed8350a5Dale Curtis            output_dir = ''
960d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_function_to_return(job.utils, 'drop_caches', None)
970d0f67d6abcf6599ad626042d3236020e093558fmbligh
989de6ed7ab19c29b5072d52439f434453df16bec0mbligh        self.job._job_state = base_job_unittest.stub_job_state
990d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.job.__init__('/control', options)
1000d0f67d6abcf6599ad626042d3236020e093558fmbligh
1010d0f67d6abcf6599ad626042d3236020e093558fmbligh
1020d0f67d6abcf6599ad626042d3236020e093558fmblighclass dummy(object):
10310d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard    """A simple placeholder for attributes"""
10410d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard    pass
10510d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard
10610d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard
1076f731364e6207c198ac8de748a043eba1e9223b3jadmanskiclass first_line_comparator(mock.argument_comparator):
1086f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def __init__(self, first_line):
1096f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.first_line = first_line
1106f731364e6207c198ac8de748a043eba1e9223b3jadmanski
1116f731364e6207c198ac8de748a043eba1e9223b3jadmanski
1126f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def is_satisfied_by(self, parameter):
1136f731364e6207c198ac8de748a043eba1e9223b3jadmanski        return self.first_line == parameter.splitlines()[0]
1146f731364e6207c198ac8de748a043eba1e9223b3jadmanski
1156f731364e6207c198ac8de748a043eba1e9223b3jadmanski
1160d0f67d6abcf6599ad626042d3236020e093558fmblighclass test_base_job(unittest.TestCase):
1175bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def setUp(self):
1185bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # make god
119861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li        self.god = mock.mock_god(ut=self)
1205bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1215bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # need to set some environ variables
1225bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.autodir = "autodir"
1235bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        os.environ['AUTODIR'] = self.autodir
1245bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1255bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # set up some variables
1265bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.control = "control"
1275bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.jobtag = "jobtag"
1285bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1297629f148feee19efa11bc041d49943aacc43c482showard        # get rid of stdout and logging
13054705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh        sys.stdout = StringIO.StringIO()
13175cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        logging_manager.configure_logging(logging_config.TestingConfig())
13275cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        logging.disable(logging.CRITICAL)
13375cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        def dummy_configure_logging(*args, **kwargs):
13475cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward            pass
13575cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        self.god.stub_with(logging_manager, 'configure_logging',
13675cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                           dummy_configure_logging)
13775cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        real_get_logging_manager = logging_manager.get_logging_manager
13875cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        def get_logging_manager_no_fds(manage_stdout_and_stderr=False,
13975cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                                       redirect_fds=False):
14075cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward            return real_get_logging_manager(manage_stdout_and_stderr, False)
14175cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward        self.god.stub_with(logging_manager, 'get_logging_manager',
14275cdfee87bfaa3cf3f9860832b228a6d32aaed2fshoward                           get_logging_manager_no_fds)
14354705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh
1445bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # stub out some stuff
1455bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(os.path, 'exists')
146c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.stub_function(os.path, 'isdir')
1477629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(os, 'makedirs')
1485bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(os, 'mkdir')
1497629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(os, 'remove')
1507629f148feee19efa11bc041d49943aacc43c482showard        self.god.stub_function(shutil, 'rmtree')
1515bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(shutil, 'copyfile')
1525bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(job, 'open')
1535bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(utils, 'system')
15453da18eddf69243ca175d9a4603cba5b55300726mbligh        self.god.stub_function(utils, 'drop_caches')
1555bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(harness, 'select')
1565bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(sysinfo, 'log_per_reboot_data')
1575bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
158ce955fcf58207d795ff1fe0001851b8b3728452cmbligh        self.god.stub_class(job.local_host, 'LocalHost')
159cefe2653333168a08c891f72a708b66855f07853jadmanski        self.god.stub_class(sysinfo, 'sysinfo')
1605bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
161be583c18a66815a3d93fae411c5fd58788aff4c0lmr        self.god.stub_class_method(job.base_client_job,
162be583c18a66815a3d93fae411c5fd58788aff4c0lmr                                   '_cleanup_debugdir_files')
1630d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_class_method(job.base_client_job, '_cleanup_results_dir')
1640d0f67d6abcf6599ad626042d3236020e093558fmbligh
1650d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.god.stub_with(job.base_job.job_directory, '_ensure_valid',
1660d0f67d6abcf6599ad626042d3236020e093558fmbligh                           lambda *_: None)
1674cfdce15cca1bc4988ee4531e49f3da4d18848eashoward
1685bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1695bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def tearDown(self):
17054705a0d9dbe23800f14e785edbd6d3f5eebaff3mbligh        sys.stdout = sys.__stdout__
1715bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.unstub_all()
1725bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
1735bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
17422f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def _setup_pre_record_init(self, cont):
17522f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.god.stub_function(self.job, '_load_state')
17622f160e1f689ee0391fc2b5ae5927551614e1428mbligh
17722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        resultdir = os.path.join(self.autodir, 'results', self.jobtag)
17822f160e1f689ee0391fc2b5ae5927551614e1428mbligh        tmpdir = os.path.join(self.autodir, 'tmp')
17922f160e1f689ee0391fc2b5ae5927551614e1428mbligh        if not cont:
180be583c18a66815a3d93fae411c5fd58788aff4c0lmr            job.base_client_job._cleanup_debugdir_files.expect_call()
1810d0f67d6abcf6599ad626042d3236020e093558fmbligh            job.base_client_job._cleanup_results_dir.expect_call()
18222f160e1f689ee0391fc2b5ae5927551614e1428mbligh
18322f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.job._load_state.expect_call()
18422f160e1f689ee0391fc2b5ae5927551614e1428mbligh
18522f160e1f689ee0391fc2b5ae5927551614e1428mbligh        my_harness = self.god.create_mock_class(harness.harness,
18622f160e1f689ee0391fc2b5ae5927551614e1428mbligh                                                'my_harness')
18722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        harness.select.expect_call(None,
1888a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li                                   self.job,
1898a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li                                   None).and_return(my_harness)
19022f160e1f689ee0391fc2b5ae5927551614e1428mbligh
19122f160e1f689ee0391fc2b5ae5927551614e1428mbligh        return resultdir, my_harness
1925bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
19322f160e1f689ee0391fc2b5ae5927551614e1428mbligh
19422f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def _setup_post_record_init(self, cont, resultdir, my_harness):
1955bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # now some specific stubs
1965bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'config_get')
197d948bfb7729e94b457bafca91a13c963d7edcba6mbligh        self.god.stub_function(self.job, 'config_set')
1985bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.stub_function(self.job, 'record')
1995bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2005bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # other setup
2015bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        results = os.path.join(self.autodir, 'results')
2025bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        download = os.path.join(self.autodir, 'tests', 'download')
203c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        pkgdir = os.path.join(self.autodir, 'packages')
2045bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
20553da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
206c09fc1543a3f77026bab728770aa0191feaddd07jadmanski        job_sysinfo = sysinfo.sysinfo.expect_new(resultdir)
2075bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        if not cont:
2085bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.path.exists.expect_call(download).and_return(False)
2095bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            os.mkdir.expect_call(download)
2105bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            shutil.copyfile.expect_call(mock.is_string_comparator(),
2115bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh                                 os.path.join(resultdir, 'control'))
2125bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2139aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette        job.local_host.LocalHost.expect_new(hostname='localhost')
214cefe2653333168a08c891f72a708b66855f07853jadmanski        job_sysinfo.log_per_reboot_data.expect_call()
2155bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        if not cont:
2165bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh            self.job.record.expect_call('START', None, None)
2175bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2185bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        my_harness.run_start.expect_call()
2195bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
22022f160e1f689ee0391fc2b5ae5927551614e1428mbligh
22122f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def construct_job(self, cont):
22222f160e1f689ee0391fc2b5ae5927551614e1428mbligh        # will construct class instance using __new__
2230d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.job = job.base_client_job.__new__(job.base_client_job)
22422f160e1f689ee0391fc2b5ae5927551614e1428mbligh
22522f160e1f689ee0391fc2b5ae5927551614e1428mbligh        # record
22622f160e1f689ee0391fc2b5ae5927551614e1428mbligh        resultdir, my_harness = self._setup_pre_record_init(cont)
22722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self._setup_post_record_init(cont, resultdir, my_harness)
22822f160e1f689ee0391fc2b5ae5927551614e1428mbligh
2295bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # finish constructor
2300d0f67d6abcf6599ad626042d3236020e093558fmbligh        options = dummy()
23110d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard        options.tag = self.jobtag
23210d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard        options.cont = cont
23310d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard        options.harness = None
2348a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li        options.harness_args = None
23510d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard        options.log = False
23610d8417b8c3576e1ba80ce00b6ae2e9cea826bc0showard        options.verbose = False
237ce955fcf58207d795ff1fe0001851b8b3728452cmbligh        options.hostname = 'localhost'
2380d0f67d6abcf6599ad626042d3236020e093558fmbligh        options.user = 'my_user'
239808f4b1663600ba7e735c4d78125825c52bb804fjadmanski        options.args = ''
2408adf78936c915df6fd1edb6c592f40a7ed8350a5Dale Curtis        options.output_dir = ''
2419aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette        self.job.__init__(self.control, options)
2425bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2435bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # check
2445bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
2455bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
246c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
247c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh    def get_partition_mock(self, devname):
248c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        """
249c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        Create a mock of a partition object and return it.
250c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        """
251c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        class mock(object):
252c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh            device = devname
253c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh            get_mountpoint = self.god.create_mock_function('get_mountpoint')
254c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        return mock
255c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
256c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
25722f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def test_constructor_first_run(self):
2585bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(False)
2595bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
2605bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
26122f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def test_constructor_continuation(self):
26222f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.construct_job(True)
26322f160e1f689ee0391fc2b5ae5927551614e1428mbligh
26422f160e1f689ee0391fc2b5ae5927551614e1428mbligh
26522f160e1f689ee0391fc2b5ae5927551614e1428mbligh    def test_constructor_post_record_failure(self):
26622f160e1f689ee0391fc2b5ae5927551614e1428mbligh        """
26722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        Test post record initialization failure.
26822f160e1f689ee0391fc2b5ae5927551614e1428mbligh        """
2690d0f67d6abcf6599ad626042d3236020e093558fmbligh        self.job = job.base_client_job.__new__(job.base_client_job)
2700d0f67d6abcf6599ad626042d3236020e093558fmbligh        options = dummy()
27122f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.tag = self.jobtag
27222f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.cont = False
27322f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.harness = None
2748a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li        options.harness_args = None
27522f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.log = False
27622f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.verbose = False
27722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        options.hostname = 'localhost'
2780d0f67d6abcf6599ad626042d3236020e093558fmbligh        options.user = 'my_user'
279808f4b1663600ba7e735c4d78125825c52bb804fjadmanski        options.args = ''
2808adf78936c915df6fd1edb6c592f40a7ed8350a5Dale Curtis        options.output_dir = ''
28122f160e1f689ee0391fc2b5ae5927551614e1428mbligh        error = Exception('fail')
28222f160e1f689ee0391fc2b5ae5927551614e1428mbligh
28322f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.god.stub_function(self.job, '_post_record_init')
28422f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.god.stub_function(self.job, 'record')
28522f160e1f689ee0391fc2b5ae5927551614e1428mbligh
28622f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self._setup_pre_record_init(False)
28722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.job._post_record_init.expect_call(
2889aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette                self.control, options, True).and_raises(error)
28922f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.job.record.expect_call(
29022f160e1f689ee0391fc2b5ae5927551614e1428mbligh                'ABORT', None, None,'client.bin.job.__init__ failed: %s' %
29122f160e1f689ee0391fc2b5ae5927551614e1428mbligh                str(error))
29222f160e1f689ee0391fc2b5ae5927551614e1428mbligh
29322f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.assertRaises(
29422f160e1f689ee0391fc2b5ae5927551614e1428mbligh                Exception, self.job.__init__, self.control, options,
2959aec6930955ea7d3d345cf2d214f9e6982f84cb8Richard Barnette                drop_caches=True)
29622f160e1f689ee0391fc2b5ae5927551614e1428mbligh
29722f160e1f689ee0391fc2b5ae5927551614e1428mbligh        # check
29822f160e1f689ee0391fc2b5ae5927551614e1428mbligh        self.god.check_playback()
29922f160e1f689ee0391fc2b5ae5927551614e1428mbligh
30022f160e1f689ee0391fc2b5ae5927551614e1428mbligh
301c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_control_functions(self):
302c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
303c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        control_file = "blah"
304c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.job.control_set(control_file)
305c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertEquals(self.job.control_get(), os.path.abspath(control_file))
306c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
307c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
3085bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    def test_harness_select(self):
3095bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.construct_job(True)
3105bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
3115bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # record
3125bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        which = "which"
3138a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li        harness_args = ''
3148a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li        harness.select.expect_call(which, self.job,
3158a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li                                   harness_args).and_return(None)
3165bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
3175bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        # run and test
3188a12e800f05f6862fc39c6a45c9c57d9051b795eEric Li        self.job.harness_select(which, harness_args)
3195bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh        self.god.check_playback()
3205bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
3215bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh
322c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_setup_dirs_raise(self):
323c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
324c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
325c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # setup
326c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir = 'foo'
327c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        tmp_dir = 'bar'
328c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
329c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # record
330c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(tmp_dir).and_return(True)
331c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.isdir.expect_call(tmp_dir).and_return(False)
332c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
333c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # test
334c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertRaises(ValueError, self.job.setup_dirs, results_dir, tmp_dir)
335c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.check_playback()
336c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
337c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
338c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh    def test_setup_dirs(self):
339c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.construct_job(True)
340c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
341c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # setup
342c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir1 = os.path.join(self.job.resultdir, 'build')
343c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir2 = os.path.join(self.job.resultdir, 'build.2')
344c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        results_dir3 = os.path.join(self.job.resultdir, 'build.3')
345c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        tmp_dir = 'bar'
346c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
347c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # record
348c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(tmp_dir).and_return(False)
349c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.mkdir.expect_call(tmp_dir)
350c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.isdir.expect_call(tmp_dir).and_return(True)
351c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir1).and_return(True)
352c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir2).and_return(True)
353c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir3).and_return(False)
354c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.path.exists.expect_call(results_dir3).and_return(False)
355c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        os.mkdir.expect_call(results_dir3)
356c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
357c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        # test
358c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.assertEqual(self.job.setup_dirs(None, tmp_dir),
359c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh                         (results_dir3, tmp_dir))
360c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh        self.god.check_playback()
361c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
362c1f8cedaa425fa57813e4e8ce6db2b84676816bambligh
3636f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def test_run_test_logs_test_error_from_unhandled_error(self):
3646f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.construct_job(True)
3656f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3666f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up stubs
367c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.god.stub_function(self.job.pkgmgr, 'get_package_name')
3686f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.stub_function(self.job, "_runtest")
3696f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3706f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # create an unhandled error object
3716f731364e6207c198ac8de748a043eba1e9223b3jadmanski        class MyError(error.TestError):
3726f731364e6207c198ac8de748a043eba1e9223b3jadmanski            pass
3736f731364e6207c198ac8de748a043eba1e9223b3jadmanski        real_error = MyError("this is the real error message")
374c218083b6b96257788364ef8b7fa0fad5087fcbdmbligh        unhandled_error = error.UnhandledTestError(real_error)
3756f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3766f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up the recording
3776f731364e6207c198ac8de748a043eba1e9223b3jadmanski        testname = "error_test"
3786f731364e6207c198ac8de748a043eba1e9223b3jadmanski        outputdir = os.path.join(self.job.resultdir, testname)
379c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.job.pkgmgr.get_package_name.expect_call(
380c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            testname, 'test').and_return(("", testname))
3816f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.path.exists.expect_call(outputdir).and_return(False)
382d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.record.expect_call("START", testname, testname,
383d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li                                    optional_fields=None)
384d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job._runtest.expect_call(testname, "", None, (), {}).and_raises(
3856f731364e6207c198ac8de748a043eba1e9223b3jadmanski            unhandled_error)
386ca7c6fe8e064d422986c633db16123b4e628a532jadmanski        self.job.record.expect_call("ERROR", testname, testname,
3876f731364e6207c198ac8de748a043eba1e9223b3jadmanski                                    first_line_comparator(str(real_error)))
388b88d6dc723de628c0da22513c59997eab29ab1f3jadmanski        self.job.record.expect_call("END ERROR", testname, testname)
389b6eb2f19e1225b14dee3839c2945caf6bc90fa73jadmanski        self.job.harness.run_test_complete.expect_call()
39053da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
3916f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3926f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # run and check
3936f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.run_test(testname)
3946f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.check_playback()
3956f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3966f731364e6207c198ac8de748a043eba1e9223b3jadmanski
3976f731364e6207c198ac8de748a043eba1e9223b3jadmanski    def test_run_test_logs_non_test_error_from_unhandled_error(self):
3986f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.construct_job(True)
3996f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4006f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up stubs
401c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.god.stub_function(self.job.pkgmgr, 'get_package_name')
4026f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.stub_function(self.job, "_runtest")
4036f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4046f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # create an unhandled error object
4056f731364e6207c198ac8de748a043eba1e9223b3jadmanski        class MyError(Exception):
4066f731364e6207c198ac8de748a043eba1e9223b3jadmanski            pass
4076f731364e6207c198ac8de748a043eba1e9223b3jadmanski        real_error = MyError("this is the real error message")
408c218083b6b96257788364ef8b7fa0fad5087fcbdmbligh        unhandled_error = error.UnhandledTestError(real_error)
4096f731364e6207c198ac8de748a043eba1e9223b3jadmanski        reason = first_line_comparator("Unhandled MyError: %s" % real_error)
4106f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4116f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # set up the recording
4126f731364e6207c198ac8de748a043eba1e9223b3jadmanski        testname = "error_test"
4136f731364e6207c198ac8de748a043eba1e9223b3jadmanski        outputdir = os.path.join(self.job.resultdir, testname)
414c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh        self.job.pkgmgr.get_package_name.expect_call(
415c5ddfd1f71caef9ec0c84c53ef7db42fcdc33e1cmbligh            testname, 'test').and_return(("", testname))
4166f731364e6207c198ac8de748a043eba1e9223b3jadmanski        os.path.exists.expect_call(outputdir).and_return(False)
417d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.record.expect_call("START", testname, testname,
418d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li                                    optional_fields=None)
419d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job._runtest.expect_call(testname, "", None, (), {}).and_raises(
4206f731364e6207c198ac8de748a043eba1e9223b3jadmanski            unhandled_error)
421ca7c6fe8e064d422986c633db16123b4e628a532jadmanski        self.job.record.expect_call("ERROR", testname, testname, reason)
422b88d6dc723de628c0da22513c59997eab29ab1f3jadmanski        self.job.record.expect_call("END ERROR", testname, testname)
423b6eb2f19e1225b14dee3839c2945caf6bc90fa73jadmanski        self.job.harness.run_test_complete.expect_call()
42453da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.drop_caches.expect_call()
4256f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4266f731364e6207c198ac8de748a043eba1e9223b3jadmanski        # run and check
4276f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.job.run_test(testname)
4286f731364e6207c198ac8de748a043eba1e9223b3jadmanski        self.god.check_playback()
4296f731364e6207c198ac8de748a043eba1e9223b3jadmanski
4306ca37b61b4701964caf9af73bc988114cae663efjadmanski
431c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh    def test_report_reboot_failure(self):
432c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.construct_job(True)
433c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
434c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # record
435c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.job.record.expect_call("ABORT", "sub", "reboot.verify",
436c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                                    "boot failure")
437c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.job.record.expect_call("END ABORT", "sub", "reboot",
438c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                                    optional_fields={"kernel": "2.6.15-smp"})
439c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
440c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # playback
441c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.job._record_reboot_failure("sub", "reboot.verify", "boot failure",
442c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                                        running_id="2.6.15-smp")
443c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.god.check_playback()
444c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
445c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
446430de8f0d9920ca3149086b87a387cae6508e41fjadmanski    def _setup_check_post_reboot(self, mount_info, cpu_count):
447c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # setup
448c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.god.stub_function(job.partition_lib, "get_partition_list")
449430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.god.stub_function(utils, "count_cpus")
450c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
451c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        part_list = [self.get_partition_mock("/dev/hda1"),
452c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                     self.get_partition_mock("/dev/hdb1")]
453c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        mount_list = ["/mnt/hda1", "/mnt/hdb1"]
454c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
455c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # record
45627a3ae0446e476839f9b16992063819129df1016lmr        job.partition_lib.get_partition_list.expect_call(
45727a3ae0446e476839f9b16992063819129df1016lmr                self.job, exclude_swap=False).and_return(part_list)
458c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        for i in xrange(len(part_list)):
459c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh            part_list[i].get_mountpoint.expect_call().and_return(mount_list[i])
460430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        if cpu_count is not None:
461430de8f0d9920ca3149086b87a387cae6508e41fjadmanski            utils.count_cpus.expect_call().and_return(cpu_count)
4629de6ed7ab19c29b5072d52439f434453df16bec0mbligh        self.job._state.set('client', 'mount_info', mount_info)
463430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.job._state.set('client', 'cpu_count', 8)
464c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
465c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
466c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh    def test_check_post_reboot_success(self):
467c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.construct_job(True)
468c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
469c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        mount_info = set([("/dev/hda1", "/mnt/hda1"),
470c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                          ("/dev/hdb1", "/mnt/hdb1")])
471430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self._setup_check_post_reboot(mount_info, 8)
472c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
473c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # playback
474c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.job._check_post_reboot("sub")
475c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.god.check_playback()
476c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
477c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
478c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh    def test_check_post_reboot_mounts_failure(self):
479c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.construct_job(True)
480c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
481c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        mount_info = set([("/dev/hda1", "/mnt/hda1")])
482430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self._setup_check_post_reboot(mount_info, None)
483c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
484c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.god.stub_function(self.job, "_record_reboot_failure")
485c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.job._record_reboot_failure.expect_call("sub",
486c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                "reboot.verify_config", "mounted partitions are different after"
487c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                " reboot (old entries: set([]), new entries: set([('/dev/hdb1',"
488c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh                " '/mnt/hdb1')]))", running_id=None)
489c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
490c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        # playback
491c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.assertRaises(error.JobError, self.job._check_post_reboot, "sub")
492c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh        self.god.check_playback()
493c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
494c3f3d6161da50f37fd3e62980ac916f36bc2be59mbligh
495430de8f0d9920ca3149086b87a387cae6508e41fjadmanski    def test_check_post_reboot_cpu_failure(self):
496430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.construct_job(True)
497430de8f0d9920ca3149086b87a387cae6508e41fjadmanski
498430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        mount_info = set([("/dev/hda1", "/mnt/hda1"),
499430de8f0d9920ca3149086b87a387cae6508e41fjadmanski                          ("/dev/hdb1", "/mnt/hdb1")])
500430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self._setup_check_post_reboot(mount_info, 4)
501430de8f0d9920ca3149086b87a387cae6508e41fjadmanski
502430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.god.stub_function(self.job, "_record_reboot_failure")
503430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.job._record_reboot_failure.expect_call(
504430de8f0d9920ca3149086b87a387cae6508e41fjadmanski            'sub', 'reboot.verify_config',
505430de8f0d9920ca3149086b87a387cae6508e41fjadmanski            'Number of CPUs changed after reboot (old count: 8, new count: 4)',
506430de8f0d9920ca3149086b87a387cae6508e41fjadmanski            running_id=None)
507430de8f0d9920ca3149086b87a387cae6508e41fjadmanski
508430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        # playback
509430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.assertRaises(error.JobError, self.job._check_post_reboot, "sub")
510430de8f0d9920ca3149086b87a387cae6508e41fjadmanski        self.god.check_playback()
5111a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
5121a43a8cd72c9c572b255e2b316c553a5d5aac19ajadmanski
513861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li    def test_parse_args(self):
514861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li        test_set = {"a='foo bar baz' b='moo apt'":
515861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li                    ["a='foo bar baz'", "b='moo apt'"],
516861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li                    "a='foo bar baz' only=gah":
517861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li                    ["a='foo bar baz'", "only=gah"],
518861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li                    "a='b c d' no=argh":
519861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li                    ["a='b c d'", "no=argh"]}
520861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li        for t in test_set:
521861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li            parsed_args = job.base_client_job._parse_args(t)
522861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li            expected_args = test_set[t]
523861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li            self.assertEqual(parsed_args, expected_args)
524861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li
525861b2d54aec24228cdb3895dbc40062cb40cb2adEric Li
526d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li    def test_run_test_timeout_parameter_is_propagated(self):
527d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.construct_job(True)
528d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
529d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        # set up stubs
530d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.god.stub_function(self.job.pkgmgr, 'get_package_name')
531d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.god.stub_function(self.job, "_runtest")
532d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
533d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        # create an unhandled error object
534d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        #class MyError(error.TestError):
535d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        #    pass
536d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        #real_error = MyError("this is the real error message")
537d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        #unhandled_error = error.UnhandledTestError(real_error)
538d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
539d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        # set up the recording
540d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        testname = "test"
541d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        outputdir = os.path.join(self.job.resultdir, testname)
542d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.pkgmgr.get_package_name.expect_call(
543d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li            testname, 'test').and_return(("", testname))
544d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        os.path.exists.expect_call(outputdir).and_return(False)
545d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        timeout = 60
546d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        optional_fields = {}
547d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        optional_fields['timeout'] = timeout
548d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.record.expect_call("START", testname, testname,
549d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li                                    optional_fields=optional_fields)
550d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job._runtest.expect_call(testname, "", timeout, (), {})
551d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.record.expect_call("GOOD", testname, testname,
552d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li                                    "completed successfully")
553d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.record.expect_call("END GOOD", testname, testname)
554d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.harness.run_test_complete.expect_call()
555d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        utils.drop_caches.expect_call()
556d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
557d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        # run and check
558d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.job.run_test(testname, timeout=timeout)
559d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li        self.god.check_playback()
560d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
561d656d56473f50b9c1a9f5e2b2f5a9472181ee342Eric Li
5625bba5ca127e99428a3cc6c823b51a8b3062d06bdmblighif __name__ == "__main__":
5635bba5ca127e99428a3cc6c823b51a8b3062d06bdmbligh    unittest.main()
564