Skip to content

Commit b757ddf

Browse files
authored
fix: create listener socket with specific IP version (#1557)
* fix: create listener socket with specific IP version Create listener sockets when using unicast with specific IP version as well, just like in `new_respond_socket()`. * chore(tests): add unit test for socket creation with unicast addressing
1 parent 54eb383 commit b757ddf

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

src/zeroconf/_utils/net.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,11 +421,12 @@ def create_sockets(
421421
else:
422422
respond_socket = None
423423
else:
424+
is_v6 = isinstance(i, tuple)
424425
respond_socket = new_socket(
425426
port=0,
426-
ip_version=ip_version,
427+
ip_version=IPVersion.V6Only if is_v6 else IPVersion.V4Only,
427428
apple_p2p=apple_p2p,
428-
bind_addr=i[0] if isinstance(i, tuple) else (i,),
429+
bind_addr=cast(tuple[tuple[str, int, int], int], i)[0] if is_v6 else (cast(str, i),),
429430
)
430431

431432
if respond_socket is not None:

tests/utils/test_net.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,35 @@ def test_new_respond_socket_new_socket_returns_none():
298298
"""Test new_respond_socket returns None if new_socket returns None."""
299299
with patch.object(netutils, "new_socket", return_value=None):
300300
assert netutils.new_respond_socket(("0.0.0.0", 0)) is None # type: ignore[arg-type]
301+
302+
303+
def test_create_sockets():
304+
"""Test create_sockets with unicast and IPv4."""
305+
306+
with (
307+
patch("zeroconf._utils.net.new_socket") as mock_new_socket,
308+
patch(
309+
"zeroconf._utils.net.ifaddr.get_adapters",
310+
return_value=_generate_mock_adapters(),
311+
),
312+
):
313+
mock_socket = Mock(spec=socket.socket)
314+
mock_new_socket.return_value = mock_socket
315+
316+
listen_socket, respond_sockets = r.create_sockets(
317+
interfaces=r.InterfaceChoice.All, unicast=True, ip_version=r.IPVersion.All
318+
)
319+
320+
assert listen_socket is None
321+
mock_new_socket.assert_any_call(
322+
port=0,
323+
ip_version=r.IPVersion.V6Only,
324+
apple_p2p=False,
325+
bind_addr=("2001:db8::", 1, 1),
326+
)
327+
mock_new_socket.assert_any_call(
328+
port=0,
329+
ip_version=r.IPVersion.V4Only,
330+
apple_p2p=False,
331+
bind_addr=("192.168.1.5",),
332+
)

0 commit comments

Comments
 (0)