Browse Source

[1261] added another sqlite3-based test. also make sure any remaining diff
object is cleared as soon as possible after the xfrin session.

JINMEI Tatuya 13 years ago
parent
commit
f85f868171
2 changed files with 24 additions and 1 deletions
  1. 19 0
      src/bin/xfrin/tests/xfrin_test.py
  2. 5 1
      src/bin/xfrin/xfrin.py.in

+ 19 - 0
src/bin/xfrin/tests/xfrin_test.py

@@ -1238,10 +1238,29 @@ class TestIXFRSessionWithSQLite3(TestXfrinConnection):
                 answers=[soa_rrset, begin_soa_rrset, soa_rrset, soa_rrset])
         self.conn.response_generator = create_ixfr_response
 
+        # Confirm xfrin succeeds and SOA is updated
         self.assertEqual(1230, self.get_zone_serial())
         self.assertEqual(XFRIN_OK, self.conn.do_xfrin(False, True))
         self.assertEqual(1234, self.get_zone_serial())
 
+    def test_do_xfrin_sqlite3_fail(self):
+        '''Similar to the previous test, but xfrin fails due to error.
+
+        Check the DB is not changed.
+
+        '''
+        def create_ixfr_response():
+            self.conn.reply_data = self.conn.create_response_data(
+                questions=[Question(TEST_ZONE_NAME, TEST_RRCLASS,
+                                    RRType.IXFR())],
+                answers=[soa_rrset, begin_soa_rrset, soa_rrset,
+                         self._create_soa('1235')])
+        self.conn.response_generator = create_ixfr_response
+
+        self.assertEqual(1230, self.get_zone_serial())
+        self.assertEqual(XFRIN_FAIL, self.conn.do_xfrin(False, True))
+        self.assertEqual(1230, self.get_zone_serial())
+
 class TestXfrinRecorder(unittest.TestCase):
     def setUp(self):
         self.recorder = XfrinRecorder()

+ 5 - 1
src/bin/xfrin/xfrin.py.in

@@ -525,7 +525,11 @@ class XfrinConnection(asyncore.dispatcher):
             logger.error(XFRIN_AXFR_INTERNAL_FAILURE, self.zone_str(), str(e))
             ret = XFRIN_FAIL
         finally:
-           self.close()
+            # Make sure any remaining transaction in the diff is closed
+            # (if not yet - possible in case of xfr-level exception) as soon
+            # as possible
+            self._diff = None
+            self.close()
 
         return ret