@@ -654,6 +654,59 @@ async def runner():
654654 self .assertIsNone (
655655 self .loop .run_until_complete (connection_lost_called ))
656656
657+ def test_resume_writing_write_different_transport (self ):
658+ loop = self .loop
659+
660+ class P1 (asyncio .Protocol ):
661+ def __init__ (self , t2 ):
662+ self .t2 = t2
663+ self .paused = False
664+ self .waiter = loop .create_future ()
665+
666+ def data_received (self , data ):
667+ self .waiter .set_result (data )
668+
669+ def pause_writing (self ):
670+ self .paused = True
671+
672+ def resume_writing (self ):
673+ self .paused = False
674+ self .t2 .write (b'hello' )
675+
676+ s1 , s2 = socket .socketpair ()
677+ s1 .setsockopt (socket .SOL_SOCKET , socket .SO_SNDBUF , 1024 )
678+ s2 .setsockopt (socket .SOL_SOCKET , socket .SO_RCVBUF , 1024 )
679+
680+ async def _test (t1 , p1 , t2 ):
681+ t1 .set_write_buffer_limits (1024 , 1023 )
682+
683+ # fill s1 up first
684+ t2 .pause_reading ()
685+ while not p1 .paused :
686+ t1 .write (b' ' * 1024 )
687+
688+ # trigger resume_writing() in _exec_queued_writes() with tight loop
689+ t2 .resume_reading ()
690+ while p1 .paused :
691+ t1 .write (b' ' )
692+ await asyncio .sleep (0 )
693+
694+ # t2.write() in p1.resume_writing() should work fine
695+ data = await asyncio .wait_for (p1 .waiter , 5 )
696+ self .assertEqual (data , b'hello' )
697+
698+ async def test ():
699+ t2 , _ = await loop .create_connection (asyncio .Protocol , sock = s2 )
700+ t1 , p1 = await loop .create_connection (lambda : P1 (t2 ), sock = s1 )
701+ try :
702+ await _test (t1 , p1 , t2 )
703+ finally :
704+ t1 .close ()
705+ t2 .close ()
706+
707+ with s1 , s2 :
708+ loop .run_until_complete (test ())
709+
657710
658711class Test_UV_TCP (_TestTCP , tb .UVTestCase ):
659712
0 commit comments