summaryrefslogtreecommitdiff
path: root/tests/test_resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_resolver.py')
-rw-r--r--tests/test_resolver.py75
1 files changed, 74 insertions, 1 deletions
diff --git a/tests/test_resolver.py b/tests/test_resolver.py
index d151485..b2a47d2 100644
--- a/tests/test_resolver.py
+++ b/tests/test_resolver.py
@@ -947,9 +947,41 @@ class AlwaysType3NXDOMAINNanoNameserver(Server):
response.flags |= dns.flags.RA
return response
+
+class AlwaysNXDOMAINNanoNameserver(Server):
+
+ def handle(self, request):
+ response = dns.message.make_response(request.message)
+ response.set_rcode(dns.rcode.NXDOMAIN)
+ response.flags |= dns.flags.RA
+ origin = dns.name.from_text('example.')
+ soa_rrset = response.find_rrset(response.authority, origin,
+ dns.rdataclass.IN, dns.rdatatype.SOA,
+ create=True)
+ rdata = dns.rdata.from_text('IN', 'SOA',
+ 'ns.example. root.example. 1 2 3 4 5')
+ soa_rrset.add(rdata)
+ soa_rrset.update_ttl(300)
+ return response
+
+class AlwaysNoErrorNoDataNanoNameserver(Server):
+
+ def handle(self, request):
+ response = dns.message.make_response(request.message)
+ response.set_rcode(dns.rcode.NOERROR)
+ response.flags |= dns.flags.RA
+ origin = dns.name.from_text('example.')
+ soa_rrset = response.find_rrset(response.authority, origin,
+ dns.rdataclass.IN, dns.rdatatype.SOA,
+ create=True)
+ rdata = dns.rdata.from_text('IN', 'SOA',
+ 'ns.example. root.example. 1 2 3 4 5')
+ soa_rrset.add(rdata)
+ soa_rrset.update_ttl(300)
+ return response
@unittest.skipIf(not (_network_available and _nanonameserver_available),
"Internet and NanoAuth required")
-class ZoneForNameNoParentTest(unittest.TestCase):
+class ZoneForNameTests(unittest.TestCase):
def testNoRootSOA(self):
with AlwaysType3NXDOMAINNanoNameserver() as na:
@@ -959,6 +991,25 @@ class ZoneForNameNoParentTest(unittest.TestCase):
with self.assertRaises(dns.resolver.NoRootSOA):
dns.resolver.zone_for_name('www.foo.bar.', resolver=res)
+ def testHelpfulNXDOMAIN(self):
+ with AlwaysNXDOMAINNanoNameserver() as na:
+ res = dns.resolver.Resolver(configure=False)
+ res.port = na.udp_address[1]
+ res.nameservers = [na.udp_address[0]]
+ expected = dns.name.from_text('example.')
+ name = dns.resolver.zone_for_name('1.2.3.4.5.6.7.8.9.10.example.',
+ resolver=res)
+ self.assertEqual(name, expected)
+
+ def testHelpfulNoErrorNoData(self):
+ with AlwaysNoErrorNoDataNanoNameserver() as na:
+ res = dns.resolver.Resolver(configure=False)
+ res.port = na.udp_address[1]
+ res.nameservers = [na.udp_address[0]]
+ expected = dns.name.from_text('example.')
+ name = dns.resolver.zone_for_name('1.2.3.4.5.6.7.8.9.10.example.',
+ resolver=res)
+ self.assertEqual(name, expected)
class DroppingNanoNameserver(Server):
@@ -1019,3 +1070,25 @@ def testResolverNoNameservers():
assert not error[1] # not TCP
assert error[2] == na.udp_address[1] # port
assert error[3] == 'FORMERR'
+
+
+class SlowAlwaysType3NXDOMAINNanoNameserver(Server):
+
+ def handle(self, request):
+ response = dns.message.make_response(request.message)
+ response.set_rcode(dns.rcode.NXDOMAIN)
+ response.flags |= dns.flags.RA
+ time.sleep(0.2)
+ return response
+
+
+@pytest.mark.skipif(not (_network_available and _nanonameserver_available),
+ reason="Internet and NanoAuth required")
+def testZoneForNameLifetimeTimeout():
+ with SlowAlwaysType3NXDOMAINNanoNameserver() as na:
+ res = dns.resolver.Resolver(configure=False)
+ res.port = na.udp_address[1]
+ res.nameservers = [na.udp_address[0]]
+ with pytest.raises(dns.resolver.LifetimeTimeout):
+ dns.resolver.zone_for_name('1.2.3.4.5.6.7.8.9.10.example.',
+ resolver=res, lifetime=1.0)