@@ -819,6 +819,48 @@ async def client(addr):
819819 self .assertEqual (msg1 , b"hello world 1!\n " )
820820 self .assertEqual (msg2 , b"hello world 2!\n " )
821821
822+ @unittest .skipIf (ssl is None , 'No ssl module' )
823+ def test_start_tls_buffered_data (self ):
824+ # gh-142352: test start_tls() with buffered data
825+
826+ async def server_handler (client_reader , client_writer ):
827+ # Wait for TLS ClientHello to be buffered before start_tls().
828+ await client_reader ._wait_for_data ('test_start_tls_buffered_data' ),
829+ self .assertTrue (client_reader ._buffer )
830+ await client_writer .start_tls (test_utils .simple_server_sslcontext ())
831+
832+ line = await client_reader .readline ()
833+ self .assertEqual (line , b"ping\n " )
834+ client_writer .write (b"pong\n " )
835+ await client_writer .drain ()
836+ client_writer .close ()
837+ await client_writer .wait_closed ()
838+
839+ async def client (addr ):
840+ reader , writer = await asyncio .open_connection (* addr )
841+ await writer .start_tls (test_utils .simple_client_sslcontext ())
842+
843+ writer .write (b"ping\n " )
844+ await writer .drain ()
845+ line = await reader .readline ()
846+ self .assertEqual (line , b"pong\n " )
847+ writer .close ()
848+ await writer .wait_closed ()
849+
850+ async def run_test ():
851+ server = await asyncio .start_server (
852+ server_handler , socket_helper .HOSTv4 , 0 )
853+ server_addr = server .sockets [0 ].getsockname ()
854+
855+ await client (server_addr )
856+ server .close ()
857+ await server .wait_closed ()
858+
859+ messages = []
860+ self .loop .set_exception_handler (lambda loop , ctx : messages .append (ctx ))
861+ self .loop .run_until_complete (run_test ())
862+ self .assertEqual (messages , [])
863+
822864 def test_streamreader_constructor_without_loop (self ):
823865 with self .assertRaisesRegex (RuntimeError , 'no current event loop' ):
824866 asyncio .StreamReader ()
0 commit comments