Skip to content

Commit 8669d21

Browse files
committed
Make ssl test work on Linux
1 parent f88ae92 commit 8669d21

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

Lib/test/test_asyncio/test_ssl.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ def server(sock):
14971497
except ssl.SSLZeroReturnError:
14981498
break
14991499

1500-
self.assertEqual(data_len, CHUNK * SIZE)
1500+
self.assertEqual(data_len, CHUNK * SIZE*2)
15011501

15021502
# verify that close_notify is received
15031503
sslobj.unwrap()
@@ -1533,7 +1533,7 @@ async def client(addr):
15331533
self.assertEqual(data, b'pong')
15341534

15351535
# fill write backlog in a hacky way - renegotiation won't help
1536-
for _ in range(SIZE):
1536+
for _ in range(SIZE*2):
15371537
writer.transport._test__append_write_backlog(b'x' * CHUNK)
15381538

15391539
try:
@@ -1543,21 +1543,33 @@ async def client(addr):
15431543
pass
15441544

15451545
# Make sure _SelectorSocketTransport enters the delayed write
1546-
# path in its `write` method by setting the socket buffer to small value,
1547-
# so that `socket.send` does not consume all the data.
1546+
# path in its `write` method by wrapping socket in a fake class
1547+
# that acts as if there is not enough space in socket buffer.
15481548
# This triggers bug gh-115514, also tested using mocks in
15491549
# test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_buffer_after_close
15501550
socket_transport = writer.transport._ssl_protocol._transport
15511551

1552-
def _shrink_sock_buffer(data):
1553-
if socket_transport._read_ready_cb is None:
1554-
socket_transport.get_extra_info("socket").setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1)
1552+
class SocketWrapper:
1553+
def __init__(self, sock) -> None:
1554+
self.sock = sock
1555+
1556+
def __getattr__(self, name):
1557+
return getattr(self.sock, name)
1558+
1559+
def send(self, data):
1560+
# Fake that our write buffer is full, send only half
1561+
to_send = len(data)//2
1562+
return self.sock.send(data[:to_send])
1563+
1564+
def _fake_full_write_buffer(data):
1565+
if socket_transport._read_ready_cb is None and not isinstance(socket_transport._sock, SocketWrapper):
1566+
socket_transport._sock = SocketWrapper(socket_transport._sock)
15551567
return unittest.mock.DEFAULT
15561568

15571569
with unittest.mock.patch.object(
15581570
socket_transport, "write",
15591571
wraps=socket_transport.write,
1560-
side_effect=_shrink_sock_buffer
1572+
side_effect=_fake_full_write_buffer
15611573
):
15621574
await future
15631575

0 commit comments

Comments
 (0)