普通文本  |  98行  |  3.19 KB

#!/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()