Skip to content

Commit 728e9d2

Browse files
committed
Add more tests for coverage and preventing regressions.
1 parent 1092c68 commit 728e9d2

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

mocket/socket.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ def sendall(
449449

450450
if response is not None:
451451
address = self._address_key()
452+
# Ensure the address pipe exists before deciding whether to mirror
453+
# response bytes or only publish readiness signals.
454+
self.fileno()
452455
self.io.seek(0)
453456
self._clear_readable_pipe()
454457
self.io.write(response)
@@ -617,6 +620,9 @@ def recv(self, buffersize: int, flags: int | None = None) -> bytes:
617620
Raises:
618621
BlockingIOError: If socket is non-blocking and no data available
619622
"""
623+
if buffersize is None:
624+
buffersize = self._buflen
625+
620626
address = self._address_key()
621627
r_fd, _ = Mocket.get_pair(address)
622628
if r_fd and Mocket.pipe_uses_data(address):

mocket/ssl/socket.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
2828
self._did_handshake: bool = False
2929
self._sent_non_empty_bytes: bool = False
3030
self._has_written: bool = False
31+
self._ssl_pending: bytes = b""
32+
self._ssl_pending_pos: int = 0
3133
self._original_socket: MocketSocket = self
3234

3335
def read(self, buffersize: int | None = None) -> bytes:
@@ -40,7 +42,16 @@ def read(self, buffersize: int | None = None) -> bytes:
4042
Bytes read from the socket
4143
4244
"""
43-
rv = self.io.read(buffersize)
45+
if self._ssl_pending_pos < len(self._ssl_pending):
46+
if buffersize is None:
47+
rv = self._ssl_pending[self._ssl_pending_pos :]
48+
self._ssl_pending_pos = len(self._ssl_pending)
49+
else:
50+
end = self._ssl_pending_pos + buffersize
51+
rv = self._ssl_pending[self._ssl_pending_pos : end]
52+
self._ssl_pending_pos = min(end, len(self._ssl_pending))
53+
else:
54+
rv = b""
4455
if rv:
4556
self._sent_non_empty_bytes = True
4657

@@ -65,7 +76,13 @@ def write(self, data: bytes) -> int | None:
6576
Number of bytes written
6677
"""
6778
self._has_written = self._has_written or bool(data)
68-
return self.send(encode_to_bytes(data))
79+
bytes_sent = self.send(encode_to_bytes(data))
80+
81+
# Keep a private read buffer for SSL protocol consumers so response
82+
# parsing does not depend on shared socket I/O cursor state.
83+
self._ssl_pending = self.io.getvalue()
84+
self._ssl_pending_pos = 0
85+
return bytes_sent
6986

7087
def do_handshake(self) -> None:
7188
"""Perform SSL handshake (mock implementation)."""
@@ -165,5 +182,7 @@ def _create(
165182
ssl_socket._io = sock._io
166183
ssl_socket._entry = sock._entry
167184
ssl_socket._has_written = getattr(sock, "_has_written", False)
185+
ssl_socket._ssl_pending = getattr(sock, "_ssl_pending", b"")
186+
ssl_socket._ssl_pending_pos = getattr(sock, "_ssl_pending_pos", 0)
168187

169188
return ssl_socket

0 commit comments

Comments
 (0)