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