diff --git a/test.py b/test.py index 211735b..37b2ff3 100644 --- a/test.py +++ b/test.py @@ -7,6 +7,7 @@ import unittest from aiodnsresolver import ( RESPONSE, + QUESTION, TYPES, DnsRecordDoesNotExist, DnsResponseCode, @@ -124,7 +125,7 @@ class TestProxy(unittest.TestCase): self.assertEqual(cm.exception.args[0], 5) @async_test - async def test_many_responses_with_small_socket_buffer(self): + async def test_many_responses_with_small_socket_buffer_no_onward_query(self): resolve, clear_cache = get_resolver(53) self.add_async_cleanup(clear_cache) @@ -146,6 +147,53 @@ class TestProxy(unittest.TestCase): bing_responses = await resolve('www.bing.com', TYPES.A) self.assertEqual(type(bing_responses[0]), IPv4AddressExpiresAt) + @async_test + async def test_many_responses_with_small_socket_buffer_onward_query(self): + start = DnsProxy(rules=((r'(^.*$)', r'\1'),), get_socket=get_small_socket) + stop = await start() + self.add_async_cleanup(stop) + + async def resolve(domain): + resolve, clear_cache = get_resolver(53) + result = await resolve(domain, TYPES.A) + await clear_cache() + return result + + tasks = [ + asyncio.create_task(resolve('www.google.com')) + for _ in range(0, 1000) + ] + + responses = await asyncio.gather(*tasks) + + for response in responses: + self.assertEqual(type(response[0]), IPv4AddressExpiresAt) + + bing_responses = await resolve('www.bing.com') + self.assertEqual(type(bing_responses[0]), IPv4AddressExpiresAt) + + @async_test + async def test_many_responses_with_regular_socket_buffer_onward_query(self): + resolve, clear_cache = get_resolver(53) + self.add_async_cleanup(clear_cache) + + start = DnsProxy(rules=((r'(^.*$)', r'\1'),)) + stop = await start() + self.add_async_cleanup(stop) + + tasks = [ + asyncio.create_task(resolve('www.google.com', TYPES.A)) + for _ in range(0, 100000) + ] + + responses = await asyncio.gather(*tasks) + + for response in responses: + self.assertEqual(type(response[0]), IPv4AddressExpiresAt) + + bing_responses = await resolve('www.bing.com', TYPES.A) + self.assertEqual(type(bing_responses[0]), IPv4AddressExpiresAt) + @async_test async def test_proxy_returns_error_from_upstream(self): rcode = 4 @@ -229,6 +277,33 @@ class TestProxy(unittest.TestCase): for response in responses: self.assertEqual(type(response[0]), IPv4AddressExpiresAt) + @async_test + async def test_sending_lots_of_good_messages_not_affect_later_queries(self): + resolve, clear_cache = get_resolver(53) + self.add_async_cleanup(clear_cache) + + start = DnsProxy(rules=((r'(^.*$)', r'\1'),)) + stop = await start() + self.add_async_cleanup(stop) + + response = await resolve('www.google.com', TYPES.A) + self.assertEqual(type(response[0]), IPv4AddressExpiresAt) + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + for i in range(0, 100000): + name = b'doesnotexist' + str(i).encode('ascii') + b'.charemza.name' + question_record = QuestionRecord(name, TYPES.A, qclass=1) + question = Message( + qid=i % 65535, qr=QUESTION, opcode=0, aa=0, tc=0, rd=0, ra=1, z=0, rcode=0, + qd=(question_record,), an=(), ns=(), ar=(), + ) + sock.sendto(pack(question), ('127.0.0.1', 53)) + sock.close() + + response = await resolve('www.google.com', TYPES.A) + self.assertEqual(type(response[0]), IPv4AddressExpiresAt) + @async_test async def test_sending_pointer_loop_not_affect_later_queries_c(self): resolve, clear_cache = get_resolver(53) @@ -352,7 +427,7 @@ def get_small_socket(): return sock -def get_resolver(port, timeout=0.5): +def get_resolver(port, timeout=2.0): async def get_nameservers(_, __): for _ in range(0, 5): yield (timeout, ('127.0.0.1', port))