@@ -1460,6 +1460,47 @@ def test_sendto_closing(self):
14601460 transport .sendto (b'data' , (1 ,))
14611461 self .assertEqual (transport ._conn_lost , 2 )
14621462
1463+ def test_sendto_sendto_ready (self ):
1464+ data = b'data'
1465+
1466+ # First queue up the buffer by having the socket blocked
1467+ self .sock .sendto .side_effect = BlockingIOError
1468+ transport = self .datagram_transport ()
1469+ transport .sendto (data , ('0.0.0.0' , 12345 ))
1470+ self .loop .assert_writer (7 , transport ._sendto_ready )
1471+ self .assertEqual (1 , len (transport ._buffer ))
1472+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1473+
1474+ # Now let the socket send the buffer
1475+ self .sock .sendto .side_effect = None
1476+ transport ._sendto_ready ()
1477+ self .assertTrue (self .sock .sendto .called )
1478+ self .assertEqual (
1479+ self .sock .sendto .call_args [0 ], (data , ('0.0.0.0' , 12345 )))
1480+ self .assertFalse (self .loop .writers )
1481+ self .assertFalse (transport ._buffer )
1482+ self .assertEqual (transport ._buffer_size , 0 )
1483+
1484+ def test_sendto_sendto_ready_blocked (self ):
1485+ data = b'data'
1486+
1487+ # First queue up the buffer by having the socket blocked
1488+ self .sock .sendto .side_effect = BlockingIOError
1489+ transport = self .datagram_transport ()
1490+ transport .sendto (data , ('0.0.0.0' , 12345 ))
1491+ self .loop .assert_writer (7 , transport ._sendto_ready )
1492+ self .assertEqual (1 , len (transport ._buffer ))
1493+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1494+
1495+ # Now try to send the buffer, it will be added to buffer again if it fails
1496+ transport ._sendto_ready ()
1497+ self .assertTrue (self .sock .sendto .called )
1498+ self .assertEqual (
1499+ self .sock .sendto .call_args [0 ], (data , ('0.0.0.0' , 12345 )))
1500+ self .assertTrue (self .loop .writers )
1501+ self .assertEqual (1 , len (transport ._buffer ))
1502+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1503+
14631504 def test_sendto_ready (self ):
14641505 data = b'data'
14651506 self .sock .sendto .return_value = len (data )
0 commit comments