Browse Source

[1512] introduce a test data source and search it in ZoneConfig.find_zone().

JINMEI Tatuya 13 years ago
parent
commit
94fc335cc3

+ 3 - 0
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

+ 23 - 8
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()

+ 25 - 5
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