b10-cfgmgr_test.py.in 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # Copyright (C) 2010 Internet Systems Consortium.
  2. #
  3. # Permission to use, copy, modify, and distribute this software for any
  4. # purpose with or without fee is hereby granted, provided that the above
  5. # copyright notice and this permission notice appear in all copies.
  6. #
  7. # THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
  8. # DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
  9. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
  10. # INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
  11. # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
  12. # FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  13. # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  14. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. #
  16. # Tests for the configuration manager run script
  17. #
  18. import unittest
  19. import os
  20. import sys
  21. from isc.testutils.parse_args import OptsError, TestOptParser
  22. class MyConfigManager:
  23. def __init__(self, path, filename):
  24. self._path = path
  25. self.read_config_called = False
  26. self.notify_boss_called = False
  27. self.run_called = False
  28. self.write_config_called = False
  29. self.running = True
  30. def read_config(self):
  31. self.read_config_called = True
  32. def notify_boss(self):
  33. self.notify_boss_called = True
  34. def run(self):
  35. self.run_called = True
  36. def write_config(self):
  37. self.write_config_called = True
  38. class TestConfigManagerStartup(unittest.TestCase):
  39. def test_cfgmgr(self):
  40. # some creative module use;
  41. # b10-cfgmgr has a hypen, so we use __import__
  42. # this also gives us the chance to override the imported
  43. # module ConfigManager in it.
  44. b = __import__("b10-cfgmgr")
  45. b.ConfigManager = MyConfigManager
  46. b.main()
  47. self.assertTrue(b.cm.read_config_called)
  48. self.assertTrue(b.cm.notify_boss_called)
  49. self.assertTrue(b.cm.run_called)
  50. # if there are no changes, config is not written
  51. self.assertFalse(b.cm.write_config_called)
  52. self.assertTrue(b.cm.running)
  53. b.signal_handler(None, None)
  54. self.assertFalse(b.cm.running)
  55. # TODO: take value from the 'global config module'
  56. # (and rename the .in away from this file again)
  57. data_path = "@localstatedir@/@PACKAGE@".replace("${prefix}", "@prefix@")
  58. self.assertEqual(data_path, b.DATA_PATH)
  59. # remove the 'module' again, or later tests may fail
  60. # (if it is already present it won't be loaded again)
  61. sys.modules.pop("b10-cfgmgr")
  62. def test_cfgmgr_from_source(self):
  63. tmp_env_var = "/just/some/dir"
  64. env_var = None
  65. if "B10_FROM_SOURCE" in os.environ:
  66. env_var = os.environ["B10_FROM_SOURCE"]
  67. os.environ["B10_FROM_SOURCE"] = tmp_env_var
  68. b = __import__("b10-cfgmgr", globals(), locals())
  69. b.ConfigManager = MyConfigManager
  70. self.assertEqual(tmp_env_var, b.DATA_PATH)
  71. if env_var != None:
  72. os.environ["B10_FROM_SOURCE"] = env_var
  73. sys.modules.pop("b10-cfgmgr")
  74. class TestParseArgs(unittest.TestCase):
  75. """
  76. Test for the parsing of command line arguments. We provide a different
  77. array to parse instead.
  78. """
  79. def test_defaults(self):
  80. """
  81. Test the default values when no options are provided.
  82. """
  83. # Pass it empty array, not our arguments
  84. b = __import__("b10-cfgmgr")
  85. parsed = b.parse_options([], TestOptParser)
  86. self.assertEqual(b.DATA_PATH, parsed.data_path)
  87. self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.file_name)
  88. def test_wrong_args(self):
  89. """
  90. Test it fails when we pass invalid option.
  91. """
  92. b = __import__("b10-cfgmgr")
  93. self.assertRaises(OptsError, b.parse_options, ['--wrong-option'],
  94. TestOptParser)
  95. def test_not_arg(self):
  96. """
  97. Test it fails when there's an argument that's not option
  98. (eg. without -- at the beginning).
  99. """
  100. b = __import__("b10-cfgmgr")
  101. self.assertRaises(OptsError, b.parse_options, ['not-option'],
  102. TestOptParser)
  103. def test_datapath(self):
  104. """
  105. Test overwriting the data path.
  106. """
  107. b = __import__("b10-cfgmgr")
  108. parsed = b.parse_options(['--data-path=/path'], TestOptParser)
  109. self.assertEqual('/path', parsed.data_path)
  110. self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.file_name)
  111. parsed = b.parse_options(['-p', '/path'], TestOptParser)
  112. self.assertEqual('/path', parsed.data_path)
  113. self.assertEqual(b.DEFAULT_CONFIG_FILE, parsed.file_name)
  114. self.assertRaises(OptsError, b.parse_options, ['-p'], TestOptParser)
  115. self.assertRaises(OptsError, b.parse_options, ['--data-path'],
  116. TestOptParser)
  117. def test_db_filename(self):
  118. """
  119. Test setting the configuration database file.
  120. """
  121. b = __import__("b10-cfgmgr")
  122. parsed = b.parse_options(['--config-filename=filename'],
  123. TestOptParser)
  124. self.assertEqual(b.DATA_PATH, parsed.data_path)
  125. self.assertEqual("filename", parsed.file_name)
  126. parsed = b.parse_options(['-c', 'filename'], TestOptParser)
  127. self.assertEqual(b.DATA_PATH, parsed.data_path)
  128. self.assertEqual("filename", parsed.file_name)
  129. self.assertRaises(OptsError, b.parse_options, ['-c'], TestOptParser)
  130. self.assertRaises(OptsError, b.parse_options, ['--config-filename'],
  131. TestOptParser)
  132. if __name__ == '__main__':
  133. unittest.main()