support buflen=-1 and readall like FileIO does
required to make pytest work with an active eventlet.monkey_patch() on py3 https://github.com/eventlet/eventlet/pull/239
This commit is contained in:

committed by
Sergey Shepelev

parent
e9f19c6df4
commit
32305974e2
@@ -75,10 +75,26 @@ class GreenFileIO(_OriginalIOBase):
|
||||
def fileno(self):
|
||||
return self._fileno
|
||||
|
||||
def read(self, buflen):
|
||||
def read(self, size=-1):
|
||||
if size == -1:
|
||||
return self.readall()
|
||||
|
||||
while True:
|
||||
try:
|
||||
return _original_os.read(self._fileno, buflen)
|
||||
return _original_os.read(self._fileno, size)
|
||||
except OSError as e:
|
||||
if get_errno(e) not in SOCKET_BLOCKING:
|
||||
raise IOError(*e.args)
|
||||
self._trampoline(self, read=True)
|
||||
|
||||
def readall(self):
|
||||
buf = []
|
||||
while True:
|
||||
try:
|
||||
chunk = _original_os.read(self._fileno, DEFAULT_BUFFER_SIZE)
|
||||
if chunk == b'':
|
||||
return b''.join(buf)
|
||||
buf.append(chunk)
|
||||
except OSError as e:
|
||||
if get_errno(e) not in SOCKET_BLOCKING:
|
||||
raise IOError(*e.args)
|
||||
|
@@ -3,6 +3,7 @@ import errno
|
||||
import eventlet
|
||||
import fcntl
|
||||
import gc
|
||||
from io import DEFAULT_BUFFER_SIZE
|
||||
import os
|
||||
import shutil
|
||||
import socket as _orig_sock
|
||||
@@ -711,6 +712,20 @@ class TestGreenPipe(tests.LimitedTestCase):
|
||||
|
||||
gt.wait()
|
||||
|
||||
def test_pip_read_until_end(self):
|
||||
# similar to test_pip_read above but reading until eof
|
||||
r, w = os.pipe()
|
||||
|
||||
r = greenio.GreenPipe(r, 'rb')
|
||||
w = greenio.GreenPipe(w, 'wb')
|
||||
|
||||
w.write(b'c' * DEFAULT_BUFFER_SIZE * 2)
|
||||
w.close()
|
||||
|
||||
buf = r.read() # no chunk size specified; read until end
|
||||
self.assertEqual(len(buf), 2 * DEFAULT_BUFFER_SIZE)
|
||||
self.assertEqual(buf[:3], b'ccc')
|
||||
|
||||
def test_pipe_writes_large_messages(self):
|
||||
r, w = os.pipe()
|
||||
|
||||
|
Reference in New Issue
Block a user