Wrap default `Server.listen_on()` addrs
Normalize implicit listener declarations through `wrap_address()`, just like caller-supplied addrs. Tagged defaults otherwise reach endpoint reflection as plain tuples and fail before socket startup. Add a TCP/UDS regression which omits `accept_addrs` and proves each generated ep holds the expected concrete `Address`. (this patch was generated in some part by `opencode` using `gpt-5.6-sol` (`openai`))wkt/addr_unpacking
parent
0d95a9e63c
commit
ca436aa9ec
|
|
@ -20,6 +20,7 @@ from tractor import (
|
||||||
from tractor._testing.addr import (
|
from tractor._testing.addr import (
|
||||||
get_rando_addr,
|
get_rando_addr,
|
||||||
)
|
)
|
||||||
|
from tractor.discovery import _addr
|
||||||
from tractor._exceptions import TransportClosed
|
from tractor._exceptions import TransportClosed
|
||||||
from tractor.ipc._chan import Channel
|
from tractor.ipc._chan import Channel
|
||||||
from tractor.ipc import _server
|
from tractor.ipc import _server
|
||||||
|
|
@ -240,3 +241,51 @@ def test_basic_ipc_server(
|
||||||
pdb=debug_mode,
|
pdb=debug_mode,
|
||||||
):
|
):
|
||||||
trio.run(main)
|
trio.run(main)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'_tpt_proto',
|
||||||
|
['uds', 'tcp']
|
||||||
|
)
|
||||||
|
def test_default_ipc_server_addr_is_wrapped(
|
||||||
|
_tpt_proto: str,
|
||||||
|
debug_mode: bool,
|
||||||
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
|
):
|
||||||
|
'''
|
||||||
|
Wrap the default listener declaration before endpoint startup.
|
||||||
|
|
||||||
|
Tagged address emission changed `default_lo_addrs()` from legacy
|
||||||
|
socket pairs to protocol-tagged tuples. The no-argument
|
||||||
|
`Server.listen_on()` path passed that tuple directly to
|
||||||
|
`_serve_ipc_eps()`, where endpoint reflection requires a concrete
|
||||||
|
`Address`. Supply a collision-free default declaration, omit
|
||||||
|
`accept_addrs`, and prove listener startup receives the same
|
||||||
|
wrapped address type for both transport backends.
|
||||||
|
|
||||||
|
'''
|
||||||
|
default_addr: tuple = get_rando_addr(
|
||||||
|
tpt_proto=_tpt_proto,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
_addr,
|
||||||
|
'default_lo_addrs',
|
||||||
|
lambda _transports: [default_addr],
|
||||||
|
)
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
async with ipc._server.open_ipc_server() as server:
|
||||||
|
eps = await server.listen_on()
|
||||||
|
assert len(eps) == 1
|
||||||
|
|
||||||
|
endpoint = eps[0]
|
||||||
|
expected_addr = _addr.wrap_address(default_addr)
|
||||||
|
assert type(endpoint.addr) is type(expected_addr)
|
||||||
|
assert endpoint.addr.unwrap() == expected_addr.unwrap()
|
||||||
|
|
||||||
|
server._parent_tn.cancel_scope.cancel()
|
||||||
|
|
||||||
|
with devx.maybe_open_crash_handler(
|
||||||
|
pdb=debug_mode,
|
||||||
|
):
|
||||||
|
trio.run(main)
|
||||||
|
|
|
||||||
|
|
@ -989,10 +989,10 @@ class Server(Struct):
|
||||||
_state._def_tpt_proto
|
_state._def_tpt_proto
|
||||||
])
|
])
|
||||||
|
|
||||||
else:
|
accept_addrs = [
|
||||||
accept_addrs: list[Address] = [
|
wrap_address(addr)
|
||||||
wrap_address(a) for a in accept_addrs
|
for addr in accept_addrs
|
||||||
]
|
]
|
||||||
|
|
||||||
if self._shutdown is None:
|
if self._shutdown is None:
|
||||||
self._shutdown = trio.Event()
|
self._shutdown = trio.Event()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue