blob: ca53d4c95b57002a479357bd73b166dbabbbb1a6 [file] [log] [blame]
mbligh24f8f5b2008-06-12 19:56:22 +00001#!/usr/bin/python
mbligh5fe5c952008-05-27 20:14:43 +00002
3__author__ = "raphtee@google.com (Travis Miller)"
4
mbligh3c7a1502008-07-24 18:08:47 +00005import unittest, os, tempfile
mbligh5fe5c952008-05-27 20:14:43 +00006import common
jadmanskib6eb2f12008-09-12 16:39:36 +00007from autotest_lib.server import autotest, utils, hosts, server_job
mbligh3c7a1502008-07-24 18:08:47 +00008from autotest_lib.client.common_lib import utils as client_utils, packages
jadmanski3d161b02008-06-06 15:43:36 +00009from autotest_lib.client.common_lib.test_utils import mock
jadmanski8d631c92008-08-18 21:12:40 +000010
mbligh5fe5c952008-05-27 20:14:43 +000011
12class TestBaseAutotest(unittest.TestCase):
jadmanski0afbb632008-06-06 21:10:57 +000013 def setUp(self):
14 # create god
15 self.god = mock.mock_god()
mbligh5fe5c952008-05-27 20:14:43 +000016
mbligh24f8f5b2008-06-12 19:56:22 +000017 # create mock host object
jadmanski8d631c92008-08-18 21:12:40 +000018 self.host = self.god.create_mock_class(hosts.RemoteHost, "host")
mbligh24f8f5b2008-06-12 19:56:22 +000019 self.host.hostname = "hostname"
jadmanskib6eb2f12008-09-12 16:39:36 +000020 self.host.job = self.god.create_mock_class(server_job.server_job,
21 "job")
mbligh5fe5c952008-05-27 20:14:43 +000022
mbligh24f8f5b2008-06-12 19:56:22 +000023 # stubs
mbligh3c7a1502008-07-24 18:08:47 +000024 self.god.stub_function(utils, "get_server_dir")
25 self.god.stub_function(utils, "run")
26 self.god.stub_function(utils, "get")
27 self.god.stub_function(utils, "read_keyval")
28 self.god.stub_function(utils, "write_keyval")
mbligh24f8f5b2008-06-12 19:56:22 +000029 self.god.stub_function(tempfile, "mkstemp")
30 self.god.stub_function(tempfile, "mktemp")
31 self.god.stub_function(os, "getcwd")
32 self.god.stub_function(os, "system")
33 self.god.stub_function(os, "chdir")
34 self.god.stub_function(os, "makedirs")
35 self.god.stub_function(os, "remove")
36 self.god.stub_function(os.path, "abspath")
37 self.god.stub_function(os.path, "exists")
mbligh3c7a1502008-07-24 18:08:47 +000038 self.god.stub_function(utils, "sh_escape")
39 self.god.stub_function(autotest, "open")
40 self.god.stub_function(autotest.global_config.global_config,
41 "get_config_value")
mbligh24f8f5b2008-06-12 19:56:22 +000042 self.god.stub_class(autotest, "_Run")
mbligh5fe5c952008-05-27 20:14:43 +000043
mbligh5fe5c952008-05-27 20:14:43 +000044
mbligh24f8f5b2008-06-12 19:56:22 +000045 def tearDown(self):
46 self.god.unstub_all()
mbligh5fe5c952008-05-27 20:14:43 +000047
mbligh24f8f5b2008-06-12 19:56:22 +000048
49 def construct(self):
50 # setup
51 self.serverdir = "serverdir"
52
53 # record
mbligh3c7a1502008-07-24 18:08:47 +000054 utils.get_server_dir.expect_call().and_return(self.serverdir)
mbligh5fe5c952008-05-27 20:14:43 +000055
jadmanski0afbb632008-06-06 21:10:57 +000056 # create the autotest object
57 self.base_autotest = autotest.BaseAutotest(self.host)
mbligh5fe5c952008-05-27 20:14:43 +000058
mbligh24f8f5b2008-06-12 19:56:22 +000059 # check
60 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +000061
62
jadmanski0afbb632008-06-06 21:10:57 +000063 def test_constructor(self):
mbligh24f8f5b2008-06-12 19:56:22 +000064 self.construct()
65
jadmanski0afbb632008-06-06 21:10:57 +000066 # we should check the calls
67 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +000068
mbligh5fe5c952008-05-27 20:14:43 +000069
mbligh24f8f5b2008-06-12 19:56:22 +000070 def test_install(self):
71 self.construct()
72
73 # setup
mbligh3c7a1502008-07-24 18:08:47 +000074 self.god.stub_class(packages, "PackageManager")
75 self.base_autotest.got = False
76 location = os.path.join(self.serverdir, '../client')
77 location = os.path.abspath.expect_call(location).and_return(location)
jadmanski3d161b02008-06-06 15:43:36 +000078
mbligh24f8f5b2008-06-12 19:56:22 +000079 # record
mbligh3c7a1502008-07-24 18:08:47 +000080 os.getcwd.expect_call().and_return('cwd')
81 os.chdir.expect_call(os.path.join(self.serverdir, '../client'))
mbligh24f8f5b2008-06-12 19:56:22 +000082 os.system.expect_call('tools/make_clean')
mbligh3c7a1502008-07-24 18:08:47 +000083 os.chdir.expect_call('cwd')
84 utils.get.expect_call(os.path.join(self.serverdir,
85 '../client')).and_return('source_material')
86
jadmanski0afbb632008-06-06 21:10:57 +000087 self.host.wait_up.expect_call(timeout=30)
88 self.host.setup.expect_call()
mbligh24f8f5b2008-06-12 19:56:22 +000089 self.host.get_autodir.expect_call().and_return("autodir")
mbligh0562e652008-08-20 20:11:45 +000090 self.host.set_autodir.expect_call("autodir")
mbligh3c7a1502008-07-24 18:08:47 +000091 utils.sh_escape.expect_call("autodir").and_return("autodir")
mbligh24f8f5b2008-06-12 19:56:22 +000092 self.host.run.expect_call('mkdir -p "autodir"')
mbligh3c7a1502008-07-24 18:08:47 +000093 c = autotest.global_config.global_config
94 c.get_config_value.expect_call("PACKAGES",
95 'fetch_location', type=list).and_return('repos')
96 pkgmgr = packages.PackageManager.expect_new('autodir',
mblighc5ddfd12008-08-04 17:15:00 +000097 repo_urls='repos', do_locking=False, run_function=self.host.run,
mbligh3c7a1502008-07-24 18:08:47 +000098 run_function_dargs=dict(timeout=600))
99 pkg_dir = os.path.join('autodir', 'packages')
mblighc5ddfd12008-08-04 17:15:00 +0000100 cmd = ('cd autodir && ls | grep -v "^packages$"'
101 ' | xargs rm -rf && rm -rf .[^.]*')
102 self.host.run.expect_call(cmd)
mbligh3c7a1502008-07-24 18:08:47 +0000103 pkgmgr.install_pkg.expect_call('autotest', 'client', pkg_dir,
104 'autodir', preserve_install_dir=True)
mbligh5fe5c952008-05-27 20:14:43 +0000105
mbligh3c7a1502008-07-24 18:08:47 +0000106 # run and check
jadmanski0afbb632008-06-06 21:10:57 +0000107 self.base_autotest.install()
jadmanski0afbb632008-06-06 21:10:57 +0000108 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000109
mbligh5fe5c952008-05-27 20:14:43 +0000110
mbligh24f8f5b2008-06-12 19:56:22 +0000111 def test_run(self):
112 self.construct()
mbligh5fe5c952008-05-27 20:14:43 +0000113
jadmanski0afbb632008-06-06 21:10:57 +0000114 # setup
mbligh24f8f5b2008-06-12 19:56:22 +0000115 control = "control"
mbligh5fe5c952008-05-27 20:14:43 +0000116
mbligh24f8f5b2008-06-12 19:56:22 +0000117 # stub out install
118 self.god.stub_function(self.base_autotest, "install")
119 self.god.stub_function(self.base_autotest, "prepare_for_copying_logs")
120 self.god.stub_function(self.base_autotest, "process_copied_logs")
121 self.god.stub_function(self.base_autotest, "postprocess_copied_logs")
mbligh5fe5c952008-05-27 20:14:43 +0000122
mbligh24f8f5b2008-06-12 19:56:22 +0000123 # record
124 self.base_autotest.install.expect_call(self.host)
125 self.host.wait_up.expect_call(timeout=30)
126 os.path.abspath.expect_call('.').and_return('.')
127 run_obj = autotest._Run.expect_new(self.host, '.', None, False)
128 tag = None
129 run_obj.manual_control_file = os.path.join('autodir',
130 'control.%s' % tag)
131 run_obj.remote_control_file = os.path.join('autodir',
132 'control.%s.autoserv' % tag)
133 run_obj.tag = tag
134 run_obj.autodir = 'autodir'
135 run_obj.verify_machine.expect_call()
136 run_obj.verify_machine.expect_call()
137 debug = os.path.join('.', 'debug')
138 os.makedirs.expect_call(debug)
139 for control in [run_obj.remote_control_file,
140 run_obj.remote_control_file + '.state',
141 run_obj.manual_control_file,
142 run_obj.manual_control_file + '.state']:
143 self.host.run.expect_call('rm -f ' + control)
144
mbligh3c7a1502008-07-24 18:08:47 +0000145 utils.get.expect_call(control).and_return("temp")
mbligh24f8f5b2008-06-12 19:56:22 +0000146
mbligh3c7a1502008-07-24 18:08:47 +0000147 cfile = self.god.create_mock_class(file, "file")
148 autotest.open.expect_call("temp", 'r').and_return(cfile)
149 cfile_orig = "original control file"
150 cfile.read.expect_call().and_return(cfile_orig)
151 cfile.close.expect_call()
152 c = autotest.global_config.global_config
153 c.get_config_value.expect_call("PACKAGES",
154 'fetch_location', type=list).and_return('repos')
155 control_file_new = []
156 control_file_new.append('job.add_repository(repos)\n')
157 control_file_new.append(cfile_orig)
158 autotest.open.expect_call("temp", 'w').and_return(cfile)
159 cfile.write.expect_call('\n'.join(control_file_new))
160 cfile.close.expect_call()
161
162 self.host.send_file.expect_call("temp", run_obj.remote_control_file)
163 os.path.abspath.expect_call('temp').and_return('control_file')
164 os.path.abspath.expect_call('autodir/control.None.state').and_return(
165 'autodir/control.None.state')
166 os.remove.expect_call("temp")
167 run_obj.execute_control.expect_call(timeout=30)
mbligh24f8f5b2008-06-12 19:56:22 +0000168 self.host.wait_up.expect_call(timeout=30)
mbligh3c7a1502008-07-24 18:08:47 +0000169
170 run_obj.autodir = 'autodir'
171 results = os.path.join(run_obj.autodir,
172 'results', 'default')
173 self.base_autotest.prepare_for_copying_logs.expect_call(
174 'autodir/results/default', '.', self.host).and_return('keyval_path')
175 self.host.get_file.expect_call('autodir/results/default/', '.')
176 self.base_autotest.process_copied_logs.expect_call('.',self.host,
177 'keyval_path')
mbligh24f8f5b2008-06-12 19:56:22 +0000178 self.base_autotest.postprocess_copied_logs.expect_call(results,
mbligh3c7a1502008-07-24 18:08:47 +0000179 self.host)
mbligh24f8f5b2008-06-12 19:56:22 +0000180
181 # run and check output
mbligh3c7a1502008-07-24 18:08:47 +0000182 self.base_autotest.run(control, timeout=30)
jadmanski0afbb632008-06-06 21:10:57 +0000183 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000184
mbligh3c7a1502008-07-24 18:08:47 +0000185
mbligh24f8f5b2008-06-12 19:56:22 +0000186 def test_prepare_for_copying_logs(self):
187 self.construct()
mbligh5fe5c952008-05-27 20:14:43 +0000188
mbligh24f8f5b2008-06-12 19:56:22 +0000189 # record
jadmanski0afbb632008-06-06 21:10:57 +0000190 src = "src"
191 dest = "dest"
192 keyval_path = ''
mbligh24f8f5b2008-06-12 19:56:22 +0000193 os.path.exists.expect_call(os.path.join(dest,
194 'keyval')).and_return(True)
195 tempfile.mkstemp.expect_call(
196 '.keyval_%s' % self.host.hostname).and_return((None, keyval_path))
197 self.host.get_file.expect_call(os.path.join(src, 'keyval'), keyval_path)
198 tempfile.mktemp.expect_call().and_return("temp_keyval")
199 self.host.run.expect_call('mv %s temp_keyval' %
200 os.path.join(src, 'keyval'))
mbligh5fe5c952008-05-27 20:14:43 +0000201
mbligh24f8f5b2008-06-12 19:56:22 +0000202 # run and check
203 self.base_autotest.prepare_for_copying_logs(src, dest, self.host)
jadmanski0afbb632008-06-06 21:10:57 +0000204 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000205
206
mbligh24f8f5b2008-06-12 19:56:22 +0000207 def test_process_copied_logs(self):
208 self.construct()
209
210 # record
jadmanski0afbb632008-06-06 21:10:57 +0000211 dest = "dest"
mbligh24f8f5b2008-06-12 19:56:22 +0000212 keyval_path = "keyval_path"
213 os.path.exists.expect_call(os.path.join(dest,
214 'keyval')).and_return(True)
215 old_keyval = {"version": 1, "author": "me"}
216 new_keyval = {"version": 1, "data": "foo"}
mbligh3c7a1502008-07-24 18:08:47 +0000217 utils.read_keyval.expect_call(
mbligh24f8f5b2008-06-12 19:56:22 +0000218 keyval_path).and_return(new_keyval)
mbligh3c7a1502008-07-24 18:08:47 +0000219 utils.read_keyval.expect_call(dest).and_return(old_keyval)
mbligh24f8f5b2008-06-12 19:56:22 +0000220 tmp_keyval = {}
221 for key, val in new_keyval.iteritems():
222 if key not in old_keyval:
223 tmp_keyval[key] = val
mbligh3c7a1502008-07-24 18:08:47 +0000224 utils.write_keyval.expect_call(dest, tmp_keyval)
mbligh24f8f5b2008-06-12 19:56:22 +0000225 os.remove.expect_call(keyval_path)
mbligh5fe5c952008-05-27 20:14:43 +0000226
jadmanski0afbb632008-06-06 21:10:57 +0000227 # run check
mbligh24f8f5b2008-06-12 19:56:22 +0000228 self.base_autotest.process_copied_logs(dest, self.host, keyval_path)
jadmanski0afbb632008-06-06 21:10:57 +0000229 self.god.check_playback()
mbligh5fe5c952008-05-27 20:14:43 +0000230
231
mbligh5fe5c952008-05-27 20:14:43 +0000232if __name__ == "__main__":
jadmanski0afbb632008-06-06 21:10:57 +0000233 unittest.main()