Skip to content

Commit 119d3b8

Browse files
Copilotmindflayer
andauthored
Fix setsockopt signature to match standard socket API (#319)
* Initial plan * Fix setsockopt signature to match standard socket API Co-authored-by: mindflayer <527325+mindflayer@users.noreply.github.com> * Add tests for setsockopt with and without optlen Co-authored-by: mindflayer <527325+mindflayer@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mindflayer <527325+mindflayer@users.noreply.github.com>
1 parent b74910a commit 119d3b8

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

mocket/socket.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,20 +225,26 @@ def gettimeout(self) -> float | None:
225225
"""
226226
return self._timeout
227227

228-
def setsockopt(self, family: int, type: int, proto: int) -> None:
229-
"""Set socket options.
228+
def setsockopt(
229+
self,
230+
level: int,
231+
optname: int,
232+
value: int | bytes | None,
233+
optlen: int | None = None,
234+
) -> None:
235+
"""Set socket option.
230236
231237
Args:
232-
family: Address family
233-
type: Socket type
234-
proto: Protocol number
238+
level: Socket option level (e.g., socket.SOL_SOCKET)
239+
optname: Socket option name (e.g., socket.SO_REUSEADDR)
240+
value: Option value as an integer or bytes, or None when optlen is provided
241+
optlen: Option length (used when value is None)
235242
"""
236-
self._family = family
237-
self._type = type
238-
self._proto = proto
239-
240243
if self._true_socket:
241-
self._true_socket.setsockopt(family, type, proto)
244+
if optlen is not None:
245+
self._true_socket.setsockopt(level, optname, value, optlen)
246+
else:
247+
self._true_socket.setsockopt(level, optname, value)
242248

243249
def settimeout(self, timeout: float | None) -> None:
244250
"""Set the socket timeout.

tests/test_socket.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import socket
2+
import struct
3+
from unittest.mock import MagicMock
24

35
import pytest
46

@@ -126,3 +128,22 @@ def test_recvfrom_into():
126128
assert nbytes == len(test_data)
127129
assert buf[:nbytes] == test_data
128130
assert addr == sock._address
131+
132+
133+
def test_setsockopt_without_optlen():
134+
sock = MocketSocket(socket.AF_INET, socket.SOCK_STREAM)
135+
sock._true_socket = MagicMock()
136+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
137+
sock._true_socket.setsockopt.assert_called_once_with(
138+
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1
139+
)
140+
141+
142+
def test_setsockopt_with_optlen():
143+
sock = MocketSocket(socket.AF_INET, socket.SOCK_STREAM)
144+
sock._true_socket = MagicMock()
145+
linger_value = struct.pack("ii", 1, 5)
146+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, linger_value, len(linger_value))
147+
sock._true_socket.setsockopt.assert_called_once_with(
148+
socket.SOL_SOCKET, socket.SO_LINGER, linger_value, len(linger_value)
149+
)

0 commit comments

Comments
 (0)