@@ -654,6 +654,59 @@ async def runner():
654
654
self .assertIsNone (
655
655
self .loop .run_until_complete (connection_lost_called ))
656
656
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
+
657
710
658
711
class Test_UV_TCP (_TestTCP , tb .UVTestCase ):
659
712
0 commit comments