fix: create listener socket with specific IP version (#1557) · python-zeroconf/python-zeroconf@b757ddf

2 files changed

lines changed

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:

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+

)