summaryrefslogtreecommitdiff
path: root/Lib/test/test_io.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-09-14 18:48:19 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2010-09-14 18:48:19 +0000
commit6391b3440ff72071f06d8b53a30aa8771a6ff44d (patch)
tree6ce23bcb7edf1382bec444a8645c918bfb856ba7 /Lib/test/test_io.py
parent93db23ef2f128abae78101c556675d1f84c8f6e6 (diff)
downloadcpython-git-6391b3440ff72071f06d8b53a30aa8771a6ff44d.tar.gz
Merged revisions 84814 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r84814 | antoine.pitrou | 2010-09-14 20:37:24 +0200 (mar., 14 sept. 2010) | 4 lines Issue #9854: The default read() implementation in io.RawIOBase now handles non-blocking readinto() returning None correctly. ........
Diffstat (limited to 'Lib/test/test_io.py')
-rw-r--r--Lib/test/test_io.py44
1 files changed, 34 insertions, 10 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index d2ad2a6aa7..38cbcbcc2b 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -53,7 +53,9 @@ def _default_chunk_size():
return f._CHUNK_SIZE
-class MockRawIO:
+class MockRawIOWithoutRead:
+ """A RawIO implementation without read(), so as to exercise the default
+ RawIO.read() which calls readinto()."""
def __init__(self, read_stack=()):
self._read_stack = list(read_stack)
@@ -61,14 +63,6 @@ class MockRawIO:
self._reads = 0
self._extraneous_reads = 0
- def read(self, n=None):
- self._reads += 1
- try:
- return self._read_stack.pop(0)
- except:
- self._extraneous_reads += 1
- return b""
-
def write(self, b):
self._write_stack.append(bytes(b))
return len(b)
@@ -115,6 +109,23 @@ class MockRawIO:
def truncate(self, pos=None):
return pos
+class CMockRawIOWithoutRead(MockRawIOWithoutRead, io.RawIOBase):
+ pass
+
+class PyMockRawIOWithoutRead(MockRawIOWithoutRead, pyio.RawIOBase):
+ pass
+
+
+class MockRawIO(MockRawIOWithoutRead):
+
+ def read(self, n=None):
+ self._reads += 1
+ try:
+ return self._read_stack.pop(0)
+ except:
+ self._extraneous_reads += 1
+ return b""
+
class CMockRawIO(MockRawIO, io.RawIOBase):
pass
@@ -560,6 +571,19 @@ class IOTest(unittest.TestCase):
f.close()
self.assertRaises(ValueError, f.flush)
+ def test_RawIOBase_read(self):
+ # Exercise the default RawIOBase.read() implementation (which calls
+ # readinto() internally).
+ rawio = self.MockRawIOWithoutRead((b"abc", b"d", None, b"efg", None))
+ self.assertEqual(rawio.read(2), b"ab")
+ self.assertEqual(rawio.read(2), b"c")
+ self.assertEqual(rawio.read(2), b"d")
+ self.assertEqual(rawio.read(2), None)
+ self.assertEqual(rawio.read(2), b"ef")
+ self.assertEqual(rawio.read(2), b"g")
+ self.assertEqual(rawio.read(2), None)
+ self.assertEqual(rawio.read(2), b"")
+
class CIOTest(IOTest):
pass
@@ -2558,7 +2582,7 @@ def test_main():
# Put the namespaces of the IO module we are testing and some useful mock
# classes in the __dict__ of each test.
mocks = (MockRawIO, MisbehavedRawIO, MockFileIO, CloseFailureIO,
- MockNonBlockWriterIO)
+ MockNonBlockWriterIO, MockRawIOWithoutRead)
all_members = io.__all__ + ["IncrementalNewlineDecoder"]
c_io_ns = dict((name, getattr(io, name)) for name in all_members)
py_io_ns = dict((name, getattr(pyio, name)) for name in all_members)