feat: speed up instances only used to lookup answers (#1307) · python-zeroconf/python-zeroconf@0701b8a
@@ -12,12 +12,10 @@
1212import time
1313import unittest
1414import unittest.mock
15-from typing import cast
16-from unittest.mock import patch
15+from typing import Tuple, Union, cast
16+from unittest.mock import Mock, patch
17171818if sys.version_info[:3][1] < 8:
19-from unittest.mock import Mock
20-2119AsyncMock = Mock
2220else:
2321from unittest.mock import AsyncMock
@@ -26,6 +24,8 @@
26242725import zeroconf as r
2826from zeroconf import NotRunningException, Zeroconf, const, current_time_millis
27+from zeroconf._listener import AsyncListener, _WrappedTransport
28+from zeroconf._protocol.incoming import DNSIncoming
2929from zeroconf.asyncio import AsyncZeroconf
30303131from . import _clear_cache, _inject_response, _wait_for_start, has_working_ipv6
@@ -45,10 +45,19 @@ def teardown_module():
4545log.setLevel(original_logging_level)
4646474748-def threadsafe_query(zc, protocol, *args):
48+def threadsafe_query(
49+zc: 'Zeroconf',
50+protocol: 'AsyncListener',
51+msg: DNSIncoming,
52+addr: str,
53+port: int,
54+transport: _WrappedTransport,
55+v6_flow_scope: Union[Tuple[()], Tuple[int, int]],
56+) -> None:
4957async def make_query():
50-protocol.handle_query_or_defer(*args)
58+protocol.handle_query_or_defer(msg, addr, port, transport, v6_flow_scope)
515960+assert zc.loop is not None
5261asyncio.run_coroutine_threadsafe(make_query(), zc.loop).result()
53625463@@ -476,28 +485,28 @@ def test_tc_bit_defers():
476485477486next_packet = r.DNSIncoming(packets.pop(0))
478487expected_deferred.append(next_packet)
479-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
488+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
480489assert protocol._deferred[source_ip] == expected_deferred
481490assert source_ip in protocol._timers
482491483492next_packet = r.DNSIncoming(packets.pop(0))
484493expected_deferred.append(next_packet)
485-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
494+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
486495assert protocol._deferred[source_ip] == expected_deferred
487496assert source_ip in protocol._timers
488-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
497+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
489498assert protocol._deferred[source_ip] == expected_deferred
490499assert source_ip in protocol._timers
491500492501next_packet = r.DNSIncoming(packets.pop(0))
493502expected_deferred.append(next_packet)
494-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
503+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
495504assert protocol._deferred[source_ip] == expected_deferred
496505assert source_ip in protocol._timers
497506498507next_packet = r.DNSIncoming(packets.pop(0))
499508expected_deferred.append(next_packet)
500-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
509+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
501510assert source_ip not in protocol._deferred
502511assert source_ip not in protocol._timers
503512@@ -555,20 +564,20 @@ def test_tc_bit_defers_last_response_missing():
555564556565next_packet = r.DNSIncoming(packets.pop(0))
557566expected_deferred.append(next_packet)
558-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
567+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
559568assert protocol._deferred[source_ip] == expected_deferred
560569timer1 = protocol._timers[source_ip]
561570562571next_packet = r.DNSIncoming(packets.pop(0))
563572expected_deferred.append(next_packet)
564-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
573+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
565574assert protocol._deferred[source_ip] == expected_deferred
566575timer2 = protocol._timers[source_ip]
567576assert timer1.cancelled()
568577assert timer2 != timer1
569578570579# Send the same packet again to similar multi interfaces
571-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
580+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
572581assert protocol._deferred[source_ip] == expected_deferred
573582assert source_ip in protocol._timers
574583timer3 = protocol._timers[source_ip]
@@ -577,7 +586,7 @@ def test_tc_bit_defers_last_response_missing():
577586578587next_packet = r.DNSIncoming(packets.pop(0))
579588expected_deferred.append(next_packet)
580-threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, None)
589+threadsafe_query(zc, protocol, next_packet, source_ip, const._MDNS_PORT, Mock(), ())
581590assert protocol._deferred[source_ip] == expected_deferred
582591assert source_ip in protocol._timers
583592timer4 = protocol._timers[source_ip]