|
|
|
@ -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 |
|
|
|
|