@@ -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