@@ -1497,6 +1497,47 @@ def test_sendto_closing(self):
14971497 transport .sendto (b'data' , (1 ,))
14981498 self .assertEqual (transport ._conn_lost , 2 )
14991499
1500+ def test_sendto_sendto_ready (self ):
1501+ data = b'data'
1502+
1503+ # First queue up the buffer by having the socket blocked
1504+ self .sock .sendto .side_effect = BlockingIOError
1505+ transport = self .datagram_transport ()
1506+ transport .sendto (data , ('0.0.0.0' , 12345 ))
1507+ self .loop .assert_writer (7 , transport ._sendto_ready )
1508+ self .assertEqual (1 , len (transport ._buffer ))
1509+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1510+
1511+ # Now let the socket send the buffer
1512+ self .sock .sendto .side_effect = None
1513+ transport ._sendto_ready ()
1514+ self .assertTrue (self .sock .sendto .called )
1515+ self .assertEqual (
1516+ self .sock .sendto .call_args [0 ], (data , ('0.0.0.0' , 12345 )))
1517+ self .assertFalse (self .loop .writers )
1518+ self .assertFalse (transport ._buffer )
1519+ self .assertEqual (transport ._buffer_size , 0 )
1520+
1521+ def test_sendto_sendto_ready_blocked (self ):
1522+ data = b'data'
1523+
1524+ # First queue up the buffer by having the socket blocked
1525+ self .sock .sendto .side_effect = BlockingIOError
1526+ transport = self .datagram_transport ()
1527+ transport .sendto (data , ('0.0.0.0' , 12345 ))
1528+ self .loop .assert_writer (7 , transport ._sendto_ready )
1529+ self .assertEqual (1 , len (transport ._buffer ))
1530+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1531+
1532+ # Now try to send the buffer, it will be added to buffer again if it fails
1533+ transport ._sendto_ready ()
1534+ self .assertTrue (self .sock .sendto .called )
1535+ self .assertEqual (
1536+ self .sock .sendto .call_args [0 ], (data , ('0.0.0.0' , 12345 )))
1537+ self .assertTrue (self .loop .writers )
1538+ self .assertEqual (1 , len (transport ._buffer ))
1539+ self .assertEqual (transport ._buffer_size , len (data ) + transport ._header_size )
1540+
15001541 def test_sendto_ready (self ):
15011542 data = b'data'
15021543 self .sock .sendto .return_value = len (data )
0 commit comments