blob: fff2b8052f8cae72a2342efd2544832d8b0b1ca5 [file] [log] [blame]
Serhiy Storchaka2556c832013-03-14 20:59:09 +02001import cPickle
2import cStringIO
3import io
Serhiy Storchakada87e452015-11-07 11:15:32 +02004import functools
Serhiy Storchaka2556c832013-03-14 20:59:09 +02005import unittest
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +03006from test.pickletester import (AbstractUnpickleTests,
7 AbstractPickleTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +02008 AbstractPickleModuleTests,
9 AbstractPicklerUnpicklerObjectTests,
10 BigmemPickleTests)
Barry Warsaw04f357c2002-07-23 19:04:11 +000011from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +000012
Serhiy Storchaka2556c832013-03-14 20:59:09 +020013class cStringIOMixin:
14 output = input = cStringIO.StringIO
15
16 def close(self, f):
17 pass
18
19class BytesIOMixin:
20 output = input = io.BytesIO
21
22 def close(self, f):
23 pass
24
25class FileIOMixin:
26
27 def output(self):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070028 return open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020029
30 def input(self, data):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070031 f = open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020032 try:
33 f.write(data)
34 f.seek(0)
35 return f
36 except:
37 f.close()
38 raise
39
40 def close(self, f):
41 f.close()
42 test_support.unlink(test_support.TESTFN)
43
44
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030045class cPickleTests(AbstractUnpickleTests, AbstractPickleTests,
46 AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +000047
Jeremy Hylton66426532001-10-15 21:38:56 +000048 def setUp(self):
49 self.dumps = cPickle.dumps
50 self.loads = cPickle.loads
51
52 error = cPickle.BadPickleGet
53 module = cPickle
Serhiy Storchaka5c137662015-11-23 15:20:43 +020054 bad_stack_errors = (cPickle.UnpicklingError,)
Jeremy Hylton66426532001-10-15 21:38:56 +000055
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030056class cPickleUnpicklerTests(AbstractUnpickleTests):
57
58 def loads(self, buf):
59 f = self.input(buf)
60 try:
61 p = cPickle.Unpickler(f)
62 return p.load()
63 finally:
64 self.close(f)
65
66 error = cPickle.BadPickleGet
Serhiy Storchaka5c137662015-11-23 15:20:43 +020067 bad_stack_errors = (cPickle.UnpicklingError,)
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030068
69class cStringIOCUnpicklerTests(cStringIOMixin, cPickleUnpicklerTests):
70 pass
71
72class BytesIOCUnpicklerTests(BytesIOMixin, cPickleUnpicklerTests):
73 pass
74
75class FileIOCUnpicklerTests(FileIOMixin, cPickleUnpicklerTests):
76 pass
77
78
Jeremy Hylton66426532001-10-15 21:38:56 +000079class cPicklePicklerTests(AbstractPickleTests):
80
Tim Petersdcaa24e2003-01-28 22:26:28 +000081 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020082 f = self.output()
83 try:
84 p = cPickle.Pickler(f, proto)
85 p.dump(arg)
86 f.seek(0)
87 return f.read()
88 finally:
89 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000090
91 def loads(self, buf):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020092 f = self.input(buf)
93 try:
94 p = cPickle.Unpickler(f)
95 return p.load()
96 finally:
97 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000098
Serhiy Storchaka2556c832013-03-14 20:59:09 +020099class cStringIOCPicklerTests(cStringIOMixin, cPicklePicklerTests):
100 pass
101
102class BytesIOCPicklerTests(BytesIOMixin, cPicklePicklerTests):
103 pass
104
105class FileIOCPicklerTests(FileIOMixin, cPicklePicklerTests):
106 pass
107
108
Jeremy Hylton66426532001-10-15 21:38:56 +0000109class cPickleListPicklerTests(AbstractPickleTests):
110
Tim Petersdcaa24e2003-01-28 22:26:28 +0000111 def dumps(self, arg, proto=0):
112 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +0000113 p.dump(arg)
114 return p.getvalue()
115
116 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200117 f = self.input(args[0])
118 try:
119 p = cPickle.Unpickler(f)
120 return p.load()
121 finally:
122 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000123
124 error = cPickle.BadPickleGet
125
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200126class cStringIOCPicklerListTests(cStringIOMixin, cPickleListPicklerTests):
127 pass
128
129class BytesIOCPicklerListTests(BytesIOMixin, cPickleListPicklerTests):
130 pass
131
132class FileIOCPicklerListTests(FileIOMixin, cPickleListPicklerTests):
133 pass
134
135
Jeremy Hylton66426532001-10-15 21:38:56 +0000136class cPickleFastPicklerTests(AbstractPickleTests):
137
Tim Petersdcaa24e2003-01-28 22:26:28 +0000138 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200139 f = self.output()
140 try:
141 p = cPickle.Pickler(f, proto)
142 p.fast = 1
143 p.dump(arg)
144 f.seek(0)
145 return f.read()
146 finally:
147 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000148
149 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200150 f = self.input(args[0])
151 try:
152 p = cPickle.Unpickler(f)
153 return p.load()
154 finally:
155 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000156
Barry Warsaw52acb492001-12-21 20:04:22 +0000157 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +0000158 # If it's not cyclic, it should pickle OK even if the nesting
159 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
160 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
161 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +0000162 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +0000163 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +0000164 a = [a]
165 b = self.loads(self.dumps(a))
166 self.assertEqual(a, b)
167
Serhiy Storchakada87e452015-11-07 11:15:32 +0200168for name in dir(AbstractPickleTests):
169 if name.startswith('test_recursive_'):
170 func = getattr(AbstractPickleTests, name)
171 if '_subclass' in name and '_and_inst' not in name:
172 assert_args = RuntimeError, 'maximum recursion depth exceeded'
173 else:
174 assert_args = ValueError, "can't pickle cyclic objects"
175 def wrapper(self, func=func, assert_args=assert_args):
176 with self.assertRaisesRegexp(*assert_args):
177 func(self)
178 functools.update_wrapper(wrapper, func)
179 setattr(cPickleFastPicklerTests, name, wrapper)
180
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200181class cStringIOCPicklerFastTests(cStringIOMixin, cPickleFastPicklerTests):
182 pass
183
184class BytesIOCPicklerFastTests(BytesIOMixin, cPickleFastPicklerTests):
185 pass
186
187class FileIOCPicklerFastTests(FileIOMixin, cPickleFastPicklerTests):
188 pass
189
190
Collin Winterf8089c72009-04-09 16:46:46 +0000191class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
192
193 pickler_class = cPickle.Pickler
194 unpickler_class = cPickle.Unpickler
195
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200196class cPickleBigmemPickleTests(BigmemPickleTests):
197
198 def dumps(self, arg, proto=0, fast=0):
199 # Ignore fast
200 return cPickle.dumps(arg, proto)
201
202 def loads(self, buf):
203 # Ignore fast
204 return cPickle.loads(buf)
205
Collin Winterf8089c72009-04-09 16:46:46 +0000206
Facundo Batista9da18b32008-06-22 23:19:14 +0000207class Node(object):
208 pass
209
210class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000211 def test_issue2702(self):
212 # This should raise a RecursionLimit but in some
213 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
214 # or just silently terminates the interpreter (=crashes).
215 nodes = [Node() for i in range(500)]
216 for n in nodes:
217 n.connections = list(nodes)
218 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000219 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000220
221 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000222 # Safe test, because I broke this case when fixing the
223 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000224 res=[]
225 for x in range(1,2000):
226 res.append(dict(doc=x, similar=[]))
227 cPickle.dumps(res)
228
Facundo Batista9da18b32008-06-22 23:19:14 +0000229
Fred Drake694ed092001-12-19 16:42:15 +0000230def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000231 test_support.run_unittest(
232 cPickleTests,
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +0300233 cStringIOCUnpicklerTests,
234 BytesIOCUnpicklerTests,
235 FileIOCUnpicklerTests,
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200236 cStringIOCPicklerTests,
237 BytesIOCPicklerTests,
238 FileIOCPicklerTests,
239 cStringIOCPicklerListTests,
240 BytesIOCPicklerListTests,
241 FileIOCPicklerListTests,
242 cStringIOCPicklerFastTests,
243 BytesIOCPicklerFastTests,
244 FileIOCPicklerFastTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000245 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000246 cPicklePicklerUnpicklerObjectTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200247 cPickleBigmemPickleTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000248 )
Fred Drake694ed092001-12-19 16:42:15 +0000249
Jeremy Hylton66426532001-10-15 21:38:56 +0000250if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000251 test_main()