diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-05-08 22:31:32 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-05-08 22:31:32 (GMT) |
commit | 38ca5a7b6d7744cae586c824159d1a4be791cd89 (patch) | |
tree | e2671a465d02bfd41d95b29a0cef62db05212590 /Lib/test/test_io.py | |
parent | d30b022b5ea1b73595b330d9d4aba36aa0ebdd29 (diff) | |
parent | c644e7c39f7adf0ed783e128b0278665133bf523 (diff) | |
download | cpython-38ca5a7b6d7744cae586c824159d1a4be791cd89.zip cpython-38ca5a7b6d7744cae586c824159d1a4be791cd89.tar.gz cpython-38ca5a7b6d7744cae586c824159d1a4be791cd89.tar.bz2 |
Issue #21396: Fix TextIOWrapper(..., write_through=True) to not force a flush() on the underlying binary stream.
Patch by akira.
Diffstat (limited to 'Lib/test/test_io.py')
-rw-r--r-- | Lib/test/test_io.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 8e702db..347832d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -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 |