From: JINMEI Tatuya Date: Thu, 17 May 2012 01:14:48 +0000 (-0700) Subject: [1512] introduce a test data source and search it in ZoneConfig.find_zone(). X-Git-Tag: trac2351_base~226^2~82^2~20 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=94fc335cc34ceb93bbc8e7caa66174d6c51038b8;p=thirdparty%2Fkea.git [1512] introduce a test data source and search it in ZoneConfig.find_zone(). --- diff --git a/src/lib/python/isc/ddns/tests/Makefile.am b/src/lib/python/isc/ddns/tests/Makefile.am index cbf2954310..9795099515 100644 --- a/src/lib/python/isc/ddns/tests/Makefile.am +++ b/src/lib/python/isc/ddns/tests/Makefile.am @@ -1,6 +1,7 @@ PYCOVERAGE_RUN = @PYCOVERAGE_RUN@ PYTESTS = session_tests.py EXTRA_DIST = $(PYTESTS) +CLEANFILES = $(builddir)/rwtest.sqlite3.copied # If necessary, explicitly specify paths to dynamic libraries # required by loadable python modules. @@ -19,6 +20,8 @@ endif for pytest in $(PYTESTS) ; do \ echo Running test: $$pytest ; \ $(LIBRARY_PATH_PLACEHOLDER) \ + TESTDATA_PATH=$(abs_top_srcdir)/src/lib/testutils/testdata \ + TESTDATA_WRITE_PATH=$(builddir) \ PYTHONPATH=$(COMMON_PYTHON_PATH):$(abs_top_builddir)/src/lib/dns/python/.libs \ $(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \ done diff --git a/src/lib/python/isc/ddns/tests/session_tests.py b/src/lib/python/isc/ddns/tests/session_tests.py index ee68ced8f6..493017f6a1 100644 --- a/src/lib/python/isc/ddns/tests/session_tests.py +++ b/src/lib/python/isc/ddns/tests/session_tests.py @@ -13,14 +13,23 @@ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +import os +import shutil import isc.log import unittest from isc.dns import * +from isc.datasrc import DataSourceClient from isc.ddns.session import * from isc.ddns.zone_config import * # Some common test parameters -TEST_ZONE_NAME = Name('example.com') +TESTDATA_PATH = os.environ['TESTDATA_PATH'] + os.sep +READ_ZONE_DB_FILE = TESTDATA_PATH + "rwtest.sqlite3" # original, to be copied +TESTDATA_WRITE_PATH = os.environ['TESTDATA_WRITE_PATH'] + os.sep +WRITE_ZONE_DB_FILE = TESTDATA_WRITE_PATH + "rwtest.sqlite3.copied" +WRITE_ZONE_DB_CONFIG = "{ \"database_file\": \"" + WRITE_ZONE_DB_FILE + "\"}" + +TEST_ZONE_NAME = Name('example.org') UPDATE_RRTYPE = RRType.SOA() TEST_RRCLASS = RRClass.IN() TEST_ZONE_RECORD = Question(TEST_ZONE_NAME, TEST_RRCLASS, UPDATE_RRTYPE) @@ -47,11 +56,14 @@ def create_update_msg(zones=[TEST_ZONE_RECORD]): class SessionTest(unittest.TestCase): '''Session tests''' def setUp(self): + shutil.copyfile(READ_ZONE_DB_FILE, WRITE_ZONE_DB_FILE) + self.__datasrc_client = DataSourceClient("sqlite3", + WRITE_ZONE_DB_CONFIG) self.__update_msgdata, self.__update_msg = create_update_msg() self.__session = UpdateSession(self.__update_msg, self.__update_msgdata, TEST_CLIENT4, - ZoneConfig([(Name("example.org"), - TEST_RRCLASS)])) + ZoneConfig([], TEST_RRCLASS, + self.__datasrc_client)) def check_response(self, msg, expected_rcode): '''Perform common checks on update resposne message.''' @@ -93,23 +105,26 @@ class SessionTest(unittest.TestCase): # specified zone is configured as a secondary. Since this # implementation doesn't support update forwarding, the result # should be REFUSED. - sec_zone = Name("example.org") - msg_data, msg = create_update_msg(zones=[Question(sec_zone, + msg_data, msg = create_update_msg(zones=[Question(TEST_ZONE_NAME, TEST_RRCLASS, RRType.SOA())]) session = UpdateSession(msg, msg_data, TEST_CLIENT4, - ZoneConfig([(sec_zone, TEST_RRCLASS)])) + ZoneConfig([(TEST_ZONE_NAME, TEST_RRCLASS)], + TEST_RRCLASS, + self.__datasrc_client)) self.assertEqual(UPDATE_ERROR, session.handle()[0]) self.check_response(session.get_message(), Rcode.REFUSED()) def test_handle(self): result, zname, zclass = self.__session.handle() self.assertEqual(UPDATE_SUCCESS, result) - self.assertNotEqual(UPDATE_ERROR, result) - self.assertNotEqual(UPDATE_DROP, result) self.assertEqual(TEST_ZONE_NAME, zname) self.assertEqual(TEST_RRCLASS, zclass) + # Just checking these are different from the success code. + self.assertNotEqual(UPDATE_ERROR, result) + self.assertNotEqual(UPDATE_DROP, result) + if __name__ == "__main__": isc.log.init("bind10") isc.log.resetUnitTestRootLogger() diff --git a/src/lib/python/isc/ddns/zone_config.py b/src/lib/python/isc/ddns/zone_config.py index a1dd1cc2d4..18b3e1596f 100644 --- a/src/lib/python/isc/ddns/zone_config.py +++ b/src/lib/python/isc/ddns/zone_config.py @@ -13,6 +13,9 @@ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +import isc.dns +from isc.datasrc import DataSourceClient + # Constants representing zone types ZONE_NOTFOUND = -1 # Zone isn't found in find_zone() ZONE_PRIMARY = 0 # Primary zone @@ -30,14 +33,31 @@ class ZoneConfig: until the details are fixed. ''' - def __init__(self, secondaries): + def __init__(self, secondaries, datasrc_class, datasrc_client): + '''Constructor. + + Parameters: + - secondaries: a list of 2-element tuple. Each element is a pair + of isc.dns.Name and isc.dns.RRClass, and identifies a single + secondary zone. + - datasrc_class: isc.dns.RRClass object. Specifies the RR class + of datasrc_client. + - datasrc_client: isc.dns.DataSourceClient object. A data source + class for the RR class of datasrc_class. It's expected to contain + a zone that is eventually updated in the ddns package. + + ''' self.__secondaries = {} for (zname, zclass) in secondaries: self.__secondaries[(zname, zclass)] = True + self.__datasrc_class = datasrc_class + self.__datasrc_client = datasrc_client def find_zone(self, zone_name, zone_class): '''Return the type and accessor client object for given zone.''' - # Right now, the client is not used, so we simply return None. - if (zone_name, zone_class) in self.__secondaries: - return ZONE_SECONDARY, None - return ZONE_PRIMARY, None + if self.__datasrc_class == zone_class and \ + self.__datasrc_client.find_zone(zone_name)[0] == \ + DataSourceClient.SUCCESS: + if (zone_name, zone_class) in self.__secondaries: + return ZONE_SECONDARY, self.__datasrc_client + return ZONE_PRIMARY, self.__datasrc_client