From: JINMEI Tatuya Date: Tue, 4 Oct 2011 05:34:21 +0000 (-0700) Subject: [1261] added some more tests for the simple IXFR case. also revised X-Git-Tag: perftcpdns_before_epoll~37^2~21^2~13^2~30 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5a2d0b61afe86668613cbb83a75708b760aae76f;p=thirdparty%2Fkea.git [1261] added some more tests for the simple IXFR case. also revised the code so that the Diff obj is created in the RR processing on demand. --- diff --git a/src/bin/xfrin/tests/xfrin_test.py b/src/bin/xfrin/tests/xfrin_test.py index e4fe9470cd..cc6afaa03c 100644 --- a/src/bin/xfrin/tests/xfrin_test.py +++ b/src/bin/xfrin/tests/xfrin_test.py @@ -77,20 +77,25 @@ class MockDataSourceClient(): This class provides a minimal set of wrappers related the data source API that would be used by Diff objects. For our testing purposes they - can be alsmot no-op. + only keep truck of the history of the changes. ''' + def __init__(self): + self.committed_diffs = [] + self.diffs = [] + def get_updater(self, zone_name, replace): return self def add_rrset(self, rrset): - pass + self.diffs.append(('add', rrset)) def remove_rrset(self, rrset): - pass + self.diffs.append(('remove', rrset)) def commit(self): - pass + self.committed_diffs.append(self.diffs) + self.diffs = [] class MockXfrin(Xfrin): # This is a class attribute of a callable object that specifies a non @@ -258,7 +263,7 @@ class TestXfrinState(unittest.TestCase): RRTTL(3600)) self.ns_rrset.add_rdata(Rdata(RRType.NS(), TEST_RRCLASS, 'ns.example.com')) - self.__data_operations = [] + self.conn._datasrc_client = MockDataSourceClient() self.conn._diff = Diff(MockDataSourceClient(), TEST_ZONE_NAME) class TestXfrinInitialSOA(TestXfrinState): @@ -317,6 +322,9 @@ class TestXfrinIXFRDeleteSOA(TestXfrinState): def setUp(self): super().setUp() self.state = XfrinIXFRDeleteSOA() + # In this state a new Diff object is expected to be created. To + # confirm it, we nullify it beforehand. + self.conn._diff = None def test_handle_rr(self): self.assertTrue(self.state.handle_rr(self.conn, self.begin_soa)) @@ -980,7 +988,32 @@ class TestIXFR(TestXfrinConnection): self.conn._query_id = self.conn.qid = 1035 self.conn._request_serial = 1230 self.conn._request_type = RRType.IXFR() - self.conn._diff = Diff(MockDataSourceClient(), TEST_ZONE_NAME) + self._zone_name = TEST_ZONE_NAME + self.conn._datasrc_client = MockDataSourceClient() + + def check_diffs(self, expected, actual): + '''A helper method checking the differences made in the IXFR session. + + ''' + self.assertEqual(len(expected), len(actual)) + for (diffs_exp, diffs_actual) in zip(expected, actual): + self.assertEqual(len(diffs_exp), len(diffs_actual)) + for (diff_exp, diff_actual) in zip(diffs_exp, diffs_actual): + # operation should match + self.assertEqual(diff_exp[0], diff_actual[0]) + # The diff as RRset should be equal (for simplicity we assume + # all RRsets contain exactly one RDATA) + self.assertEqual(diff_exp[1].get_name(), + diff_actual[1].get_name()) + self.assertEqual(diff_exp[1].get_type(), + diff_actual[1].get_type()) + self.assertEqual(diff_exp[1].get_class(), + diff_actual[1].get_class()) + self.assertEqual(diff_exp[1].get_rdata_count(), + diff_actual[1].get_rdata_count()) + self.assertEqual(1, diff_exp[1].get_rdata_count()) + self.assertEqual(diff_exp[1].get_rdata()[0], + diff_actual[1].get_rdata()[0]) def test_ixfr_response(self): '''A simplest form of IXFR response. @@ -994,6 +1027,9 @@ class TestIXFR(TestXfrinConnection): XfrinInitialSOA().set_xfrstate(self.conn, XfrinInitialSOA()) self.conn._handle_xfrin_responses() self.assertEqual(type(XfrinIXFREnd()), type(self.conn.get_xfrstate())) + self.assertEqual([], self.conn._datasrc_client.diffs) + self.check_diffs([[('remove', begin_soa_rrset), ('add', soa_rrset)]], + self.conn._datasrc_client.committed_diffs) class TestXfrinRecorder(unittest.TestCase): def setUp(self): diff --git a/src/bin/xfrin/xfrin.py.in b/src/bin/xfrin/xfrin.py.in index b6406fb841..99e31d119d 100755 --- a/src/bin/xfrin/xfrin.py.in +++ b/src/bin/xfrin/xfrin.py.in @@ -185,6 +185,9 @@ class XfrinIXFRDeleteSOA(XfrinState): # bug. raise XfrinException(rr.get_type().to_text() + \ ' RR is given in IXFRDeleteSOA state') + # This is the beginning state of one difference sequence (changes + # for one SOA update). We need to create a new Diff object now. + conn._diff = Diff(conn._datasrc_client, conn._zone_name) conn._diff.remove_data(rr) self.set_xfrstate(conn, XfrinIXFRDelete()) return True