blob: c63ca3e0f6849ae158f5453addb83d342d37c9fd [file] [log] [blame]
Facundo Batista9da18b32008-06-22 23:19:14 +00001import cPickle, unittest
Jeremy Hylton66426532001-10-15 21:38:56 +00002from cStringIO import StringIO
Neal Norwitzcdb79482006-03-24 08:58:38 +00003from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +00005
6class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +00007
Jeremy Hylton66426532001-10-15 21:38:56 +00008 def setUp(self):
9 self.dumps = cPickle.dumps
10 self.loads = cPickle.loads
11
12 error = cPickle.BadPickleGet
13 module = cPickle
14
15class cPicklePicklerTests(AbstractPickleTests):
16
Tim Petersdcaa24e2003-01-28 22:26:28 +000017 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000018 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000019 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000020 p.dump(arg)
21 f.seek(0)
22 return f.read()
23
24 def loads(self, buf):
25 f = StringIO(buf)
26 p = cPickle.Unpickler(f)
27 return p.load()
28
29 error = cPickle.BadPickleGet
30
31class cPickleListPicklerTests(AbstractPickleTests):
32
Tim Petersdcaa24e2003-01-28 22:26:28 +000033 def dumps(self, arg, proto=0):
34 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000035 p.dump(arg)
36 return p.getvalue()
37
38 def loads(self, *args):
39 f = StringIO(args[0])
40 p = cPickle.Unpickler(f)
41 return p.load()
42
43 error = cPickle.BadPickleGet
44
45class cPickleFastPicklerTests(AbstractPickleTests):
46
Tim Petersdcaa24e2003-01-28 22:26:28 +000047 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000048 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000049 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000050 p.fast = 1
51 p.dump(arg)
52 f.seek(0)
53 return f.read()
54
55 def loads(self, *args):
56 f = StringIO(args[0])
57 p = cPickle.Unpickler(f)
58 return p.load()
59
60 error = cPickle.BadPickleGet
61
62 def test_recursive_list(self):
63 self.assertRaises(ValueError,
64 AbstractPickleTests.test_recursive_list,
65 self)
66
Collin Wintere9a65142009-05-26 05:37:22 +000067 def test_recursive_tuple(self):
68 self.assertRaises(ValueError,
69 AbstractPickleTests.test_recursive_tuple,
70 self)
71
Jeremy Hylton66426532001-10-15 21:38:56 +000072 def test_recursive_inst(self):
73 self.assertRaises(ValueError,
74 AbstractPickleTests.test_recursive_inst,
75 self)
76
77 def test_recursive_dict(self):
78 self.assertRaises(ValueError,
79 AbstractPickleTests.test_recursive_dict,
80 self)
81
82 def test_recursive_multi(self):
83 self.assertRaises(ValueError,
84 AbstractPickleTests.test_recursive_multi,
85 self)
86
Barry Warsaw52acb492001-12-21 20:04:22 +000087 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +000088 # If it's not cyclic, it should pickle OK even if the nesting
89 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
90 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
91 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +000092 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +000093 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +000094 a = [a]
95 b = self.loads(self.dumps(a))
96 self.assertEqual(a, b)
97
Facundo Batista9da18b32008-06-22 23:19:14 +000098class Node(object):
99 pass
100
101class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000102 def test_issue2702(self):
103 # This should raise a RecursionLimit but in some
104 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
105 # or just silently terminates the interpreter (=crashes).
106 nodes = [Node() for i in range(500)]
107 for n in nodes:
108 n.connections = list(nodes)
109 n.connections.remove(n)
Ezio Melottif747aa42009-12-18 20:23:24 +0000110 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000111
112 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000113 # Safe test, because I broke this case when fixing the
114 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000115 res=[]
116 for x in range(1,2000):
117 res.append(dict(doc=x, similar=[]))
118 cPickle.dumps(res)
119
Facundo Batista9da18b32008-06-22 23:19:14 +0000120
Fred Drake694ed092001-12-19 16:42:15 +0000121def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000122 test_support.run_unittest(
123 cPickleTests,
124 cPicklePicklerTests,
125 cPickleListPicklerTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000126 cPickleFastPicklerTests,
127 cPickleDeepRecursive,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000128 )
Fred Drake694ed092001-12-19 16:42:15 +0000129
Jeremy Hylton66426532001-10-15 21:38:56 +0000130if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000131 test_main()