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:
David Szotten
2015-07-22 14:03:35 +02:00
committed by Sergey Shepelev
parent e9f19c6df4
commit 32305974e2
2 changed files with 33 additions and 2 deletions

View File

@@ -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)

View File

@@ -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()