diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-09 13:47:43 +0200 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-09 13:47:43 +0200 |
commit | 276f1d513917bf47e3a9e333529f6b87302d6aaa (patch) | |
tree | 4cb9795c136552deded33f74dbf743ea02b2c8a5 /Lib/test/test_StringIO.py | |
parent | beaa3adae954a4a85c7dd8e02340d92fd04a7855 (diff) | |
download | cpython-git-276f1d513917bf47e3a9e333529f6b87302d6aaa.tar.gz |
Issue #7358: cStringIO.StringIO now supports writing to and reading from
a stream larger than 2 GiB on 64-bit systems.
Diffstat (limited to 'Lib/test/test_StringIO.py')
-rw-r--r-- | Lib/test/test_StringIO.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py index bf0c733db7..84b2b08acb 100644 --- a/Lib/test/test_StringIO.py +++ b/Lib/test/test_StringIO.py @@ -5,6 +5,7 @@ import StringIO import cStringIO import types import array +import sys from test import test_support @@ -105,6 +106,45 @@ class TestGenericStringIO(unittest.TestCase): self._fp.close() self.assertRaises(ValueError, self._fp.getvalue) + @test_support.bigmemtest(test_support._2G + 2**26, memuse=2.001) + def test_reads_from_large_stream(self, size): + linesize = 2**26 # 64 MiB + lines = ['x' * (linesize - 1) + '\n'] * (size // linesize) + \ + ['y' * (size % linesize)] + f = self.MODULE.StringIO(''.join(lines)) + for i, expected in enumerate(lines): + line = f.read(len(expected)) + self.assertEqual(len(line), len(expected)) + self.assertEqual(line, expected) + self.assertEqual(f.read(), '') + f.seek(0) + for i, expected in enumerate(lines): + line = f.readline() + self.assertEqual(len(line), len(expected)) + self.assertEqual(line, expected) + self.assertEqual(f.readline(), '') + f.seek(0) + self.assertEqual(f.readlines(), lines) + self.assertEqual(f.readlines(), []) + f.seek(0) + self.assertEqual(f.readlines(size), lines) + self.assertEqual(f.readlines(), []) + + # In worst case cStringIO requires 2 + 1 + 1/2 + 1/2**2 + ... = 4 + # bytes per input character. + @test_support.bigmemtest(test_support._2G, memuse=4) + def test_writes_to_large_stream(self, size): + s = 'x' * 2**26 # 64 MiB + f = self.MODULE.StringIO() + n = size + while n > len(s): + f.write(s) + n -= len(s) + s = None + f.write('x' * n) + self.assertEqual(len(f.getvalue()), size) + + class TestStringIO(TestGenericStringIO): MODULE = StringIO |