try:
af = dns.inet.af_for_address(self._address)
backend = dns.asyncbackend.get_backend("asyncio")
+ # Note that peer is a low-level address tuple, but make_socket() wants
+ # a high-level address tuple, so we convert.
self._socket = await backend.make_socket(
- af, socket.SOCK_DGRAM, 0, self._source, self._peer
+ af, socket.SOCK_DGRAM, 0, self._source, (self._peer[0], self._peer[1])
)
self._socket_created.set()
async with self._socket:
self._manager.closed(self._peer[0], self._peer[1])
self._closed = True
self._connection.close()
+ if not self._socket_created.is_set():
+ # sender might be blocked on this, so set it
+ self._socket_created.set()
async with self._wake_timer:
self._wake_timer.notify_all()
try:
import dns.asyncquery
import dns.message
import dns.rcode
-
from tests.util import here
have_quic = True
return struct.pack("!H", len(wire)) + wire
class Server(threading.Thread):
- def __init__(self):
+ def __init__(self, address="127.0.0.1"):
super().__init__()
+ self.address = address
self.transport = None
self.protocol = None
self.left = None
self.left, self.right = socket.socketpair()
self.start()
self.ready.wait(4)
+ return self
def __exit__(self, ex_ty, ex_va, ex_tr):
if self.protocol is not None:
lambda: aioquic.asyncio.server.QuicServer(
configuration=conf, create_protocol=NanoQuic
),
- local_addr=("127.0.0.1", 8853),
+ local_addr=(self.address, 8853),
)
self.ready.set()
try:
import dns.query
import dns.rcode
-from .util import here
+from .util import have_ipv4, have_ipv6, here
try:
from .nanoquic import Server
pass
+addresses = []
+if have_ipv4():
+ addresses.append("127.0.0.1")
+if have_ipv6():
+ addresses.append("::1")
+if len(addresses) == 0:
+ # no networking
+ _nanoquic_available = False
+
+
@pytest.mark.skipif(not _nanoquic_available, reason="requires aioquic")
def test_basic_sync():
- with Server() as server:
- q = dns.message.make_query("www.example.", "A")
- r = dns.query.quic(q, "127.0.0.1", port=8853, verify=here("tls/ca.crt"))
- assert r.rcode() == dns.rcode.REFUSED
+ q = dns.message.make_query("www.example.", "A")
+ for address in addresses:
+ with Server(address) as server:
+ r = dns.query.quic(q, address, port=8853, verify=here("tls/ca.crt"))
+ assert r.rcode() == dns.rcode.REFUSED
-async def amain():
+async def amain(address):
q = dns.message.make_query("www.example.", "A")
- r = await dns.asyncquery.quic(q, "127.0.0.1", port=8853, verify=here("tls/ca.crt"))
+ r = await dns.asyncquery.quic(q, address, port=8853, verify=here("tls/ca.crt"))
assert r.rcode() == dns.rcode.REFUSED
@pytest.mark.skipif(not _nanoquic_available, reason="requires aioquic")
def test_basic_asyncio():
dns.asyncbackend.set_default_backend("asyncio")
- with Server() as server:
- asyncio.run(amain())
+ for address in addresses:
+ with Server(address) as server:
+ asyncio.run(amain(address))
try:
@pytest.mark.skipif(not _nanoquic_available, reason="requires aioquic")
def test_basic_trio():
dns.asyncbackend.set_default_backend("trio")
- with Server() as server:
- trio.run(amain)
+ for address in addresses:
+ with Server(address) as server:
+ trio.run(amain, address)
except ImportError:
pass