cpython: 80e0040d910c (original) (raw)

--- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -340,6 +340,8 @@ class _SelectorTransport(transports.Tran max_size = 256 * 1024 # Buffer size passed to recv().

+ def init(self, loop, sock, protocol, extra, server=None): super().init(extra) self._extra['socket'] = sock @@ -354,7 +356,7 @@ class _SelectorTransport(transports.Tran self._sock_fd = sock.fileno() self._protocol = protocol self._server = server

@@ -433,12 +435,14 @@ class _SelectorTransport(transports.Tran high = 4*low if low is None: low = high // 4

def get_write_buffer_size(self):

class _SelectorSocketTransport(_SelectorTransport): @@ -455,13 +459,16 @@ class _SelectorSocketTransport(_Selector self._loop.call_soon(waiter.set_result, None) def pause_reading(self):

def resume_reading(self):

@@ -488,8 +495,11 @@ class _SelectorSocketTransport(_Selector self.close() def write(self, data):

@@ -516,25 +526,23 @@ class _SelectorSocketTransport(_Selector self._loop.add_writer(self._sock_fd, self._write_ready) # Add it to the buffer.

def _write_ready(self):

@@ -556,6 +564,8 @@ class _SelectorSocketTransport(_Selector class _SelectorSslTransport(_SelectorTransport):

+ def init(self, loop, rawsock, protocol, sslcontext, waiter=None, server_side=False, server_hostname=None, extra=None, server=None): @@ -661,13 +671,16 @@ class _SelectorSslTransport(_SelectorTra # accept more data for the buffer and eventually the app will # call resume_reading() again, and things will flow again.

def resume_reading(self):

@@ -712,10 +725,8 @@ class _SelectorSslTransport(_SelectorTra self._loop.add_reader(self._sock_fd, self._read_ready) if self._buffer:

@@ -725,11 +736,12 @@ class _SelectorSslTransport(_SelectorTra self._write_wants_read = True except Exception as exc: self._loop.remove_writer(self._sock_fd)

self._maybe_resume_protocol() # May append to buffer. @@ -739,7 +751,9 @@ class _SelectorSslTransport(_SelectorTra self._call_connection_lost(None) def write(self, data):

@@ -753,7 +767,7 @@ class _SelectorSslTransport(_SelectorTra self._loop.add_writer(self._sock_fd, self._write_ready) # Add it to the buffer.

def can_write_eof(self): @@ -762,6 +776,8 @@ class _SelectorSslTransport(_SelectorTra class _SelectorDatagramTransport(_SelectorTransport):

+ def init(self, loop, sock, protocol, address=None, extra=None): super().init(loop, sock, protocol, extra) self._address = address @@ -784,12 +800,15 @@ class _SelectorDatagramTransport(_Select self._protocol.datagram_received(data, addr) def sendto(self, data, addr=None):

if self._conn_lost and self._address: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: @@ -814,7 +833,8 @@ class _SelectorDatagramTransport(_Select self._fatal_error(exc) return

def _sendto_ready(self):

--- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -32,6 +32,10 @@ class TestBaseSelectorEventLoop(BaseSele self._internal_fds += 1 +def list_to_buffer(l=()):

+ + class BaseSelectorEventLoopTests(unittest.TestCase): def setUp(self): @@ -613,7 +617,7 @@ class SelectorTransportTests(unittest.Te def test_close_write_buffer(self): tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)

self.assertFalse(self.loop.readers) @@ -622,13 +626,13 @@ class SelectorTransportTests(unittest.Te def test_force_close(self): tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)

self.assertTrue(tr._closing)

@@ -783,21 +787,40 @@ class SelectorSocketTransportTests(unitt transport.write(data) self.sock.send.assert_called_with(data)

+

+

+

+ def test_write_no_data(self): transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_buffer(self): transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_partial(self): @@ -809,7 +832,30 @@ class SelectorSocketTransportTests(unitt transport.write(data) self.loop.assert_writer(7, transport._write_ready)

+

+

+

+

+

+

def test_write_partial_none(self): data = b'data' @@ -821,7 +867,7 @@ class SelectorSocketTransportTests(unitt transport.write(data) self.loop.assert_writer(7, transport._write_ready)

def test_write_tryagain(self): self.sock.send.side_effect = BlockingIOError @@ -832,7 +878,7 @@ class SelectorSocketTransportTests(unitt transport.write(data) self.loop.assert_writer(7, transport._write_ready)

@unittest.mock.patch('asyncio.selector_events.logger') def test_write_exception(self, m_log): @@ -859,7 +905,7 @@ class SelectorSocketTransportTests(unitt def test_write_str(self): transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_closing(self): transport = _SelectorSocketTransport( @@ -875,11 +921,10 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_ready_closing(self): @@ -889,10 +934,10 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol) transport._closing = True

@@ -900,6 +945,7 @@ class SelectorSocketTransportTests(unitt def test_write_ready_no_data(self): transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_ready_partial(self): @@ -908,11 +954,11 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_ready_partial_none(self): data = b'data' @@ -920,23 +966,23 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

def test_write_ready_tryagain(self): self.sock.send.side_effect = BlockingIOError transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol)

self.loop.assert_writer(7, transport._write_ready)

def test_write_ready_exception(self): err = self.sock.send.side_effect = OSError() @@ -944,7 +990,7 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol) transport._fatal_error = unittest.mock.Mock()

@@ -956,7 +1002,7 @@ class SelectorSocketTransportTests(unitt transport = _SelectorSocketTransport( self.loop, self.sock, self.protocol) transport.close()

@@ -976,12 +1022,12 @@ class SelectorSocketTransportTests(unitt self.sock.send.side_effect = BlockingIOError tr.write(b'data') tr.write_eof()

@@ -1065,15 +1111,34 @@ class SelectorSslTransportTests(unittest self.assertFalse(tr._paused) self.loop.assert_reader(1, tr._read_ready)

+

+

+ def test_write_no_data(self): transport = self._make_one()

def test_write_str(self): transport = self._make_one()

def test_write_closing(self): transport = self._make_one() @@ -1087,7 +1152,7 @@ class SelectorSslTransportTests(unittest transport = self._make_one() transport._conn_lost = 1 transport.write(b'data')

@@ -1107,7 +1172,7 @@ class SelectorSslTransportTests(unittest transport = self._make_one() transport._write_wants_read = True transport._write_ready = unittest.mock.Mock()

self.assertFalse(transport._write_wants_read) @@ -1168,31 +1233,31 @@ class SelectorSslTransportTests(unittest def test_write_ready_send(self): self.sslsock.send.return_value = 4 transport = self._make_one()

def test_write_ready_send_none(self): self.sslsock.send.return_value = 0 transport = self._make_one()

def test_write_ready_send_partial(self): self.sslsock.send.return_value = 2 transport = self._make_one()

def test_write_ready_send_closing_partial(self): self.sslsock.send.return_value = 2 transport = self._make_one()

@@ -1201,7 +1266,7 @@ class SelectorSslTransportTests(unittest self.sslsock.send.return_value = 4 transport = self._make_one() transport.close()

@@ -1210,26 +1275,26 @@ class SelectorSslTransportTests(unittest self.sslsock.send.return_value = 4 transport = self._make_one() transport.close()

def test_write_ready_send_retry(self): transport = self._make_one()

self.sslsock.send.side_effect = ssl.SSLWantWriteError transport._write_ready()

self.sslsock.send.side_effect = BlockingIOError() transport._write_ready()

def test_write_ready_send_read(self): transport = self._make_one()

self.loop.remove_writer = unittest.mock.Mock() self.sslsock.send.side_effect = ssl.SSLWantReadError @@ -1242,11 +1307,11 @@ class SelectorSslTransportTests(unittest err = self.sslsock.send.side_effect = OSError() transport = self._make_one()

def test_write_ready_read_wants_write(self): self.loop.add_reader = unittest.mock.Mock() @@ -1355,6 +1420,24 @@ class SelectorDatagramTransportTests(uni self.assertEqual( self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))

+

+ def test_sendto_no_data(self): transport = _SelectorDatagramTransport( self.loop, self.sock, self.protocol) @@ -1375,6 +1458,32 @@ class SelectorDatagramTransportTests(uni (b'data2', ('0.0.0.0', 12345))], list(transport._buffer))

+

+ def test_sendto_tryagain(self): data = b'data' @@ -1439,13 +1548,13 @@ class SelectorDatagramTransportTests(uni def test_sendto_str(self): transport = _SelectorDatagramTransport( self.loop, self.sock, self.protocol)

def test_sendto_connected_addr(self): transport = _SelectorDatagramTransport( self.loop, self.sock, self.protocol, ('0.0.0.0', 1)) self.assertRaises(

def test_sendto_closing(self): transport = _SelectorDatagramTransport(