mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #21396: Fix TextIOWrapper(..., write_through=True) to not force a flush() on the underlying binary stream.
Patch by akira.
This commit is contained in:
parent
a83ade1d60
commit
c644e7c39f
5 changed files with 45 additions and 4 deletions
|
@ -2615,6 +2615,38 @@ class TextIOWrapperTest(unittest.TestCase):
|
|||
txt.write('5')
|
||||
self.assertEqual(b''.join(raw._write_stack), b'123\n45')
|
||||
|
||||
def test_bufio_write_through(self):
|
||||
# Issue #21396: write_through=True doesn't force a flush()
|
||||
# on the underlying binary buffered object.
|
||||
flush_called, write_called = [], []
|
||||
class BufferedWriter(self.BufferedWriter):
|
||||
def flush(self, *args, **kwargs):
|
||||
flush_called.append(True)
|
||||
return super().flush(*args, **kwargs)
|
||||
def write(self, *args, **kwargs):
|
||||
write_called.append(True)
|
||||
return super().write(*args, **kwargs)
|
||||
|
||||
rawio = self.BytesIO()
|
||||
data = b"a"
|
||||
bufio = BufferedWriter(rawio, len(data)*2)
|
||||
textio = self.TextIOWrapper(bufio, encoding='ascii',
|
||||
write_through=True)
|
||||
# write to the buffered io but don't overflow the buffer
|
||||
text = data.decode('ascii')
|
||||
textio.write(text)
|
||||
|
||||
# buffer.flush is not called with write_through=True
|
||||
self.assertFalse(flush_called)
|
||||
# buffer.write *is* called with write_through=True
|
||||
self.assertTrue(write_called)
|
||||
self.assertEqual(rawio.getvalue(), b"") # no flush
|
||||
|
||||
write_called = [] # reset
|
||||
textio.write(text * 10) # total content is larger than bufio buffer
|
||||
self.assertTrue(write_called)
|
||||
self.assertEqual(rawio.getvalue(), data * 11) # all flushed
|
||||
|
||||
def test_read_nonbytes(self):
|
||||
# Issue #17106
|
||||
# Crash when underlying read() returns non-bytes
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue