bootloader_unittest.py revision 3d161b028a4cd20c0a91ee5b1b86149a0821db4f
1#!/usr/bin/python
2
3import unittest, os
4import common
5
6from autotest_lib.client.common_lib.test_utils import mock
7from autotest_lib.client.common_lib import error, utils as common_utils
8from autotest_lib.server import utils
9from autotest_lib.server.hosts import bootloader, ssh_host
10
11
12class test_bootloader_install(unittest.TestCase):
13	def setUp(self):
14		self.god = mock.mock_god()
15
16		# mock out get_server_dir
17		self.god.stub_function(utils, "get_server_dir")
18
19
20	def tearDown(self):
21		self.god.unstub_all()
22
23
24	def create_mock_sshhost(self):
25		# useful for building disposable SSHHost mocks
26		return self.god.create_mock_class(ssh_host.SSHHost, "SSHHost")
27
28
29	def create_install_boottool_mock(self, loader, dst_dir):
30		mock_install_boottool = \
31			self.god.create_mock_function("install_boottool")
32		def install_boottool():
33			loader._boottool_path = dst_dir
34			mock_install_boottool()
35		loader.install_boottool = install_boottool
36		return mock_install_boottool
37
38
39	def test_install_fails_without_host(self):
40		host = self.create_mock_sshhost()
41		loader = bootloader.Bootloader(host)
42		del host
43		self.assertRaises(error.AutoservError, loader.install_boottool)
44
45
46	def test_installs_to_tmpdir(self):
47		TMPDIR = "/unittest/tmp"
48		SERVERDIR = "/unittest/server"
49		BOOTTOOL_SRC = os.path.join(SERVERDIR, bootloader.BOOTTOOL_SRC)
50		BOOTTOOL_SRC = os.path.abspath(BOOTTOOL_SRC)
51		BOOTTOOL_DST = os.path.join(TMPDIR, "boottool")
52		# set up the recording
53		host = self.create_mock_sshhost()
54		host.get_tmp_dir.expect_call().and_return(TMPDIR)
55		utils.get_server_dir.expect_call().and_return(SERVERDIR)
56		host.send_file.expect_call(BOOTTOOL_SRC, TMPDIR)
57		# run the test
58		loader = bootloader.Bootloader(host)
59		loader.install_boottool()
60		# assert the playback is correct
61		self.god.check_playback()
62		# assert the final dest is correct
63		self.assertEquals(loader.boottool_path, BOOTTOOL_DST)
64
65
66	def test_get_path_automatically_installs(self):
67		BOOTTOOL_DST = "/unittest/tmp/boottool"
68		host = self.create_mock_sshhost()
69		loader = bootloader.Bootloader(host)
70		# mock out loader.install_boottool
71		mock_install = \
72			self.create_install_boottool_mock(loader, BOOTTOOL_DST)
73		# set up the recording
74		mock_install.expect_call()
75		# run the test
76		self.assertEquals(loader.boottool_path, BOOTTOOL_DST)
77		self.god.check_playback()
78
79
80	def test_install_is_only_called_once(self):
81		BOOTTOOL_DST = "/unittest/tmp/boottool"
82		host = self.create_mock_sshhost()
83		loader = bootloader.Bootloader(host)
84		# mock out loader.install_boottool
85		mock_install = \
86			self.create_install_boottool_mock(loader, BOOTTOOL_DST)
87		# set up the recording
88		mock_install.expect_call()
89		# run the test
90		self.assertEquals(loader.boottool_path, BOOTTOOL_DST)
91		self.god.check_playback()
92		self.assertEquals(loader.boottool_path, BOOTTOOL_DST)
93		self.god.check_playback()
94
95
96class test_bootloader_methods(unittest.TestCase):
97	def setUp(self):
98		self.god = mock.mock_god()
99		self.host = self.god.create_mock_class(ssh_host.SSHHost,
100						       "SSHHost")
101		# creates a bootloader with _run_boottool mocked out
102		self.loader = bootloader.Bootloader(self.host)
103		self.god.stub_function(self.loader, "_run_boottool")
104
105
106	def tearDown(self):
107		self.god.unstub_all()
108
109
110	def expect_run_boottool(self, arg, result):
111		result = common_utils.CmdResult(stdout=result, exit_status=0)
112		self.loader._run_boottool.expect_call(arg).and_return(result)
113
114
115	def test_get_type(self):
116		# set up the recording
117		self.expect_run_boottool("--bootloader-probe", "lilo\n")
118		# run the test
119		self.assertEquals(self.loader.get_type(), "lilo")
120		self.god.check_playback()
121
122
123	def test_get_arch(self):
124		# set up the recording
125		self.expect_run_boottool("--arch-probe", "x86_64\n")
126		# run the test
127		self.assertEquals(self.loader.get_architecture(), "x86_64")
128		self.god.check_playback()
129
130
131	def test_get_default(self):
132		# set up the recording
133		self.expect_run_boottool("--default", "0\n")
134		# run the test
135		self.assertEquals(self.loader.get_default(), "0")
136		self.god.check_playback()
137
138
139	def test_get_titles(self):
140		# set up the recording
141		self.expect_run_boottool(mock.regex_comparator(
142		    r"^--info all \|"), "title #1\ntitle #2\n")
143		# run the test
144		self.assertEquals(self.loader.get_titles(),
145				  ["title #1", "title #2"])
146		self.god.check_playback()
147
148
149	def test_get_info_single_result(self):
150		RESULT = (
151		"index\t: 5\n"
152		"args\t: ro single\n"
153		"boot\t: (hd0,0)\n"
154		"initrd\t: /boot/initrd.img-2.6.15-23-386\n"
155		"kernel\t: /boot/vmlinuz-2.6.15-23-386\n"
156		"root\t: UUID=07D7-0714\n"
157		"savedefault\t:   \n"
158		"title\t: Distro, kernel 2.6.15-23-386\n"
159		)
160		# set up the recording
161		self.expect_run_boottool("--info=5", RESULT)
162		# run the test
163		info = self.loader.get_info(5)
164		self.god.check_playback()
165		expected_info = {"index": "5", "args": "ro single",
166				 "boot": "(hd0,0)",
167				 "initrd": "/boot/initrd.img-2.6.15-23-386",
168				 "kernel": "/boot/vmlinuz-2.6.15-23-386",
169				 "root": "UUID=07D7-0714", "savedefault": "",
170				 "title": "Distro, kernel 2.6.15-23-386"}
171		self.assertEquals(expected_info, info)
172
173
174	def test_get_info_missing_result(self):
175		# set up the recording
176		self.expect_run_boottool("--info=4", "")
177		# run the test
178		info = self.loader.get_info(4)
179		self.god.check_playback()
180		self.assertEquals({}, info)
181
182
183	def test_get_info_multiple_results(self):
184		RESULT = (
185		"index\t: 5\n"
186		"args\t: ro single\n"
187		"boot\t: (hd0,0)\n"
188		"initrd\t: /boot/initrd.img-2.6.15-23-386\n"
189		"kernel\t: /boot/vmlinuz-2.6.15-23-386\n"
190		"root\t: UUID=07D7-0714\n"
191		"savedefault\t:   \n"
192		"title\t: Distro, kernel 2.6.15-23-386\n"
193		"\n"
194		"index\t: 7\n"
195		"args\t: ro single\n"
196		"boot\t: (hd0,0)\n"
197		"initrd\t: /boot/initrd.img-2.6.15-23-686\n"
198		"kernel\t: /boot/vmlinuz-2.6.15-23-686\n"
199		"root\t: UUID=07D7-0714\n"
200		"savedefault\t:   \n"
201		"title\t: Distro, kernel 2.6.15-23-686\n"
202		)
203		# set up the recording
204		self.expect_run_boottool("--info=all", RESULT)
205		# run the test
206		info = self.loader.get_all_info()
207		self.god.check_playback()
208		expected_info = [{"index": "5", "args": "ro single",
209				  "boot": "(hd0,0)",
210				  "initrd": "/boot/initrd.img-2.6.15-23-386",
211				  "kernel": "/boot/vmlinuz-2.6.15-23-386",
212				  "root": "UUID=07D7-0714", "savedefault": "",
213				  "title": "Distro, kernel 2.6.15-23-386"},
214				 {"index": "7", "args": "ro single",
215				  "boot": "(hd0,0)",
216				  "initrd": "/boot/initrd.img-2.6.15-23-686",
217				  "kernel": "/boot/vmlinuz-2.6.15-23-686",
218				  "root": "UUID=07D7-0714", "savedefault": "",
219				  "title": "Distro, kernel 2.6.15-23-686"}]
220		self.assertEquals(expected_info, info)
221
222
223	def test_set_default(self):
224		# set up the recording
225		self.loader._run_boottool.expect_call("--set-default=41")
226		# run the test
227		self.loader.set_default(41)
228		self.god.check_playback()
229
230
231	def test_add_args(self):
232		# set up the recording
233		self.loader._run_boottool.expect_call(
234		    "--update-kernel=10 --args=\"some kernel args\"")
235		# run the test
236		self.loader.add_args(10, "some kernel args")
237		self.god.check_playback()
238
239
240	def test_remove_args(self):
241		# set up the recording
242		self.loader._run_boottool.expect_call(
243		    "--update-kernel=12 --remove-args=\"some kernel args\"")
244		# run the test
245		self.loader.remove_args(12, "some kernel args")
246		self.god.check_playback()
247
248
249	def test_add_kernel_basic(self):
250		self.loader.get_titles = self.god.create_mock_function(
251		    "get_titles")
252		# set up the recording
253		self.loader.get_titles.expect_call().and_return(["notmylabel"])
254		self.loader._run_boottool.expect_call(
255		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
256		    "--title \"mylabel\" --make-default")
257		# run the test
258		self.loader.add_kernel("/unittest/kernels/vmlinuz",
259				       "mylabel")
260		self.god.check_playback()
261
262
263	def test_add_kernel_adds_root(self):
264		self.loader.get_titles = self.god.create_mock_function(
265		    "get_titles")
266		# set up the recording
267		self.loader.get_titles.expect_call().and_return(["notmylabel"])
268		self.loader._run_boottool.expect_call(
269		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
270		    "--title \"mylabel\" --root \"/unittest/root\" "
271		    "--make-default")
272		# run the test
273		self.loader.add_kernel("/unittest/kernels/vmlinuz",
274				       "mylabel", root="/unittest/root")
275		self.god.check_playback()
276
277
278	def test_add_kernel_adds_args(self):
279		self.loader.get_titles = self.god.create_mock_function(
280		    "get_titles")
281		# set up the recording
282		self.loader.get_titles.expect_call().and_return(["notmylabel"])
283		self.loader._run_boottool.expect_call(
284		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
285		    "--title \"mylabel\" --args \"my kernel args\" "
286		    "--make-default")
287		# run the test
288		self.loader.add_kernel("/unittest/kernels/vmlinuz",
289				       "mylabel", args="my kernel args")
290		self.god.check_playback()
291
292
293	def test_add_kernel_adds_initrd(self):
294		self.loader.get_titles = self.god.create_mock_function(
295		    "get_titles")
296		# set up the recording
297		self.loader.get_titles.expect_call().and_return(["notmylabel"])
298		self.loader._run_boottool.expect_call(
299		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
300		    "--title \"mylabel\" --initrd \"/unittest/initrd\" "
301		    "--make-default")
302		# run the test
303		self.loader.add_kernel("/unittest/kernels/vmlinuz",
304				       "mylabel", initrd="/unittest/initrd")
305		self.god.check_playback()
306
307
308	def test_add_kernel_disables_make_default(self):
309		self.loader.get_titles = self.god.create_mock_function(
310		    "get_titles")
311		# set up the recording
312		self.loader.get_titles.expect_call().and_return(["notmylabel"])
313		self.loader._run_boottool.expect_call(
314		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
315		    "--title \"mylabel\"")
316		# run the test
317		self.loader.add_kernel("/unittest/kernels/vmlinuz",
318				       "mylabel", default=False)
319		self.god.check_playback()
320
321
322	def test_add_kernel_removes_old(self):
323		self.loader.get_titles = self.god.create_mock_function(
324		    "get_titles")
325		# set up the recording
326		self.loader.get_titles.expect_call().and_return(["mylabel"])
327		self.loader._run_boottool.expect_call(
328		    "--remove-kernel \"mylabel\"")
329		self.loader._run_boottool.expect_call(
330		    "--add-kernel \"/unittest/kernels/vmlinuz\" "
331		    "--title \"mylabel\" --make-default")
332		# run the test
333		self.loader.add_kernel("/unittest/kernels/vmlinuz",
334				       "mylabel")
335		self.god.check_playback()
336
337
338	def test_remove_kernel(self):
339		# set up the recording
340		self.loader._run_boottool.expect_call("--remove-kernel=14")
341		# run the test
342		self.loader.remove_kernel(14)
343		self.god.check_playback()
344
345
346	def test_boot_once(self):
347		# set up the recording
348		self.loader._run_boottool.expect_call(
349		    "--boot-once --title=autotest")
350		# run the test
351		self.loader.boot_once("autotest")
352		self.god.check_playback()
353
354
355if __name__ == "__main__":
356	unittest.main()
357