| @@ -102,6 +102,49 @@ class TestProxy(unittest.TestCase): | |||||
| self.assertEqual(cm.exception.args[0], 5) | self.assertEqual(cm.exception.args[0], 5) | ||||
| @async_test | |||||
| async def test_many_of_responses_with_small_socket_buffer(self): | |||||
| resolve, clear_cache = get_resolver(53) | |||||
| self.add_async_cleanup(clear_cache) | |||||
| def get_small_socket(): | |||||
| sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) | |||||
| sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2000) | |||||
| sock.setblocking(False) | |||||
| sock.bind(('', 53)) | |||||
| return sock | |||||
| def get_fixed_resolver(): | |||||
| async def get_host(_, fqdn, qtype): | |||||
| hosts = { | |||||
| b'www.google.com': { | |||||
| TYPES.A: IPv4AddressExpiresAt('1.2.3.4', expires_at=0), | |||||
| }, | |||||
| } | |||||
| try: | |||||
| return hosts[fqdn.lower()][qtype] | |||||
| except KeyError: | |||||
| print('NONE!') | |||||
| return None | |||||
| return Resolver(get_host=get_host) | |||||
| start = DnsProxy(rules=((r'(^.*$)', r'\1'),), get_socket=get_small_socket, | |||||
| get_resolver=get_fixed_resolver) | |||||
| stop = await start() | |||||
| self.add_async_cleanup(stop) | |||||
| tasks = [ | |||||
| asyncio.create_task(resolve('www.google.com', TYPES.A)) | |||||
| for _ in range(0, 100000) | |||||
| ] | |||||
| responses = [] | |||||
| for task in tasks: | |||||
| responses.append(await task) | |||||
| self.assertEqual(str(responses[0][0]), '1.2.3.4') | |||||
| def get_socket(port): | def get_socket(port): | ||||
| def _get_socket(): | def _get_socket(): | ||||