blob: ac5893db4d57a4bfe5e9abf92e0041e1cd30e78e [file] [log] [blame]
mbligh24f8f5b2008-06-12 19:56:22 +00001#!/usr/bin/python
Aviv Keshete9bc8332013-02-13 14:30:36 -08002#pylint: disable-msg=C0111
mbligh5fe5c952008-05-27 20:14:43 +00003__author__ = "raphtee@google.com (Travis Miller)"
4
mbligh060c4712009-12-29 02:43:35 +00005import unittest, os, tempfile, logging
jadmanski69bdaac2010-07-28 16:27:20 +00006
mbligh5fe5c952008-05-27 20:14:43 +00007import common
jadmanskicb0e1612009-02-27 18:03:10 +00008from autotest_lib.server import autotest, utils, hosts, server_job, profilers
jadmanskic09fc152008-10-15 17:56:59 +00009from autotest_lib.client.bin import sysinfo
Aviv Keshete9bc8332013-02-13 14:30:36 -080010from autotest_lib.client.common_lib import packages
showardad812bf2009-10-20 23:49:56 +000011from autotest_lib.client.common_lib import error
jadmanski3d161b02008-06-06 15:43:36 +000012from autotest_lib.client.common_lib.test_utils import mock
jadmanski8d631c92008-08-18 21:12:40 +000013
mbligh5fe5c952008-05-27 20:14:43 +000014
15class TestBaseAutotest(unittest.TestCase):
jadmanski0afbb632008-06-06 21:10:57 +000016 def setUp(self):
17 # create god
mbligh09108442008-10-15 16:27:38 +000018 self.god = mock.mock_god()
mbligh5fe5c952008-05-27 20:14:43 +000019
mbligh24f8f5b2008-06-12 19:56:22 +000020 # create mock host object
jadmanski8d631c92008-08-18 21:12:40 +000021 self.host = self.god.create_mock_class(hosts.RemoteHost, "host")
mbligh24f8f5b2008-06-12 19:56:22 +000022 self.host.hostname = "hostname"
jadmanskib6eb2f12008-09-12 16:39:36 +000023 self.host.job = self.god.create_mock_class(server_job.server_job,
24 "job")
jadmanski23afbec2008-09-17 18:12:07 +000025 self.host.job.run_test_cleanup = True
mbligh09108442008-10-15 16:27:38 +000026 self.host.job.last_boot_tag = 'Autotest'
jadmanskic09fc152008-10-15 17:56:59 +000027 self.host.job.sysinfo = self.god.create_mock_class(
28 sysinfo.sysinfo, "sysinfo")
jadmanskicb0e1612009-02-27 18:03:10 +000029 self.host.job.profilers = self.god.create_mock_class(
30 profilers.profilers, "profilers")
31 self.host.job.profilers.add_log = {}
jadmanskic09fc152008-10-15 17:56:59 +000032 self.host.job.tmpdir = "/job/tmp"
showarda6082ef2009-10-12 20:25:44 +000033 self.host.job.default_profile_only = False
jadmanski808f4b12010-04-09 22:30:31 +000034 self.host.job.args = []
35 self.host.job.record = lambda *args: None
mbligh5fe5c952008-05-27 20:14:43 +000036
mbligh24f8f5b2008-06-12 19:56:22 +000037 # stubs
mbligh3c7a1502008-07-24 18:08:47 +000038 self.god.stub_function(utils, "get_server_dir")
39 self.god.stub_function(utils, "run")
40 self.god.stub_function(utils, "get")
41 self.god.stub_function(utils, "read_keyval")
42 self.god.stub_function(utils, "write_keyval")
showard4b976072009-10-20 23:50:08 +000043 self.god.stub_function(utils, "system")
mbligh24f8f5b2008-06-12 19:56:22 +000044 self.god.stub_function(tempfile, "mkstemp")
45 self.god.stub_function(tempfile, "mktemp")
46 self.god.stub_function(os, "getcwd")
47 self.god.stub_function(os, "system")
48 self.god.stub_function(os, "chdir")
49 self.god.stub_function(os, "makedirs")
50 self.god.stub_function(os, "remove")
jadmanskic09fc152008-10-15 17:56:59 +000051 self.god.stub_function(os, "fdopen")
mbligh24f8f5b2008-06-12 19:56:22 +000052 self.god.stub_function(os.path, "exists")
mbligh3c7a1502008-07-24 18:08:47 +000053 self.god.stub_function(autotest, "open")
54 self.god.stub_function(autotest.global_config.global_config,
55 "get_config_value")
mbligh060c4712009-12-29 02:43:35 +000056 self.god.stub_function(logging, "exception")
mbligh24f8f5b2008-06-12 19:56:22 +000057 self.god.stub_class(autotest, "_Run")
jadmanski043e1132008-11-19 17:10:32 +000058 self.god.stub_class(autotest, "log_collector")
mbligh5fe5c952008-05-27 20:14:43 +000059
mbligh5fe5c952008-05-27 20:14:43 +000060
mbligh24f8f5b2008-06-12 19:56:22 +000061 def tearDown(self):
mbligh1ef218d2009-08-03 16:57:56 +000062 self.god.unstub_all()
mbligh5fe5c952008-05-27 20:14:43 +000063
mbligh24f8f5b2008-06-12 19:56:22 +000064
65 def construct(self):
66 # setup
67 self.serverdir = "serverdir"
68
69 # record
mbligh3c7a1502008-07-24 18:08:47 +000070 utils.get_server_dir.expect_call().and_return(self.serverdir)
mbligh5fe5c952008-05-27 20:14:43 +000071
jadmanski0afbb632008-06-06 21:10:57 +000072 # create the autotest object
73 self.base_autotest = autotest.BaseAutotest(self.host)
jadmanski808f4b12010-04-09 22:30:31 +000074 self.base_autotest.job = self.host.job
mblighb8aa75b2009-09-18 16:50:37 +000075 self.god.stub_function(self.base_autotest, "_install_using_send_file")
mbligh5fe5c952008-05-27 20:14:43 +000076
jadmanskia49e9c42008-10-09 22:30:49 +000077 # stub out abspath
78 self.god.stub_function(os.path, "abspath")
79
mbligh24f8f5b2008-06-12 19:56:22 +000080 # check
81 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +000082
83
mblighb8aa75b2009-09-18 16:50:37 +000084 def record_install_prologue(self):
mbligh24f8f5b2008-06-12 19:56:22 +000085 self.construct()
86
87 # setup
mbligh3c7a1502008-07-24 18:08:47 +000088 self.god.stub_class(packages, "PackageManager")
89 self.base_autotest.got = False
90 location = os.path.join(self.serverdir, '../client')
91 location = os.path.abspath.expect_call(location).and_return(location)
jadmanski3d161b02008-06-06 15:43:36 +000092
mbligh24f8f5b2008-06-12 19:56:22 +000093 # record
mbligh3c7a1502008-07-24 18:08:47 +000094 os.getcwd.expect_call().and_return('cwd')
95 os.chdir.expect_call(os.path.join(self.serverdir, '../client'))
showard4b976072009-10-20 23:50:08 +000096 utils.system.expect_call('tools/make_clean', ignore_status=True)
mbligh3c7a1502008-07-24 18:08:47 +000097 os.chdir.expect_call('cwd')
98 utils.get.expect_call(os.path.join(self.serverdir,
99 '../client')).and_return('source_material')
100
jadmanski0afbb632008-06-06 21:10:57 +0000101 self.host.wait_up.expect_call(timeout=30)
102 self.host.setup.expect_call()
mbligh24f8f5b2008-06-12 19:56:22 +0000103 self.host.get_autodir.expect_call().and_return("autodir")
mbligh0562e652008-08-20 20:11:45 +0000104 self.host.set_autodir.expect_call("autodir")
jadmanski3c236942009-03-04 17:51:26 +0000105 self.host.run.expect_call('mkdir -p autodir')
jadmanski3c236942009-03-04 17:51:26 +0000106 self.host.run.expect_call('rm -rf autodir/results/*',
jadmanski1c3c07b2009-03-03 23:29:36 +0000107 ignore_status=True)
mblighb8aa75b2009-09-18 16:50:37 +0000108
109
110 def test_constructor(self):
111 self.construct()
112
113 # we should check the calls
114 self.god.check_playback()
115
116
117 def test_full_client_install(self):
118 self.record_install_prologue()
119
Dan Shi1889ca12015-04-15 09:36:06 -0700120 self.host.run.expect_call('rm -f "autodir/packages.checksum"')
mbligh3c7a1502008-07-24 18:08:47 +0000121 c = autotest.global_config.global_config
mblighb8aa75b2009-09-18 16:50:37 +0000122 c.get_config_value.expect_call('PACKAGES',
123 'serve_packages_from_autoserv',
124 type=bool).and_return(False)
125 self.host.send_file.expect_call('source_material', 'autodir',
126 delete_dest=True)
127
128 # run and check
129 self.base_autotest.install_full_client()
130 self.god.check_playback()
131
132
133 def test_autoserv_install(self):
134 self.record_install_prologue()
135
136 c = autotest.global_config.global_config
137 c.get_config_value.expect_call('PACKAGES',
jadmanski2315a7e2009-09-18 18:39:37 +0000138 'fetch_location', type=list, default=[]).and_return([])
mblighb8aa75b2009-09-18 16:50:37 +0000139
mblighb8aa75b2009-09-18 16:50:37 +0000140 c.get_config_value.expect_call('PACKAGES',
141 'serve_packages_from_autoserv',
142 type=bool).and_return(True)
143 self.base_autotest._install_using_send_file.expect_call(self.host,
144 'autodir')
mblighb8aa75b2009-09-18 16:50:37 +0000145 # run and check
146 self.base_autotest.install()
147 self.god.check_playback()
148
149
150 def test_packaging_install(self):
151 self.record_install_prologue()
152
153 c = autotest.global_config.global_config
154 c.get_config_value.expect_call('PACKAGES',
jadmanski2315a7e2009-09-18 18:39:37 +0000155 'fetch_location', type=list, default=[]).and_return(['repo'])
mbligh3c7a1502008-07-24 18:08:47 +0000156 pkgmgr = packages.PackageManager.expect_new('autodir',
jadmanskiede7e242009-08-10 15:43:33 +0000157 repo_urls=['repo'], hostname='hostname', do_locking=False,
mbligh76d19f72008-10-15 16:24:43 +0000158 run_function=self.host.run, run_function_dargs=dict(timeout=600))
mbligh3c7a1502008-07-24 18:08:47 +0000159 pkg_dir = os.path.join('autodir', 'packages')
mblighc5ddfd12008-08-04 17:15:00 +0000160 cmd = ('cd autodir && ls | grep -v "^packages$"'
161 ' | xargs rm -rf && rm -rf .[^.]*')
162 self.host.run.expect_call(cmd)
mbligh3c7a1502008-07-24 18:08:47 +0000163 pkgmgr.install_pkg.expect_call('autotest', 'client', pkg_dir,
164 'autodir', preserve_install_dir=True)
mbligh5fe5c952008-05-27 20:14:43 +0000165
mbligh3c7a1502008-07-24 18:08:47 +0000166 # run and check
jadmanski0afbb632008-06-06 21:10:57 +0000167 self.base_autotest.install()
jadmanski0afbb632008-06-06 21:10:57 +0000168 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000169
mbligh5fe5c952008-05-27 20:14:43 +0000170
mbligh24f8f5b2008-06-12 19:56:22 +0000171 def test_run(self):
172 self.construct()
mbligh5fe5c952008-05-27 20:14:43 +0000173
jadmanski0afbb632008-06-06 21:10:57 +0000174 # setup
mbligh24f8f5b2008-06-12 19:56:22 +0000175 control = "control"
mbligh5fe5c952008-05-27 20:14:43 +0000176
mbligh24f8f5b2008-06-12 19:56:22 +0000177 # stub out install
178 self.god.stub_function(self.base_autotest, "install")
mbligh5fe5c952008-05-27 20:14:43 +0000179
mbligh24f8f5b2008-06-12 19:56:22 +0000180 # record
Dan Shib669cbd2013-09-13 11:17:17 -0700181 self.base_autotest.install.expect_call(self.host, use_packaging=True)
mbligh24f8f5b2008-06-12 19:56:22 +0000182 self.host.wait_up.expect_call(timeout=30)
183 os.path.abspath.expect_call('.').and_return('.')
mblighb3c0c912008-11-27 00:32:45 +0000184 run_obj = autotest._Run.expect_new(self.host, '.', None, False, False)
mbligh24f8f5b2008-06-12 19:56:22 +0000185 tag = None
186 run_obj.manual_control_file = os.path.join('autodir',
187 'control.%s' % tag)
188 run_obj.remote_control_file = os.path.join('autodir',
189 'control.%s.autoserv' % tag)
190 run_obj.tag = tag
191 run_obj.autodir = 'autodir'
192 run_obj.verify_machine.expect_call()
mblighb3c0c912008-11-27 00:32:45 +0000193 run_obj.background = False
mbligh24f8f5b2008-06-12 19:56:22 +0000194 debug = os.path.join('.', 'debug')
195 os.makedirs.expect_call(debug)
mbligh09108442008-10-15 16:27:38 +0000196 delete_file_list = [run_obj.remote_control_file,
197 run_obj.remote_control_file + '.state',
198 run_obj.manual_control_file,
199 run_obj.manual_control_file + '.state']
200 cmd = ';'.join('rm -f ' + control for control in delete_file_list)
201 self.host.run.expect_call(cmd, ignore_status=True)
mbligh24f8f5b2008-06-12 19:56:22 +0000202
Aviv Keshete9bc8332013-02-13 14:30:36 -0800203 utils.get.expect_call(control, local_copy=True).and_return("temp")
mbligh24f8f5b2008-06-12 19:56:22 +0000204
mbligh3c7a1502008-07-24 18:08:47 +0000205 c = autotest.global_config.global_config
206 c.get_config_value.expect_call("PACKAGES",
Dale Curtis74a314b2011-06-23 14:55:46 -0700207 'fetch_location', type=list, default=[]).and_return(['repo'])
mbligh09108442008-10-15 16:27:38 +0000208
209 cfile = self.god.create_mock_class(file, "file")
210 cfile_orig = "original control file"
jadmanski808f4b12010-04-09 22:30:31 +0000211 cfile_new = "args = []\njob.add_repository(['repo'])\n"
mbligh09108442008-10-15 16:27:38 +0000212 cfile_new += cfile_orig
jadmanskic09fc152008-10-15 17:56:59 +0000213
mbligh09108442008-10-15 16:27:38 +0000214 autotest.open.expect_call("temp").and_return(cfile)
215 cfile.read.expect_call().and_return(cfile_orig)
mbligh3c7a1502008-07-24 18:08:47 +0000216 autotest.open.expect_call("temp", 'w').and_return(cfile)
mbligh09108442008-10-15 16:27:38 +0000217 cfile.write.expect_call(cfile_new)
mbligh3c7a1502008-07-24 18:08:47 +0000218
mblighfc3da5b2010-01-06 18:37:22 +0000219 self.host.job.preprocess_client_state.expect_call().and_return(
220 '/job/tmp/file1')
mblighfbf73ae2009-12-19 05:22:42 +0000221 self.host.send_file.expect_call(
222 "/job/tmp/file1", "autodir/control.None.autoserv.init.state")
jadmanskic09fc152008-10-15 17:56:59 +0000223 os.remove.expect_call("/job/tmp/file1")
224
mbligh3c7a1502008-07-24 18:08:47 +0000225 self.host.send_file.expect_call("temp", run_obj.remote_control_file)
226 os.path.abspath.expect_call('temp').and_return('control_file')
mbligh09108442008-10-15 16:27:38 +0000227 os.path.abspath.expect_call('control').and_return('control')
mbligh3c7a1502008-07-24 18:08:47 +0000228 os.remove.expect_call("temp")
jadmanski6bb32d72009-03-19 20:25:24 +0000229
J. Richard Barnettef44ff962011-01-05 10:14:28 -0800230 run_obj.execute_control.expect_call(timeout=30,
Chris Sosab9ada9b2013-06-12 12:47:47 -0700231 client_disconnect_timeout=240)
jadmanski23afbec2008-09-17 18:12:07 +0000232
mbligh24f8f5b2008-06-12 19:56:22 +0000233 # run and check output
mbligh3c7a1502008-07-24 18:08:47 +0000234 self.base_autotest.run(control, timeout=30)
jadmanski0afbb632008-06-06 21:10:57 +0000235 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000236
mbligh3c7a1502008-07-24 18:08:47 +0000237
showardad812bf2009-10-20 23:49:56 +0000238 def _stub_get_client_autodir_paths(self):
239 def mock_get_client_autodir_paths(cls, host):
240 return ['/some/path', '/another/path']
241 self.god.stub_with(autotest.Autotest, 'get_client_autodir_paths',
242 classmethod(mock_get_client_autodir_paths))
243
244
245 def _expect_failed_run(self, command):
246 (self.host.run.expect_call(command)
247 .and_raises(error.AutoservRunError('dummy', object())))
248
249
250 def test_get_installed_autodir(self):
251 self._stub_get_client_autodir_paths()
252 self.host.get_autodir.expect_call().and_return(None)
253 self._expect_failed_run('test -x /some/path/bin/autotest')
254 self.host.run.expect_call('test -x /another/path/bin/autotest')
Eric Li861b2d52011-02-04 14:50:35 -0800255 self.host.run.expect_call('test -w /another/path')
showardad812bf2009-10-20 23:49:56 +0000256
257 autodir = autotest.Autotest.get_installed_autodir(self.host)
258 self.assertEquals(autodir, '/another/path')
259
260
261 def test_get_install_dir(self):
262 self._stub_get_client_autodir_paths()
263 self.host.get_autodir.expect_call().and_return(None)
264 self._expect_failed_run('test -x /some/path/bin/autotest')
265 self._expect_failed_run('test -x /another/path/bin/autotest')
J. Richard Barnettef44ff962011-01-05 10:14:28 -0800266 self._expect_failed_run('mkdir -p /some/path')
267 self.host.run.expect_call('mkdir -p /another/path')
Eric Li861b2d52011-02-04 14:50:35 -0800268 self.host.run.expect_call('test -w /another/path')
showardad812bf2009-10-20 23:49:56 +0000269
270 install_dir = autotest.Autotest.get_install_dir(self.host)
J. Richard Barnettef44ff962011-01-05 10:14:28 -0800271 self.assertEquals(install_dir, '/another/path')
showardad812bf2009-10-20 23:49:56 +0000272
273
mbligh060c4712009-12-29 02:43:35 +0000274 def test_client_logger_process_line_log_copy_collection_failure(self):
275 collector = autotest.log_collector.expect_new(self.host, '', '')
276 logger = autotest.client_logger(self.host, '', '')
277 collector.collect_client_job_results.expect_call().and_raises(
278 Exception('log copy failure'))
279 logging.exception.expect_call(mock.is_string_comparator())
280 logger._process_line('AUTOTEST_TEST_COMPLETE:/autotest/fifo1')
281
282
283 def test_client_logger_process_line_log_copy_fifo_failure(self):
284 collector = autotest.log_collector.expect_new(self.host, '', '')
285 logger = autotest.client_logger(self.host, '', '')
286 collector.collect_client_job_results.expect_call()
287 self.host.run.expect_call('echo A > /autotest/fifo2').and_raises(
288 Exception('fifo failure'))
289 logging.exception.expect_call(mock.is_string_comparator())
290 logger._process_line('AUTOTEST_TEST_COMPLETE:/autotest/fifo2')
291
292
293 def test_client_logger_process_line_package_install_fifo_failure(self):
294 collector = autotest.log_collector.expect_new(self.host, '', '')
295 logger = autotest.client_logger(self.host, '', '')
296 self.god.stub_function(logger, '_send_tarball')
297
298 c = autotest.global_config.global_config
299 c.get_config_value.expect_call('PACKAGES',
300 'serve_packages_from_autoserv',
301 type=bool).and_return(True)
Aviv Keshete9bc8332013-02-13 14:30:36 -0800302 c.get_config_value.expect_call('PACKAGES',
303 'serve_packages_from_autoserv',
304 type=bool).and_return(True)
mbligh060c4712009-12-29 02:43:35 +0000305 logger._send_tarball.expect_call('pkgname.tar.bz2', '/autotest/dest/')
lmr12b45582010-01-11 21:22:02 +0000306
mbligh060c4712009-12-29 02:43:35 +0000307 self.host.run.expect_call('echo B > /autotest/fifo3').and_raises(
308 Exception('fifo failure'))
309 logging.exception.expect_call(mock.is_string_comparator())
310 logger._process_line('AUTOTEST_FETCH_PACKAGE:pkgname.tar.bz2:'
311 '/autotest/dest/:/autotest/fifo3')
312
jadmanski69bdaac2010-07-28 16:27:20 +0000313
jadmanskic6136e92010-07-19 16:41:49 +0000314class test_autotest_mixin(unittest.TestCase):
315 def setUp(self):
316 # a dummy Autotest and job class for use in the mixin
317 class stub_autotest(object):
318 class job(object):
319 state_dict = {}
320 def get_state(self, var, default):
321 return self.state_dict.get(var, default)
322 job = job()
323
324 @staticmethod
325 def run(control_file, host=None):
326 self.control_file = control_file
327 self.host = host
328
329 self.mixin = autotest.AutotestHostMixin()
330 self.mixin._Autotest = stub_autotest
331 self.job = self.mixin._Autotest.job
332
333
334 def test_passes(self):
335 self.job.state_dict['test_result'] = True
336 self.assertEqual(True, self.mixin.run_test('sleeptest', seconds=1))
337 self.assert_("job.run_test('sleeptest', seconds=1)\n"
338 in self.control_file)
339 self.assertEqual(self.mixin, self.host)
340
341
342 def test_fails_clean(self):
343 self.job.state_dict['test_result'] = False
344 self.assertEqual(False, self.mixin.run_test('sleeptest', seconds='2'))
345 self.assert_("job.run_test('sleeptest', seconds='2')\n"
346 in self.control_file)
347 self.assertEqual(self.mixin, self.host)
348
349
350 def test_fails_with_exception(self):
351 self.assertEqual(False, self.mixin.run_test('sleeptest'))
352 self.assert_("job.run_test('sleeptest')\n" in self.control_file)
353 self.assertEqual(self.mixin, self.host)
354
mbligh060c4712009-12-29 02:43:35 +0000355
mbligh5fe5c952008-05-27 20:14:43 +0000356if __name__ == "__main__":
jadmanski0afbb632008-06-06 21:10:57 +0000357 unittest.main()