mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #12062: Fix a flushing bug when doing a certain type of I/O sequence
on a file opened in read+write mode (namely: reading, seeking a bit forward, writing, then seeking before the previous write but still within buffered data, and writing again).
This commit is contained in:
commit
b89b31a158
3 changed files with 32 additions and 1 deletions
|
@ -1496,6 +1496,32 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
|
|||
self.assertEqual(s,
|
||||
b"A" + b"B" * overwrite_size + b"A" * (9 - overwrite_size))
|
||||
|
||||
def test_write_rewind_write(self):
|
||||
# Various combinations of reading / writing / seeking backwards / writing again
|
||||
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 = self.BytesIO(b)
|
||||
bufio = self.tp(raw, 100)
|
||||
mutate(bufio, i, j)
|
||||
bufio.flush()
|
||||
expected = bytearray(b)
|
||||
expected[j] = 2
|
||||
expected[i] = 1
|
||||
self.assertEqual(raw.getvalue(), expected,
|
||||
"failed result for i=%d, j=%d" % (i, j))
|
||||
|
||||
def test_truncate_after_read_or_write(self):
|
||||
raw = self.BytesIO(b"A" * 10)
|
||||
bufio = self.tp(raw, 100)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue