summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-01-31 22:26:04 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-01-31 22:26:04 (GMT)
commitf3fa07470381b4f54b2d3f911fc22624e9b0b27d (patch)
tree5368b993641d34b3824a79896bf18c8f9097ce5c /Lib/test
parente70c72c06b169a36170ab68ec52bda9a87c16274 (diff)
downloadcpython-f3fa07470381b4f54b2d3f911fc22624e9b0b27d.zip
cpython-f3fa07470381b4f54b2d3f911fc22624e9b0b27d.tar.gz
cpython-f3fa07470381b4f54b2d3f911fc22624e9b0b27d.tar.bz2
- Issue #6939: Fix file I/O objects in the `io` module to keep the original
file position when calling `truncate()`. It would previously change the file position to the given argument, which goes against the tradition of ftruncate() and other truncation APIs. Patch by Pascal Chambon.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_fileio.py11
-rw-r--r--Lib/test/test_io.py20
-rw-r--r--Lib/test/test_largefile.py4
-rw-r--r--Lib/test/test_memoryio.py5
4 files changed, 33 insertions, 7 deletions
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index 91c5251..cdc3123 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -329,6 +329,17 @@ class OtherFileTests(unittest.TestCase):
f.close()
self.fail("no error for invalid mode: %s" % bad_mode)
+ def testTruncate(self):
+ f = _FileIO(TESTFN, 'w')
+ f.write(bytes(bytearray(range(10))))
+ self.assertEqual(f.tell(), 10)
+ f.truncate(5)
+ self.assertEqual(f.tell(), 10)
+ self.assertEqual(f.seek(0, os.SEEK_END), 5)
+ f.truncate(15)
+ self.assertEqual(f.tell(), 5)
+ self.assertEqual(f.seek(0, os.SEEK_END), 15)
+
def testTruncateOnWindows(self):
def bug801631():
# SF bug <http://www.python.org/sf/801631>
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 6f136f2..b91c0a1 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -234,6 +234,11 @@ class IOTest(unittest.TestCase):
def write_ops(self, f):
self.assertEqual(f.write(b"blah."), 5)
+ f.truncate(0)
+ self.assertEqual(f.tell(), 5)
+ f.seek(0)
+
+ self.assertEqual(f.write(b"blah."), 5)
self.assertEqual(f.seek(0), 0)
self.assertEqual(f.write(b"Hello."), 6)
self.assertEqual(f.tell(), 6)
@@ -244,8 +249,9 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.write(b"h"), 1)
self.assertEqual(f.seek(-1, 2), 13)
self.assertEqual(f.tell(), 13)
+
self.assertEqual(f.truncate(12), 12)
- self.assertEqual(f.tell(), 12)
+ self.assertEqual(f.tell(), 13)
self.assertRaises(TypeError, f.seek, 0.0)
def read_ops(self, f, buffered=False):
@@ -290,7 +296,7 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.tell(), self.LARGE + 2)
self.assertEqual(f.seek(0, 2), self.LARGE + 2)
self.assertEqual(f.truncate(self.LARGE + 1), self.LARGE + 1)
- self.assertEqual(f.tell(), self.LARGE + 1)
+ self.assertEqual(f.tell(), self.LARGE + 2)
self.assertEqual(f.seek(0, 2), self.LARGE + 1)
self.assertEqual(f.seek(-1, 2), self.LARGE)
self.assertEqual(f.read(2), b"x")
@@ -988,7 +994,7 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
bufio = self.tp(raw, 8)
bufio.write(b"abcdef")
self.assertEqual(bufio.truncate(3), 3)
- self.assertEqual(bufio.tell(), 3)
+ self.assertEqual(bufio.tell(), 6)
with self.open(support.TESTFN, "rb", buffering=0) as f:
self.assertEqual(f.read(), b"abc")
@@ -1374,6 +1380,14 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
self.assertEqual(s,
b"A" + b"B" * overwrite_size + b"A" * (9 - overwrite_size))
+ def test_truncate_after_read_or_write(self):
+ raw = self.BytesIO(b"A" * 10)
+ bufio = self.tp(raw, 100)
+ self.assertEqual(bufio.read(2), b"AA") # the read buffer gets filled
+ self.assertEqual(bufio.truncate(), 2)
+ self.assertEqual(bufio.write(b"BB"), 2) # the write buffer increases
+ self.assertEqual(bufio.truncate(), 4)
+
def test_misbehaved_io(self):
BufferedReaderTest.test_misbehaved_io(self)
BufferedWriterTest.test_misbehaved_io(self)
diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py
index c4faead..16da8d8 100644
--- a/Lib/test/test_largefile.py
+++ b/Lib/test/test_largefile.py
@@ -125,7 +125,7 @@ class LargeFileTest(unittest.TestCase):
f.seek(42)
f.truncate(newsize)
if self.new_io:
- self.assertEqual(f.tell(), newsize) # else wasn't truncated
+ self.assertEqual(f.tell(), 42)
f.seek(0, 2)
self.assertEqual(f.tell(), newsize)
# XXX truncate(larger than true size) is ill-defined
@@ -133,7 +133,7 @@ class LargeFileTest(unittest.TestCase):
f.seek(0)
f.truncate(1)
if self.new_io:
- self.assertEqual(f.tell(), 1) # else pointer moved
+ self.assertEqual(f.tell(), 0) # else pointer moved
f.seek(0)
self.assertEqual(len(f.read()), 1) # else wasn't truncated
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
index c2190b6..d06f1c9 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -76,7 +76,7 @@ class MemoryTestMixin:
self.assertEqual(f.seek(0), 0)
self.assertEqual(f.write(t("h")), 1)
self.assertEqual(f.truncate(12), 12)
- self.assertEqual(f.tell(), 12)
+ self.assertEqual(f.tell(), 1)
def test_write(self):
buf = self.buftype("hello world\n")
@@ -127,7 +127,8 @@ class MemoryTestMixin:
# truncate() accepts long objects
self.assertEqual(memio.truncate(4L), 4)
self.assertEqual(memio.getvalue(), buf[:4])
- self.assertEqual(memio.tell(), 4)
+ self.assertEqual(memio.tell(), 6)
+ memio.seek(0, 2)
memio.write(buf)
self.assertEqual(memio.getvalue(), buf[:4] + buf)
pos = memio.tell()