bpo-26730: Fix SpooledTemporaryFile data corruption (GH-17400)
SpooledTemporaryFile.rollback() might cause data corruption
when it is in text mode.
Co-Authored-By: Serhiy Storchaka <storchaka@gmail.com>
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index f995f6c..232c5da 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -1114,7 +1114,8 @@
def test_text_mode(self):
# Creating a SpooledTemporaryFile with a text mode should produce
# a file object reading and writing (Unicode) text strings.
- f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10)
+ f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
+ encoding="utf-8")
f.write("abc\n")
f.seek(0)
self.assertEqual(f.read(), "abc\n")
@@ -1124,9 +1125,9 @@
self.assertFalse(f._rolled)
self.assertEqual(f.mode, 'w+')
self.assertIsNone(f.name)
- self.assertIsNone(f.newlines)
- self.assertIsNone(f.encoding)
- self.assertIsNone(f.errors)
+ self.assertEqual(f.newlines, os.linesep)
+ self.assertEqual(f.encoding, "utf-8")
+ self.assertEqual(f.errors, "strict")
f.write("xyzzy\n")
f.seek(0)
@@ -1139,8 +1140,8 @@
self.assertEqual(f.mode, 'w+')
self.assertIsNotNone(f.name)
self.assertEqual(f.newlines, os.linesep)
- self.assertIsNotNone(f.encoding)
- self.assertIsNotNone(f.errors)
+ self.assertEqual(f.encoding, "utf-8")
+ self.assertEqual(f.errors, "strict")
def test_text_newline_and_encoding(self):
f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
@@ -1152,13 +1153,15 @@
self.assertFalse(f._rolled)
self.assertEqual(f.mode, 'w+')
self.assertIsNone(f.name)
- self.assertIsNone(f.newlines)
- self.assertIsNone(f.encoding)
- self.assertIsNone(f.errors)
+ self.assertIsNotNone(f.newlines)
+ self.assertEqual(f.encoding, "utf-8")
+ self.assertEqual(f.errors, "ignore")
- f.write("\u039B" * 20 + "\r\n")
+ f.write("\u039C" * 10 + "\r\n")
+ f.write("\u039D" * 20)
f.seek(0)
- self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n")
+ self.assertEqual(f.read(),
+ "\u039B\r\n" + ("\u039C" * 10) + "\r\n" + ("\u039D" * 20))
self.assertTrue(f._rolled)
self.assertEqual(f.mode, 'w+')
self.assertIsNotNone(f.name)