@@ -1026,6 +1026,45 @@ def test_transport_close_remove_writer(self, m_log):
10261026 transport .close ()
10271027 remove_writer .assert_called_with (self .sock_fd )
10281028
1029+ def test_write_buffer_after_close (self ):
1030+ # If the transport is closed while:
1031+ # * Transport write buffer is not empty
1032+ # * Transport is paused
1033+ # * Protocol has data in its buffer, like SSLProtocol in self._outgoing
1034+ # The data is still written out.
1035+
1036+ data = memoryview (b'data' )
1037+ self .sock .send .return_value = 2
1038+ self .sock .send .fileno .return_value = 7
1039+
1040+ def _resume_writing ():
1041+ transport .write (b"data" )
1042+ self .protocol .resume_writing .side_effect = None
1043+
1044+ self .protocol .resume_writing .side_effect = _resume_writing
1045+
1046+ transport = self .socket_transport ()
1047+ transport ._high_water = 1
1048+
1049+ transport .write (data )
1050+
1051+ self .assertTrue (transport ._protocol_paused )
1052+ self .assertTrue (self .sock .send .called )
1053+ self .loop .assert_writer (7 , transport ._write_ready )
1054+
1055+ transport .close ()
1056+
1057+ # not called, we still have data in write buffer
1058+ self .assertFalse (self .protocol .connection_lost .called )
1059+
1060+ self .loop .writers [7 ]._run ()
1061+ # during this ^ run, the _resume_writing mock above was called and added more data
1062+
1063+ self .assertEqual (transport .get_write_buffer_size (), 2 )
1064+ self .loop .writers [7 ]._run ()
1065+
1066+ self .assertEqual (transport .get_write_buffer_size (), 0 )
1067+ self .assertTrue (self .protocol .connection_lost .called )
10291068
10301069class SelectorSocketTransportBufferedProtocolTests (test_utils .TestCase ):
10311070
0 commit comments