#!/usr/bin/python
import unittest, os
import common
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.client.common_lib import error
from autotest_lib.server import utils, hosts
from autotest_lib.server.hosts import bootloader
class test_bootloader(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
# mock out get_server_dir
self.god.stub_function(utils, "get_server_dir")
def tearDown(self):
self.god.unstub_all()
def create_mock_host(self):
# useful for building disposable RemoteHost mocks
return self.god.create_mock_class(hosts.RemoteHost, "host")
def create_install_boottool_mock(self, loader, dst_dir):
mock_install_boottool = \
self.god.create_mock_function("_install_boottool")
def install_boottool():
loader._boottool_path = dst_dir
mock_install_boottool()
loader._install_boottool = install_boottool
return mock_install_boottool
def test_install_fails_without_host(self):
host = self.create_mock_host()
loader = bootloader.Bootloader(host)
del host
self.assertRaises(error.AutoservError, loader._install_boottool)
def test_installs_to_tmpdir(self):
TMPDIR = "/unittest/tmp"
SERVERDIR = "/unittest/server"
BOOTTOOL_SRC = os.path.join(SERVERDIR, bootloader.BOOTTOOL_SRC)
BOOTTOOL_SRC = os.path.abspath(BOOTTOOL_SRC)
BOOTTOOL_DST = os.path.join(TMPDIR, "boottool")
# set up the recording
host = self.create_mock_host()
host.get_tmp_dir.expect_call().and_return(TMPDIR)
utils.get_server_dir.expect_call().and_return(SERVERDIR)
host.send_file.expect_call(BOOTTOOL_SRC, TMPDIR)
# run the test
loader = bootloader.Bootloader(host)
loader._install_boottool()
# assert the playback is correct
self.god.check_playback()
# assert the final dest is correct
self.assertEquals(loader._boottool_path, BOOTTOOL_DST)
def test_get_path_automatically_installs(self):
BOOTTOOL_DST = "/unittest/tmp/boottool"
host = self.create_mock_host()
loader = bootloader.Bootloader(host)
# mock out loader.install_boottool
mock_install = \
self.create_install_boottool_mock(loader, BOOTTOOL_DST)
# set up the recording
mock_install.expect_call()
# run the test
self.assertEquals(loader._get_boottool_path(), BOOTTOOL_DST)
self.god.check_playback()
def test_install_is_only_called_once(self):
BOOTTOOL_DST = "/unittest/tmp/boottool"
host = self.create_mock_host()
loader = bootloader.Bootloader(host)
# mock out loader.install_boottool
mock_install = \
self.create_install_boottool_mock(loader, BOOTTOOL_DST)
# set up the recording
mock_install.expect_call()
# run the test
self.assertEquals(loader._get_boottool_path(), BOOTTOOL_DST)
self.god.check_playback()
self.assertEquals(loader._get_boottool_path(), BOOTTOOL_DST)
self.god.check_playback()
if __name__ == "__main__":
unittest.main()