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