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):
|
def fileno(self):
|
||||||
return self._fileno
|
return self._fileno
|
||||||
|
|
||||||
def read(self, buflen):
|
def read(self, size=-1):
|
||||||
|
if size == -1:
|
||||||
|
return self.readall()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
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:
|
except OSError as e:
|
||||||
if get_errno(e) not in SOCKET_BLOCKING:
|
if get_errno(e) not in SOCKET_BLOCKING:
|
||||||
raise IOError(*e.args)
|
raise IOError(*e.args)
|
||||||
|
@@ -3,6 +3,7 @@ import errno
|
|||||||
import eventlet
|
import eventlet
|
||||||
import fcntl
|
import fcntl
|
||||||
import gc
|
import gc
|
||||||
|
from io import DEFAULT_BUFFER_SIZE
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import socket as _orig_sock
|
import socket as _orig_sock
|
||||||
@@ -711,6 +712,20 @@ class TestGreenPipe(tests.LimitedTestCase):
|
|||||||
|
|
||||||
gt.wait()
|
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):
|
def test_pipe_writes_large_messages(self):
|
||||||
r, w = os.pipe()
|
r, w = os.pipe()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user