summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Wellington <bwelling@xbill.org>2020-03-18 14:56:58 -0700
committerBrian Wellington <bwelling@xbill.org>2020-03-18 14:57:29 -0700
commit41ca1be22dad341709a3856f34fe63aa46da1d1b (patch)
tree596023cb268a72eaa402fb4e2d6d622cabce25ab
parente6798e58b4555740db4cfb43c8b9ce0d7d3416f1 (diff)
downloaddnspython-41ca1be22dad341709a3856f34fe63aa46da1d1b.tar.gz
Remove choose_relativity() from zone.from_xfr()
The comment states that relativize must be consistent between dns.query.xfr() and dns.zone.from_xfr(), and the code fails if they're not (if check_origin is True, at least). This means that the rdata is already correctly relativized (or not). This also adds a test of creating zones from xfrs, both relativized and not.
-rw-r--r--dns/zone.py1
-rw-r--r--tests/test_zone.py33
2 files changed, 33 insertions, 1 deletions
diff --git a/dns/zone.py b/dns/zone.py
index 542ec7e..0da4d89 100644
--- a/dns/zone.py
+++ b/dns/zone.py
@@ -1117,7 +1117,6 @@ def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True):
rrset.covers, True)
zrds.update_ttl(rrset.ttl)
for rd in rrset:
- rd.choose_relativity(z.origin, relativize)
zrds.add(rd)
if check_origin:
z.check_origin()
diff --git a/tests/test_zone.py b/tests/test_zone.py
index 0fae704..7e4a4d8 100644
--- a/tests/test_zone.py
+++ b/tests/test_zone.py
@@ -22,6 +22,7 @@ import unittest
from typing import cast
import dns.exception
+import dns.message
import dns.rdata
import dns.rdataset
import dns.rdataclass
@@ -135,6 +136,29 @@ _keep_output = True
def _rdata_sort(a):
return (a[0], a[2].rdclass, a[2].to_text())
+def add_rdataset(msg, name, rds):
+ rrset = msg.get_rrset(msg.answer, name, rds.rdclass, rds.rdtype,
+ create=True, force_unique=True)
+ for rd in rds:
+ rrset.add(rd, ttl=rds.ttl)
+
+def make_xfr(zone):
+ q = dns.message.make_query(zone.origin, 'AXFR')
+ msg = dns.message.make_response(q)
+ if zone.relativize:
+ msg.origin = zone.origin
+ soa_name = dns.name.empty
+ else:
+ soa_name = zone.origin
+ soa = zone.find_rdataset(soa_name, 'SOA')
+ add_rdataset(msg, soa_name, soa)
+ for (name, rds) in zone.iterate_rdatasets():
+ if rds.rdtype == dns.rdatatype.SOA:
+ continue
+ add_rdataset(msg, name, rds)
+ add_rdataset(msg, soa_name, soa)
+ return [msg]
+
class ZoneTestCase(unittest.TestCase):
def testFromFile1(self): # type: () -> None
@@ -544,5 +568,14 @@ class ZoneTestCase(unittest.TestCase):
def testZoneOriginNone(self): # type: () -> None
dns.zone.Zone(cast(str, None))
+ def testZoneFromXFR(self): # type: () -> None
+ z1_abs = dns.zone.from_text(example_text, 'example.', relativize=False)
+ z2_abs = dns.zone.from_xfr(make_xfr(z1_abs), relativize=False)
+ self.assertEqual(z1_abs, z2_abs)
+
+ z1_rel = dns.zone.from_text(example_text, 'example.', relativize=True)
+ z2_rel = dns.zone.from_xfr(make_xfr(z1_rel), relativize=True)
+ self.assertEqual(z1_rel, z2_rel)
+
if __name__ == '__main__':
unittest.main()