mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #7358: cStringIO.StringIO now supports writing to and reading from
a stream larger than 2 GiB on 64-bit systems.
This commit is contained in:
parent
beaa3adae9
commit
276f1d5139
3 changed files with 96 additions and 32 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue