summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-03-14 18:59:09 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-03-14 18:59:09 (GMT)
commit2556c8388c950cd5d41d57251c1471c7bed3bb4b (patch)
treef5a898311647b3f398f8303bb44f5a022086470d
parent69c66f9a431e32df9e713eee1021ef1954a9be60 (diff)
downloadcpython-2556c8388c950cd5d41d57251c1471c7bed3bb4b.zip
cpython-2556c8388c950cd5d41d57251c1471c7bed3bb4b.tar.gz
cpython-2556c8388c950cd5d41d57251c1471c7bed3bb4b.tar.bz2
Issue #17299: Add test coverage for cPickle with file objects and general IO
objects. Original patch by Aman Shah.
-rw-r--r--Lib/test/test_cpickle.py135
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
3 files changed, 114 insertions, 25 deletions
diff --git a/Lib/test/test_cpickle.py b/Lib/test/test_cpickle.py
index beea318..702e0c9 100644
--- a/Lib/test/test_cpickle.py
+++ b/Lib/test/test_cpickle.py
@@ -1,11 +1,45 @@
-import cPickle, unittest
-from cStringIO import StringIO
+import cPickle
+import cStringIO
+import io
+import unittest
from test.pickletester import (AbstractPickleTests,
AbstractPickleModuleTests,
AbstractPicklerUnpicklerObjectTests,
BigmemPickleTests)
from test import test_support
+class cStringIOMixin:
+ output = input = cStringIO.StringIO
+
+ def close(self, f):
+ pass
+
+class BytesIOMixin:
+ output = input = io.BytesIO
+
+ def close(self, f):
+ pass
+
+class FileIOMixin:
+
+ def output(self):
+ return open(test_support.TESTFN, 'w+')
+
+ def input(self, data):
+ f = open(test_support.TESTFN, 'w+')
+ try:
+ f.write(data)
+ f.seek(0)
+ return f
+ except:
+ f.close()
+ raise
+
+ def close(self, f):
+ f.close()
+ test_support.unlink(test_support.TESTFN)
+
+
class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
def setUp(self):
@@ -18,19 +52,35 @@ class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
class cPicklePicklerTests(AbstractPickleTests):
def dumps(self, arg, proto=0):
- f = StringIO()
- p = cPickle.Pickler(f, proto)
- p.dump(arg)
- f.seek(0)
- return f.read()
+ f = self.output()
+ try:
+ p = cPickle.Pickler(f, proto)
+ p.dump(arg)
+ f.seek(0)
+ return f.read()
+ finally:
+ self.close(f)
def loads(self, buf):
- f = StringIO(buf)
- p = cPickle.Unpickler(f)
- return p.load()
+ f = self.input(buf)
+ try:
+ p = cPickle.Unpickler(f)
+ return p.load()
+ finally:
+ self.close(f)
error = cPickle.BadPickleGet
+class cStringIOCPicklerTests(cStringIOMixin, cPicklePicklerTests):
+ pass
+
+class BytesIOCPicklerTests(BytesIOMixin, cPicklePicklerTests):
+ pass
+
+class FileIOCPicklerTests(FileIOMixin, cPicklePicklerTests):
+ pass
+
+
class cPickleListPicklerTests(AbstractPickleTests):
def dumps(self, arg, proto=0):
@@ -39,26 +89,45 @@ class cPickleListPicklerTests(AbstractPickleTests):
return p.getvalue()
def loads(self, *args):
- f = StringIO(args[0])
- p = cPickle.Unpickler(f)
- return p.load()
+ f = self.input(args[0])
+ try:
+ p = cPickle.Unpickler(f)
+ return p.load()
+ finally:
+ self.close(f)
error = cPickle.BadPickleGet
+class cStringIOCPicklerListTests(cStringIOMixin, cPickleListPicklerTests):
+ pass
+
+class BytesIOCPicklerListTests(BytesIOMixin, cPickleListPicklerTests):
+ pass
+
+class FileIOCPicklerListTests(FileIOMixin, cPickleListPicklerTests):
+ pass
+
+
class cPickleFastPicklerTests(AbstractPickleTests):
def dumps(self, arg, proto=0):
- f = StringIO()
- p = cPickle.Pickler(f, proto)
- p.fast = 1
- p.dump(arg)
- f.seek(0)
- return f.read()
+ f = self.output()
+ try:
+ p = cPickle.Pickler(f, proto)
+ p.fast = 1
+ p.dump(arg)
+ f.seek(0)
+ return f.read()
+ finally:
+ self.close(f)
def loads(self, *args):
- f = StringIO(args[0])
- p = cPickle.Unpickler(f)
- return p.load()
+ f = self.input(args[0])
+ try:
+ p = cPickle.Unpickler(f)
+ return p.load()
+ finally:
+ self.close(f)
error = cPickle.BadPickleGet
@@ -98,6 +167,16 @@ class cPickleFastPicklerTests(AbstractPickleTests):
b = self.loads(self.dumps(a))
self.assertEqual(a, b)
+class cStringIOCPicklerFastTests(cStringIOMixin, cPickleFastPicklerTests):
+ pass
+
+class BytesIOCPicklerFastTests(BytesIOMixin, cPickleFastPicklerTests):
+ pass
+
+class FileIOCPicklerFastTests(FileIOMixin, cPickleFastPicklerTests):
+ pass
+
+
class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
pickler_class = cPickle.Pickler
@@ -140,9 +219,15 @@ class cPickleDeepRecursive(unittest.TestCase):
def test_main():
test_support.run_unittest(
cPickleTests,
- cPicklePicklerTests,
- cPickleListPicklerTests,
- cPickleFastPicklerTests,
+ cStringIOCPicklerTests,
+ BytesIOCPicklerTests,
+ FileIOCPicklerTests,
+ cStringIOCPicklerListTests,
+ BytesIOCPicklerListTests,
+ FileIOCPicklerListTests,
+ cStringIOCPicklerFastTests,
+ BytesIOCPicklerFastTests,
+ FileIOCPicklerFastTests,
cPickleDeepRecursive,
cPicklePicklerUnpicklerObjectTests,
cPickleBigmemPickleTests,
diff --git a/Misc/ACKS b/Misc/ACKS
index 75e31bf..593ba4d 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -910,6 +910,7 @@ Jerry Seutter
Pete Sevander
Denis Severson
Ian Seyer
+Aman Shah
Ha Shao
Mark Shannon
Richard Shapiro
diff --git a/Misc/NEWS b/Misc/NEWS
index d861538..ae0402b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -816,6 +816,9 @@ Extension Modules
Tests
-----
+- Issue #17299: Add test coverage for cPickle with file objects and general IO
+ objects. Original patch by Aman Shah.
+
- Issue #11963: remove human verification from test_parser and test_subprocess.
- Issue #17249: convert a test in test_capi to use unittest and reap threads.