def test_interleaved_read_write(self): import _io as io # Test for issue #12213 with io.BytesIO(b'abcdefgh') as raw: with io.BufferedRandom(raw, 100) as f: f.write(b"1") assert f.read(1) == b'b' f.write(b'2') assert f.read1(1) == b'd' f.write(b'3') buf = bytearray(1) f.readinto(buf) assert buf == b'f' f.write(b'4') assert f.peek(1) == b'h' f.flush() assert raw.getvalue() == b'1b2d3f4h' with io.BytesIO(b'abc') as raw: with io.BufferedRandom(raw, 100) as f: assert f.read(1) == b'a' f.write(b"2") assert f.read(1) == b'c' f.flush() assert raw.getvalue() == b'a2c'
def test_write_rewind_write(self): # Various combinations of reading / writing / seeking # backwards / writing again import _io, errno def mutate(bufio, pos1, pos2): assert pos2 >= pos1 # Fill the buffer bufio.seek(pos1) bufio.read(pos2 - pos1) bufio.write(b'\x02') # This writes earlier than the previous write, but still inside # the buffer. bufio.seek(pos1) bufio.write(b'\x01') b = b"\x80\x81\x82\x83\x84" for i in range(0, len(b)): for j in range(i, len(b)): raw = _io.BytesIO(b) bufio = _io.BufferedRandom(raw, 100) mutate(bufio, i, j) bufio.flush() expected = bytearray(b) expected[j] = 2 expected[i] = 1 assert raw.getvalue() == str(expected)
def test_simple_read_after_write(self): import _io raw = _io.FileIO(self.tmpfile, 'wb+') f = _io.BufferedRandom(raw) f.write('abc') f.seek(0) assert f.read() == 'abc'
def test_simple_read(self): import _io raw = _io.FileIO(self.tmpfile, 'rb+') f = _io.BufferedRandom(raw) assert f.read(3) == 'a\nb' f.write('xxxx') f.seek(0) assert f.read() == 'a\nbxxxx'
def test_truncate_after_write(self): import _io raw = _io.FileIO(self.tmpfile, 'rb+') raw.write(b'\x00' * 50) raw.seek(0) b = _io.BufferedRandom(raw, 10) b.write(b'\x00' * 11) b.read(1) b.truncate() assert b.tell() == 12
def test_readinto1(self): import _io class MockIO(_io._IOBase): def readable(self): return True def readinto(self, buf): buf[:3] = b"abc" return 3 def writable(self): return True def write(self, b): return len(b) def seekable(self): return True def seek(self, pos, whence): return 0 bufio = _io.BufferedReader(MockIO(), buffer_size=5) buf = bytearray(10) bufio.read(2) n = bufio.readinto1(buf) assert n == 4 assert buf[:n] == b'cabc' # Yes, CPython's observable behavior depends on buffer_size! bufio = _io.BufferedReader(MockIO(), buffer_size=20) buf = bytearray(10) bufio.read(2) n = bufio.readinto1(buf) assert n == 1 assert buf[:n] == b'c' bufio = _io.BufferedReader(MockIO(), buffer_size=20) buf = bytearray(2) bufio.peek(3) assert bufio.readinto1(buf) == 2 assert buf == b'ab' n = bufio.readinto1(buf) assert n == 1 assert buf[:n] == b'c' bufio = _io.BufferedRandom(MockIO(), buffer_size=10) buf = bytearray(20) bufio.peek(3) assert bufio.readinto1(buf) == 6 assert buf[:6] == b'abcabc' bufio = _io.BufferedWriter(MockIO(), buffer_size=10) raises(_io.UnsupportedOperation, bufio.readinto1, bytearray(10))
def test_readline(self): import _io as io with io.BytesIO(b"abc\ndef\nxyzzy\nfoo\x00bar\nanother line") as raw: with io.BufferedRandom(raw, buffer_size=10) as f: assert f.readline() == b"abc\n" assert f.readline(10) == b"def\n" assert f.readline(2) == b"xy" assert f.readline(4) == b"zzy\n" assert f.readline() == b"foo\x00bar\n" assert f.readline(None) == b"another line" raises(TypeError, f.readline, 5.3)
def test_interleaved_readline_write(self): import _io as io with io.BytesIO(b'ab\ncdef\ng\n') as raw: with io.BufferedRandom(raw) as f: f.write(b'1') assert f.readline() == b'b\n' f.write(b'2') assert f.readline() == b'def\n' f.write(b'3') assert f.readline() == b'\n' f.flush() assert raw.getvalue() == b'1b\n2def\n3\n'