|
@@ -15,7 +15,7 @@
|
|
|
|
|
|
import isc.log
|
|
|
import isc.datasrc
|
|
|
-from isc.datasrc import ZoneFinder
|
|
|
+from isc.datasrc import ZoneFinder, ZoneJournalReader
|
|
|
from isc.dns import *
|
|
|
import unittest
|
|
|
import sqlite3
|
|
@@ -62,6 +62,13 @@ def check_for_rrset(expected_rrsets, rrset):
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
+def create_soa(serial):
|
|
|
+ soa = RRset(Name('example.org'), RRClass.IN(), RRType.SOA(), RRTTL(3600))
|
|
|
+ soa.add_rdata(Rdata(RRType.SOA(), RRClass.IN(),
|
|
|
+ 'ns1.example.org. admin.example.org. ' +
|
|
|
+ str(serial) + ' 3600 1800 2419200 7200'))
|
|
|
+ return soa
|
|
|
+
|
|
|
class DataSrcClient(unittest.TestCase):
|
|
|
|
|
|
def test_(self):
|
|
@@ -591,14 +598,6 @@ class JournalWrite(unittest.TestCase):
|
|
|
self.assertEqual(expected, actual)
|
|
|
conn.close()
|
|
|
|
|
|
- def create_soa(self, serial):
|
|
|
- soa = RRset(Name('example.org'), RRClass.IN(), RRType.SOA(),
|
|
|
- RRTTL(3600))
|
|
|
- soa.add_rdata(Rdata(RRType.SOA(), RRClass.IN(),
|
|
|
- 'ns1.example.org. admin.example.org. ' +
|
|
|
- str(serial) + ' 3600 1800 2419200 7200'))
|
|
|
- return soa
|
|
|
-
|
|
|
def create_a(self, address):
|
|
|
a_rr = RRset(Name('www.example.org'), RRClass.IN(), RRType.A(),
|
|
|
RRTTL(3600))
|
|
@@ -609,9 +608,9 @@ class JournalWrite(unittest.TestCase):
|
|
|
# This is a straightforward port of the C++ 'journal' test
|
|
|
# Note: we add/delete 'out of zone' data (example.org in the
|
|
|
# example.com zone for convenience.
|
|
|
- self.updater.delete_rrset(self.create_soa(1234))
|
|
|
+ self.updater.delete_rrset(create_soa(1234))
|
|
|
self.updater.delete_rrset(self.create_a('192.0.2.2'))
|
|
|
- self.updater.add_rrset(self.create_soa(1235))
|
|
|
+ self.updater.add_rrset(create_soa(1235))
|
|
|
self.updater.add_rrset(self.create_a('192.0.2.2'))
|
|
|
self.updater.commit()
|
|
|
|
|
@@ -630,11 +629,11 @@ class JournalWrite(unittest.TestCase):
|
|
|
# This is a straightforward port of the C++ 'journalMultiple' test
|
|
|
expected = []
|
|
|
for i in range(1, 100):
|
|
|
- self.updater.delete_rrset(self.create_soa(1234 + i - 1))
|
|
|
+ self.updater.delete_rrset(create_soa(1234 + i - 1))
|
|
|
expected.append(("example.org.", "SOA", 3600,
|
|
|
"ns1.example.org. admin.example.org. " +
|
|
|
str(1234 + i - 1) + " 3600 1800 2419200 7200"))
|
|
|
- self.updater.add_rrset(self.create_soa(1234 + i))
|
|
|
+ self.updater.add_rrset(create_soa(1234 + i))
|
|
|
expected.append(("example.org.", "SOA", 3600,
|
|
|
"ns1.example.org. admin.example.org. " +
|
|
|
str(1234 + i) + " 3600 1800 2419200 7200"))
|
|
@@ -650,27 +649,27 @@ class JournalWrite(unittest.TestCase):
|
|
|
# Add before delete
|
|
|
self.updater = self.dsc.get_updater(Name("example.com"), False, True)
|
|
|
self.assertRaises(isc.datasrc.Error, self.updater.add_rrset,
|
|
|
- self.create_soa(1234))
|
|
|
+ create_soa(1234))
|
|
|
# Add A before SOA
|
|
|
self.updater = self.dsc.get_updater(Name("example.com"), False, True)
|
|
|
- self.updater.delete_rrset(self.create_soa(1234))
|
|
|
+ self.updater.delete_rrset(create_soa(1234))
|
|
|
self.assertRaises(isc.datasrc.Error, self.updater.add_rrset,
|
|
|
self.create_a('192.0.2.1'))
|
|
|
# Commit before add
|
|
|
self.updater = self.dsc.get_updater(Name("example.com"), False, True)
|
|
|
- self.updater.delete_rrset(self.create_soa(1234))
|
|
|
+ self.updater.delete_rrset(create_soa(1234))
|
|
|
self.assertRaises(isc.datasrc.Error, self.updater.commit)
|
|
|
# Delete two SOAs
|
|
|
self.updater = self.dsc.get_updater(Name("example.com"), False, True)
|
|
|
- self.updater.delete_rrset(self.create_soa(1234))
|
|
|
+ self.updater.delete_rrset(create_soa(1234))
|
|
|
self.assertRaises(isc.datasrc.Error, self.updater.delete_rrset,
|
|
|
- self.create_soa(1235))
|
|
|
+ create_soa(1235))
|
|
|
# Add two SOAs
|
|
|
self.updater = self.dsc.get_updater(Name("example.com"), False, True)
|
|
|
- self.updater.delete_rrset(self.create_soa(1234))
|
|
|
- self.updater.add_rrset(self.create_soa(1235))
|
|
|
+ self.updater.delete_rrset(create_soa(1234))
|
|
|
+ self.updater.add_rrset(create_soa(1235))
|
|
|
self.assertRaises(isc.datasrc.Error, self.updater.add_rrset,
|
|
|
- self.create_soa(1236))
|
|
|
+ create_soa(1236))
|
|
|
|
|
|
def test_journal_write_onerase(self):
|
|
|
self.updater = None
|
|
@@ -685,6 +684,101 @@ class JournalWrite(unittest.TestCase):
|
|
|
self.assertRaises(TypeError, dsc.get_updater, Name("example.com"),
|
|
|
1, True)
|
|
|
|
|
|
+class JournalRead(unittest.TestCase):
|
|
|
+ def setUp(self):
|
|
|
+ # Make a fresh copy of the writable database with all original content
|
|
|
+ self.zname = Name('example.com')
|
|
|
+ shutil.copyfile(READ_ZONE_DB_FILE, WRITE_ZONE_DB_FILE)
|
|
|
+ self.dsc = isc.datasrc.DataSourceClient("sqlite3",
|
|
|
+ WRITE_ZONE_DB_CONFIG)
|
|
|
+ self.reader = None
|
|
|
+
|
|
|
+ def tearDown(self):
|
|
|
+ self.dsc = None
|
|
|
+ self.reader = None
|
|
|
+
|
|
|
+ def make_simple_diff(self, begin_soa):
|
|
|
+ updater = self.dsc.get_updater(self.zname, False, True)
|
|
|
+ updater.delete_rrset(begin_soa)
|
|
|
+ updater.add_rrset(create_soa(1235))
|
|
|
+ updater.commit()
|
|
|
+
|
|
|
+ def test_journal_reader(self):
|
|
|
+ # This is a straightforward port of the C++ 'journalReader' test
|
|
|
+ self.make_simple_diff(create_soa(1234))
|
|
|
+ result, self.reader = self.dsc.get_journal_reader(self.zname, 1234,
|
|
|
+ 1235)
|
|
|
+ self.assertEqual(ZoneJournalReader.SUCCESS, result)
|
|
|
+ self.assertNotEqual(None, self.reader)
|
|
|
+ rrsets_equal(create_soa(1234), self.reader.get_next_diff())
|
|
|
+ rrsets_equal(create_soa(1235), self.reader.get_next_diff())
|
|
|
+ self.assertEqual(None, self.reader.get_next_diff())
|
|
|
+ self.assertRaises(ValueError, self.reader.get_next_diff)
|
|
|
+
|
|
|
+ def test_journal_reader_with_large_serial(self):
|
|
|
+ # similar to the previous one, but use a very large serial to check
|
|
|
+ # if the python wrapper code has unexpected integer overflow
|
|
|
+ self.make_simple_diff(create_soa(4294967295))
|
|
|
+ result, self.reader = self.dsc.get_journal_reader(self.zname,
|
|
|
+ 4294967295, 1235)
|
|
|
+ self.assertNotEqual(None, self.reader)
|
|
|
+ # dump to text and compare them in case create_soa happens to have
|
|
|
+ # an overflow bug
|
|
|
+ self.assertEqual('example.org. 3600 IN SOA ns1.example.org. ' + \
|
|
|
+ 'admin.example.org. 4294967295 3600 1800 ' + \
|
|
|
+ '2419200 7200\n',
|
|
|
+ self.reader.get_next_diff().to_text())
|
|
|
+
|
|
|
+ def test_journal_reader_large_journal(self):
|
|
|
+ # This is a straightforward port of the C++ 'readLargeJournal' test.
|
|
|
+ # In this test we use the ZoneJournalReader object as a Python
|
|
|
+ # iterator.
|
|
|
+ updater = self.dsc.get_updater(self.zname, False, True)
|
|
|
+ expected = []
|
|
|
+ for i in range(0, 100):
|
|
|
+ rrset = create_soa(1234 + i)
|
|
|
+ updater.delete_rrset(rrset)
|
|
|
+ expected.append(rrset)
|
|
|
+
|
|
|
+ rrset = create_soa(1234 + i + 1)
|
|
|
+ updater.add_rrset(rrset)
|
|
|
+ expected.append(rrset)
|
|
|
+
|
|
|
+ updater.commit()
|
|
|
+ _, self.reader = self.dsc.get_journal_reader(self.zname, 1234, 1334)
|
|
|
+ self.assertNotEqual(None, self.reader)
|
|
|
+ i = 0
|
|
|
+ for rr in self.reader:
|
|
|
+ self.assertNotEqual(len(expected), i)
|
|
|
+ rrsets_equal(expected[i], rr)
|
|
|
+ i += 1
|
|
|
+ self.assertEqual(len(expected), i)
|
|
|
+
|
|
|
+ def test_journal_reader_no_range(self):
|
|
|
+ # This is a straightforward port of the C++ 'readJournalForNoRange'
|
|
|
+ # test
|
|
|
+ self.make_simple_diff(create_soa(1234))
|
|
|
+ result, self.reader = self.dsc.get_journal_reader(self.zname, 1200,
|
|
|
+ 1235)
|
|
|
+ self.assertEqual(ZoneJournalReader.NO_SUCH_VERSION, result)
|
|
|
+ self.assertEqual(None, self.reader)
|
|
|
+
|
|
|
+ def test_journal_reader_no_zone(self):
|
|
|
+ # This is a straightforward port of the C++ 'journalReaderForNXZone'
|
|
|
+ # test
|
|
|
+ result, self.reader = self.dsc.get_journal_reader(Name('nosuchzone'),
|
|
|
+ 0, 1)
|
|
|
+ self.assertEqual(ZoneJournalReader.NO_SUCH_ZONE, result)
|
|
|
+ self.assertEqual(None, self.reader)
|
|
|
+
|
|
|
+ def test_journal_reader_bad_params(self):
|
|
|
+ self.assertRaises(TypeError, self.dsc.get_journal_reader,
|
|
|
+ 'example.com.', 0, 1)
|
|
|
+ self.assertRaises(TypeError, self.dsc.get_journal_reader,
|
|
|
+ self.zname, 'must be int', 1)
|
|
|
+ self.assertRaises(TypeError, self.dsc.get_journal_reader,
|
|
|
+ self.zname, 0, 'must be int')
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
|
isc.log.init("bind10")
|
|
|
isc.log.resetUnitTestRootLogger()
|