mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-05 00:15:17 +00:00
158 lines
5.8 KiB
Python
Executable File
158 lines
5.8 KiB
Python
Executable File
# Copyright (C) 2011 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 DDNS module'''
|
|
|
|
import unittest
|
|
import isc
|
|
import ddns
|
|
import isc.config
|
|
|
|
class MyCCSession(isc.config.ConfigData):
|
|
'''Fake session with minimal interface compliance'''
|
|
def __init__(self):
|
|
module_spec = isc.config.module_spec_from_file(
|
|
ddns.SPECFILE_LOCATION)
|
|
isc.config.ConfigData.__init__(self, module_spec)
|
|
self._started = False
|
|
|
|
def start(self):
|
|
'''Called by DDNSServer initialization, but not used in tests'''
|
|
self._started = True
|
|
|
|
class MyDDNSServer():
|
|
'''Fake DDNS server used to test the main() function'''
|
|
def __init__(self):
|
|
self.reset()
|
|
|
|
def run(self):
|
|
'''
|
|
Fake the run() method of the DDNS server. This will set
|
|
self._run_called to True.
|
|
If self._exception is not None, this is raised as an exception
|
|
'''
|
|
self.run_called = True
|
|
if self._exception is not None:
|
|
self.exception_raised = True
|
|
raise self._exception
|
|
|
|
def set_exception(self, exception):
|
|
'''Set an exception to be raised when run() is called'''
|
|
self._exception = exception
|
|
|
|
def reset(self):
|
|
'''(Re)set to initial values'''
|
|
self.run_called = False
|
|
self.exception_raised = False
|
|
self._exception = None
|
|
|
|
class TestDDNSServer(unittest.TestCase):
|
|
def setUp(self):
|
|
cc_session = MyCCSession()
|
|
self.assertFalse(cc_session._started)
|
|
self.ddns_server = ddns.DDNSServer(cc_session)
|
|
self.assertTrue(cc_session._started)
|
|
|
|
def test_config_handler(self):
|
|
# Config handler does not do anything yet, but should at least
|
|
# return 'ok' for now.
|
|
new_config = {}
|
|
answer = self.ddns_server.config_handler(new_config)
|
|
self.assertEqual((0, None), isc.config.parse_answer(answer))
|
|
|
|
def test_shutdown_command(self):
|
|
'''Test whether the shutdown command works'''
|
|
self.assertFalse(self.ddns_server._shutdown)
|
|
answer = self.ddns_server.command_handler('shutdown', None)
|
|
self.assertEqual((0, None), isc.config.parse_answer(answer))
|
|
self.assertTrue(self.ddns_server._shutdown)
|
|
|
|
def test_command_handler(self):
|
|
'''Test some commands.'''
|
|
# this command should not exist
|
|
answer = self.ddns_server.command_handler('bad_command', None)
|
|
self.assertEqual((1, 'Unknown command: bad_command'),
|
|
isc.config.parse_answer(answer))
|
|
|
|
def test_signal_handler(self):
|
|
'''Test whether signal_handler calls shutdown()'''
|
|
signal_handler = ddns.create_signal_handler(self.ddns_server)
|
|
self.assertFalse(self.ddns_server._shutdown)
|
|
signal_handler(None, None)
|
|
self.assertTrue(self.ddns_server._shutdown)
|
|
|
|
class TestMain(unittest.TestCase):
|
|
def setUp(self):
|
|
self._server = MyDDNSServer()
|
|
|
|
def test_main(self):
|
|
self.assertFalse(self._server.run_called)
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.run_called)
|
|
|
|
def test_exceptions(self):
|
|
'''
|
|
Test whether exceptions are caught in main()
|
|
These exceptions should not bubble up.
|
|
'''
|
|
self._server.set_exception(KeyboardInterrupt())
|
|
self.assertFalse(self._server.exception_raised)
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
# Should technically not be necessary, but reset server to be sure
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(isc.cc.SessionError("error"))
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(isc.config.ModuleCCSessionError("error"))
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(ddns.DDNSConfigError("error"))
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(isc.cc.SessionTimeout("error"))
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(Exception("error"))
|
|
ddns.main(self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
# Add one that is not a subclass of Exception, and hence not
|
|
# caught. Misuse BaseException for that.
|
|
self._server.reset()
|
|
self.assertFalse(self._server.exception_raised)
|
|
self._server.set_exception(BaseException("error"))
|
|
self.assertRaises(BaseException, ddns.main, self._server)
|
|
self.assertTrue(self._server.exception_raised)
|
|
|
|
|
|
if __name__== "__main__":
|
|
isc.log.resetUnitTestRootLogger()
|
|
unittest.main()
|