feat: speed up instances only used to lookup answers (#1307) · python-zeroconf/python-zeroconf@0701b8a

@@ -12,12 +12,10 @@

1212

import time

1313

import unittest

1414

import 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

17171818

if sys.version_info[:3][1] < 8:

19-

from unittest.mock import Mock

20-2119

AsyncMock = Mock

2220

else:

2321

from unittest.mock import AsyncMock

@@ -26,6 +24,8 @@

26242725

import zeroconf as r

2826

from zeroconf import NotRunningException, Zeroconf, const, current_time_millis

27+

from zeroconf._listener import AsyncListener, _WrappedTransport

28+

from zeroconf._protocol.incoming import DNSIncoming

2929

from zeroconf.asyncio import AsyncZeroconf

30303131

from . import _clear_cache, _inject_response, _wait_for_start, has_working_ipv6

@@ -45,10 +45,19 @@ def teardown_module():

4545

log.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:

4957

async 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

5261

asyncio.run_coroutine_threadsafe(make_query(), zc.loop).result()

53625463

@@ -476,28 +485,28 @@ def test_tc_bit_defers():

476485477486

next_packet = r.DNSIncoming(packets.pop(0))

478487

expected_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(), ())

480489

assert protocol._deferred[source_ip] == expected_deferred

481490

assert source_ip in protocol._timers

482491483492

next_packet = r.DNSIncoming(packets.pop(0))

484493

expected_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(), ())

486495

assert protocol._deferred[source_ip] == expected_deferred

487496

assert 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(), ())

489498

assert protocol._deferred[source_ip] == expected_deferred

490499

assert source_ip in protocol._timers

491500492501

next_packet = r.DNSIncoming(packets.pop(0))

493502

expected_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(), ())

495504

assert protocol._deferred[source_ip] == expected_deferred

496505

assert source_ip in protocol._timers

497506498507

next_packet = r.DNSIncoming(packets.pop(0))

499508

expected_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(), ())

501510

assert source_ip not in protocol._deferred

502511

assert source_ip not in protocol._timers

503512

@@ -555,20 +564,20 @@ def test_tc_bit_defers_last_response_missing():

555564556565

next_packet = r.DNSIncoming(packets.pop(0))

557566

expected_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(), ())

559568

assert protocol._deferred[source_ip] == expected_deferred

560569

timer1 = protocol._timers[source_ip]

561570562571

next_packet = r.DNSIncoming(packets.pop(0))

563572

expected_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(), ())

565574

assert protocol._deferred[source_ip] == expected_deferred

566575

timer2 = protocol._timers[source_ip]

567576

assert timer1.cancelled()

568577

assert 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(), ())

572581

assert protocol._deferred[source_ip] == expected_deferred

573582

assert source_ip in protocol._timers

574583

timer3 = protocol._timers[source_ip]

@@ -577,7 +586,7 @@ def test_tc_bit_defers_last_response_missing():

577586578587

next_packet = r.DNSIncoming(packets.pop(0))

579588

expected_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(), ())

581590

assert protocol._deferred[source_ip] == expected_deferred

582591

assert source_ip in protocol._timers

583592

timer4 = protocol._timers[source_ip]