@@ -1026,6 +1026,45 @@ def test_transport_close_remove_writer(self, m_log):
1026
1026
transport .close ()
1027
1027
remove_writer .assert_called_with (self .sock_fd )
1028
1028
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 )
1029
1068
1030
1069
class SelectorSocketTransportBufferedProtocolTests (test_utils .TestCase ):
1031
1070
0 commit comments