blob: beea3180e3dbdac02afeace18c316ea1bca9764d [file] [log] [blame]
Facundo Batista9da18b32008-06-22 23:19:14 +00001import cPickle, unittest
Jeremy Hylton66426532001-10-15 21:38:56 +00002from cStringIO import StringIO
Serhiy Storchakacdc7a912013-02-12 21:36:47 +02003from test.pickletester import (AbstractPickleTests,
4 AbstractPickleModuleTests,
5 AbstractPicklerUnpicklerObjectTests,
6 BigmemPickleTests)
Barry Warsaw04f357c2002-07-23 19:04:11 +00007from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +00008
9class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +000010
Jeremy Hylton66426532001-10-15 21:38:56 +000011 def setUp(self):
12 self.dumps = cPickle.dumps
13 self.loads = cPickle.loads
14
15 error = cPickle.BadPickleGet
16 module = cPickle
17
18class cPicklePicklerTests(AbstractPickleTests):
19
Tim Petersdcaa24e2003-01-28 22:26:28 +000020 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000021 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000022 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000023 p.dump(arg)
24 f.seek(0)
25 return f.read()
26
27 def loads(self, buf):
28 f = StringIO(buf)
29 p = cPickle.Unpickler(f)
30 return p.load()
31
32 error = cPickle.BadPickleGet
33
34class cPickleListPicklerTests(AbstractPickleTests):
35
Tim Petersdcaa24e2003-01-28 22:26:28 +000036 def dumps(self, arg, proto=0):
37 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000038 p.dump(arg)
39 return p.getvalue()
40
41 def loads(self, *args):
42 f = StringIO(args[0])
43 p = cPickle.Unpickler(f)
44 return p.load()
45
46 error = cPickle.BadPickleGet
47
48class cPickleFastPicklerTests(AbstractPickleTests):
49
Tim Petersdcaa24e2003-01-28 22:26:28 +000050 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000051 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000052 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000053 p.fast = 1
54 p.dump(arg)
55 f.seek(0)
56 return f.read()
57
58 def loads(self, *args):
59 f = StringIO(args[0])
60 p = cPickle.Unpickler(f)
61 return p.load()
62
63 error = cPickle.BadPickleGet
64
65 def test_recursive_list(self):
66 self.assertRaises(ValueError,
67 AbstractPickleTests.test_recursive_list,
68 self)
69
Collin Winter57bef682009-05-26 04:12:39 +000070 def test_recursive_tuple(self):
71 self.assertRaises(ValueError,
72 AbstractPickleTests.test_recursive_tuple,
73 self)
74
Jeremy Hylton66426532001-10-15 21:38:56 +000075 def test_recursive_inst(self):
76 self.assertRaises(ValueError,
77 AbstractPickleTests.test_recursive_inst,
78 self)
79
80 def test_recursive_dict(self):
81 self.assertRaises(ValueError,
82 AbstractPickleTests.test_recursive_dict,
83 self)
84
85 def test_recursive_multi(self):
86 self.assertRaises(ValueError,
87 AbstractPickleTests.test_recursive_multi,
88 self)
89
Barry Warsaw52acb492001-12-21 20:04:22 +000090 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +000091 # If it's not cyclic, it should pickle OK even if the nesting
92 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
93 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
94 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +000095 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +000096 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +000097 a = [a]
98 b = self.loads(self.dumps(a))
99 self.assertEqual(a, b)
100
Collin Winterf8089c72009-04-09 16:46:46 +0000101class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
102
103 pickler_class = cPickle.Pickler
104 unpickler_class = cPickle.Unpickler
105
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200106class cPickleBigmemPickleTests(BigmemPickleTests):
107
108 def dumps(self, arg, proto=0, fast=0):
109 # Ignore fast
110 return cPickle.dumps(arg, proto)
111
112 def loads(self, buf):
113 # Ignore fast
114 return cPickle.loads(buf)
115
Collin Winterf8089c72009-04-09 16:46:46 +0000116
Facundo Batista9da18b32008-06-22 23:19:14 +0000117class Node(object):
118 pass
119
120class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000121 def test_issue2702(self):
122 # This should raise a RecursionLimit but in some
123 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
124 # or just silently terminates the interpreter (=crashes).
125 nodes = [Node() for i in range(500)]
126 for n in nodes:
127 n.connections = list(nodes)
128 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000129 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000130
131 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000132 # Safe test, because I broke this case when fixing the
133 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000134 res=[]
135 for x in range(1,2000):
136 res.append(dict(doc=x, similar=[]))
137 cPickle.dumps(res)
138
Facundo Batista9da18b32008-06-22 23:19:14 +0000139
Fred Drake694ed092001-12-19 16:42:15 +0000140def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000141 test_support.run_unittest(
142 cPickleTests,
143 cPicklePicklerTests,
144 cPickleListPicklerTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000145 cPickleFastPicklerTests,
146 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000147 cPicklePicklerUnpicklerObjectTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200148 cPickleBigmemPickleTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000149 )
Fred Drake694ed092001-12-19 16:42:15 +0000150
Jeremy Hylton66426532001-10-15 21:38:56 +0000151if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000152 test_main()