|
# Copyright (C) 2010 Internet Systems Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Tests for the configuration manager run script
#
import unittest
import os
import sys
import bind10_config
from isc.testutils.parse_args import OptsError, TestOptParser
class MyConfigManager:
def __init__(self, path, filename, session=None, rename_config_file=False):
self._path = path
self.read_config_called = False
self.notify_boss_called = False
self.run_called = False
self.write_config_called = False
self.rename_config_called = False
self.running = True
self.virtual_modules = []
def read_config(self):
self.read_config_called = True
def notify_boss(self):
self.notify_boss_called = True
def run(self):
self.run_called = True
def write_config(self):
self.write_config_called = True
def rename_config_file(self, ofile, nfile):
self.rename_config_called = True
def set_virtual_module(self, spec, function):
self.virtual_modules.append((spec, function))
class TestPlugins(unittest.TestCase):
def test_load_plugins(self):
"""Test we can successfully find and load the mock plugin."""
# Let it load the plugin
b = __import__("b10-cfgmgr")
# The parameters aren't important for this test
cm = MyConfigManager(None, None)
b.load_plugins(os.environ['TESTDATA_PATH'] + os.sep + 'plugins', cm)
# Check exactly one plugin was loaded and the right data were fed into
# the cm
self.assertEqual(len(cm.virtual_modules), 1)
(spec, check) = cm.virtual_modules[0]
self.assertEqual(spec.get_module_name(), "mock_config_plugin")
self.assertEqual(check(None), "Mock config plugin")
class TestConfigManagerStartup(unittest.TestCase):
def test_cfgmgr(self):
# some creative module use;
# b10-cfgmgr has a hypen, so we use __import__
# this also gives us the chance to override the imported
# module ConfigManager in it.
b = __import__("b10-cfgmgr")
orig_load = b.load_plugins
b.PLUGIN_PATHS = ["/plugin/path"]
self.loaded_plugins = False
def load_plugins(path, cm):
# Check it's called with proper arguments
self.assertEqual(path, "/plugin/path")
self.assertTrue(isinstance(cm, MyConfigManager))
self.loaded_plugins = True
b.load_plugins = load_plugins
b.ConfigManager = MyConfigManager
b.main()
b.load_plugins = orig_load
self.assertTrue(b.cm.read_config_called)
self.assertTrue(b.cm.notify_boss_called)
self.assertTrue(b.cm.run_called)
self.assertTrue(self.loaded_plugins)
# if there are no changes, config is not written
self.assertFalse(b.cm.write_config_called)
self.assertFalse(b.cm.rename_config_called)
self.assertTrue(b.cm.running)
b.signal_handler(None, None)
self.assertFalse(b.cm.running)
# TODO: take value from the 'global config module'
# (and rename the .in away from this file again)
data_path = "${prefix}/var/bind10-devel".replace("${prefix}", "/home/jelte/opt/bind10")
self.assertEqual(data_path, b.DATA_PATH)
# remove the 'module' again, or later tests may fail
# (if it is already present it won't be loaded again)
sys.modules.pop("b10-cfgmgr")
def test_cfgmgr_from_source(self):
tmp_env_var = "/just/some/dir"
env_var = None
116 if "B10_FROM_SOURCE" in os.environ:
env_var = os.environ["B10_FROM_SOURCE"]
os.environ["B10_FROM_SOURCE"] = tmp_env_var
bind10_config.reload()
b = __import__("b10-cfgmgr", globals(), locals())
b.PLUGIN_PATH = [] # It's enough to test plugins in one test
b.ConfigManager = MyConfigManager
self.assertEqual(tmp_env_var, b.DATA_PATH)
126 if env_var != None:
os.environ["B10_FROM_SOURCE"] = env_var
bind10_config.reload()
sys.modules.pop("b10-cfgmgr")
class TestParseArgs(unittest.TestCase):
"""
Test for the parsing of command line arguments. We provide a different
array to parse instead.
"""
def test_defaults(self):
"""
Test the default values when no options are provided.
"""
# Pass it empty array, not our arguments
b = __import__("b10-cfgmgr")
parsed = b.parse_options([], TestOptParser)
self.assertEqual(b.DATA_PATH, parsed.data_path)
self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.config_file)
def test_wrong_args(self):
"""
Test it fails when we pass invalid option.
"""
b = __import__("b10-cfgmgr")
self.assertRaises(OptsError, b.parse_options, ['--wrong-option'],
TestOptParser)
def test_not_arg(self):
"""
Test it fails when there's an argument that's not option
(eg. without -- at the beginning).
"""
b = __import__("b10-cfgmgr")
self.assertRaises(OptsError, b.parse_options, ['not-option'],
TestOptParser)
def test_datapath(self):
"""
Test overwriting the data path.
"""
b = __import__("b10-cfgmgr")
parsed = b.parse_options(['--data-path=/path'], TestOptParser)
self.assertEqual('/path', parsed.data_path)
self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.config_file)
parsed = b.parse_options(['-p', '/path'], TestOptParser)
self.assertEqual('/path', parsed.data_path)
self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.config_file)
self.assertRaises(OptsError, b.parse_options, ['-p'], TestOptParser)
self.assertRaises(OptsError, b.parse_options, ['--data-path'],
TestOptParser)
def test_db_filename(self):
"""
Test setting the configuration database file.
"""
b = __import__("b10-cfgmgr")
parsed = b.parse_options(['--config-filename=filename'],
TestOptParser)
self.assertEqual(b.DATA_PATH, parsed.data_path)
self.assertEqual("filename", parsed.config_file)
parsed = b.parse_options(['-c', 'filename'], TestOptParser)
self.assertEqual(b.DATA_PATH, parsed.data_path)
self.assertEqual("filename", parsed.config_file)
self.assertRaises(OptsError, b.parse_options, ['-c'], TestOptParser)
self.assertRaises(OptsError, b.parse_options, ['--config-filename'],
TestOptParser)
def test_clear_config(self):
b = __import__("b10-cfgmgr")
parsed = b.parse_options([], TestOptParser)
self.assertFalse(parsed.clear_config)
parsed = b.parse_options(['--clear-config'], TestOptParser)
self.assertTrue(parsed.clear_config)
exitif __name__ == '__main__':
unittest.main()
|