#!/usr/bin/python2
# pylint: disable=missing-docstring

import unittest
import common

from autotest_lib.client.common_lib import global_config
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.server import utils
from autotest_lib.server.hosts import base_classes


class test_host_class(unittest.TestCase):
    def setUp(self):
        self.god = mock.mock_god()
        # stub out get_server_dir, global_config.get_config_value
        self.god.stub_with(utils, "get_server_dir",
                           lambda: "/unittest/server")
        self.god.stub_function(global_config.global_config,
                               "get_config_value")


    def tearDown(self):
        self.god.unstub_all()


    def test_init(self):
        self.god.stub_function(utils, "get_server_dir")
        host = base_classes.Host.__new__(base_classes.Host)
        # set up the recording
        utils.get_server_dir.expect_call().and_return("/unittest/server")
        # run the actual test
        host.__init__()
        self.god.check_playback()


    def test_install(self):
        host = base_classes.Host()
        # create a stub installable class
        class installable(object):
            def install(self, host):
                pass
        installableObj = self.god.create_mock_class(installable,
                                                    "installableObj")
        installableObj.install.expect_call(host)
        # run the actual test
        host.install(installableObj)
        self.god.check_playback()


    def test_get_wait_up_empty(self):
        global_config.global_config.get_config_value.expect_call(
            "HOSTS", "wait_up_processes", default="").and_return("")

        host = base_classes.Host()
        self.assertEquals(host.get_wait_up_processes(), set())
        self.god.check_playback()


    def test_get_wait_up_ignores_whitespace(self):
        global_config.global_config.get_config_value.expect_call(
            "HOSTS", "wait_up_processes", default="").and_return("  ")

        host = base_classes.Host()
        self.assertEquals(host.get_wait_up_processes(), set())
        self.god.check_playback()


    def test_get_wait_up_single_process(self):
        global_config.global_config.get_config_value.expect_call(
            "HOSTS", "wait_up_processes", default="").and_return("proc1")

        host = base_classes.Host()
        self.assertEquals(host.get_wait_up_processes(),
                          set(["proc1"]))
        self.god.check_playback()


    def test_get_wait_up_multiple_process(self):
        global_config.global_config.get_config_value.expect_call(
            "HOSTS", "wait_up_processes", default="").and_return(
            "proc1,proc2,proc3")

        host = base_classes.Host()
        self.assertEquals(host.get_wait_up_processes(),
                          set(["proc1", "proc2", "proc3"]))
        self.god.check_playback()


    def test_get_wait_up_drops_duplicates(self):
        global_config.global_config.get_config_value.expect_call(
            "HOSTS", "wait_up_processes", default="").and_return(
            "proc1,proc2,proc1")

        host = base_classes.Host()
        self.assertEquals(host.get_wait_up_processes(),
                          set(["proc1", "proc2"]))
        self.god.check_playback()


if __name__ == "__main__":
    unittest.main()
