/Lib/test/test_cpickle.py
http://unladen-swallow.googlecode.com/ · Python · 141 lines · 126 code · 13 blank · 2 comment · 0 complexity · 7b99ae1db4819f71b3e21b280581dda3 MD5 · raw file
- import cPickle, unittest
- from cStringIO import StringIO
- from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
- from test.pickletester import AbstractPicklerUnpicklerObjectTests
- from test import test_support
- class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
- def setUp(self):
- self.dumps = cPickle.dumps
- self.loads = cPickle.loads
- self.load = cPickle.load
- self.dump = cPickle.dump
- error = cPickle.BadPickleGet
- module = cPickle
- class cPickleAbstractPicklerTests(AbstractPickleTests):
- """Common methods for TestCase classes testing cPickle.Pickler variants."""
- error = cPickle.BadPickleGet
- def loads(self, buf):
- f = StringIO(buf)
- p = cPickle.Unpickler(f)
- return p.load()
- def load(self, buf):
- p = cPickle.Unpickler(buf)
- return p.load()
- class cPickleFilePicklerTests(cPickleAbstractPicklerTests):
- """Test pickling to a file"""
- def dumps(self, arg, proto=0):
- f = StringIO()
- p = cPickle.Pickler(f, proto)
- p.dump(arg)
- f.seek(0)
- return f.read()
- class cPickleInternalBufferPicklerTests(cPickleAbstractPicklerTests):
- """Test pickling to the Pickler's internal buffer."""
- def dumps(self, arg, proto=0):
- p = cPickle.Pickler(proto)
- p.dump(arg)
- return p.getvalue()
- class cPickleFastPicklerTests(cPickleAbstractPicklerTests):
- """Test pickling in fast mode (ie, no recursive data structures)."""
- def dumps(self, arg, proto=0):
- f = StringIO()
- p = cPickle.Pickler(f, proto)
- p.fast = True
- p.dump(arg)
- f.seek(0)
- return f.read()
- def test_recursive_list(self):
- self.assertRaises(ValueError,
- AbstractPickleTests.test_recursive_list,
- self)
- def test_recursive_tuple(self):
- self.assertRaises(ValueError,
- AbstractPickleTests.test_recursive_tuple,
- self)
- def test_recursive_inst(self):
- self.assertRaises(ValueError,
- AbstractPickleTests.test_recursive_inst,
- self)
- def test_recursive_dict(self):
- self.assertRaises(ValueError,
- AbstractPickleTests.test_recursive_dict,
- self)
- def test_recursive_multi(self):
- self.assertRaises(ValueError,
- AbstractPickleTests.test_recursive_multi,
- self)
- def test_nonrecursive_deep(self):
- # If it's not cyclic, it should pickle OK even if the nesting
- # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
- # 50 today. Jack Jansen reported stack overflow on Mac OS 9
- # at 64.
- a = []
- for i in range(60):
- a = [a]
- b = self.loads(self.dumps(a))
- self.assertEqual(a, b)
- class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
- pickler_class = cPickle.Pickler
- unpickler_class = cPickle.Unpickler
- class Node(object):
- pass
- class cPickleDeepRecursive(unittest.TestCase):
- def test_issue2702(self):
- # This should raise a RecursionLimit but in some
- # platforms (FreeBSD, win32) sometimes raises KeyError instead,
- # or just silently terminates the interpreter (=crashes).
- nodes = [Node() for i in range(500)]
- for n in nodes:
- n.connections = list(nodes)
- n.connections.remove(n)
- self.assertRaises(RuntimeError, cPickle.dumps, n)
- def test_issue3179(self):
- # Safe test, because I broke this case when fixing the
- # behaviour for the previous test.
- res=[]
- for x in range(1,2000):
- res.append(dict(doc=x, similar=[]))
- cPickle.dumps(res)
- def test_main():
- test_support.run_unittest(
- cPickleTests,
- cPickleFilePicklerTests,
- cPickleInternalBufferPicklerTests,
- cPickleFastPicklerTests,
- cPickleDeepRecursive,
- cPicklePicklerUnpicklerObjectTests,
- )
- if __name__ == "__main__":
- test_main()