예제 #1
0
    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'
예제 #2
0
    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)
예제 #3
0
 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'
예제 #4
0
 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'
예제 #5
0
 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
예제 #6
0
    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))
예제 #7
0
 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)
예제 #8
0
 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'