blob: 0a1eb43a31a746990dcf7a82a2416d2979169a0d [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
54
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030055class cPickleUnpicklerTests(AbstractUnpickleTests):
56
57 def loads(self, buf):
58 f = self.input(buf)
59 try:
60 p = cPickle.Unpickler(f)
61 return p.load()
62 finally:
63 self.close(f)
64
65 error = cPickle.BadPickleGet
66
67class cStringIOCUnpicklerTests(cStringIOMixin, cPickleUnpicklerTests):
68 pass
69
70class BytesIOCUnpicklerTests(BytesIOMixin, cPickleUnpicklerTests):
71 pass
72
73class FileIOCUnpicklerTests(FileIOMixin, cPickleUnpicklerTests):
74 pass
75
76
Jeremy Hylton66426532001-10-15 21:38:56 +000077class cPicklePicklerTests(AbstractPickleTests):
78
Tim Petersdcaa24e2003-01-28 22:26:28 +000079 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020080 f = self.output()
81 try:
82 p = cPickle.Pickler(f, proto)
83 p.dump(arg)
84 f.seek(0)
85 return f.read()
86 finally:
87 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000088
89 def loads(self, buf):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020090 f = self.input(buf)
91 try:
92 p = cPickle.Unpickler(f)
93 return p.load()
94 finally:
95 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000096
Serhiy Storchaka2556c832013-03-14 20:59:09 +020097class cStringIOCPicklerTests(cStringIOMixin, cPicklePicklerTests):
98 pass
99
100class BytesIOCPicklerTests(BytesIOMixin, cPicklePicklerTests):
101 pass
102
103class FileIOCPicklerTests(FileIOMixin, cPicklePicklerTests):
104 pass
105
106
Jeremy Hylton66426532001-10-15 21:38:56 +0000107class cPickleListPicklerTests(AbstractPickleTests):
108
Tim Petersdcaa24e2003-01-28 22:26:28 +0000109 def dumps(self, arg, proto=0):
110 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +0000111 p.dump(arg)
112 return p.getvalue()
113
114 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200115 f = self.input(args[0])
116 try:
117 p = cPickle.Unpickler(f)
118 return p.load()
119 finally:
120 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000121
122 error = cPickle.BadPickleGet
123
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200124class cStringIOCPicklerListTests(cStringIOMixin, cPickleListPicklerTests):
125 pass
126
127class BytesIOCPicklerListTests(BytesIOMixin, cPickleListPicklerTests):
128 pass
129
130class FileIOCPicklerListTests(FileIOMixin, cPickleListPicklerTests):
131 pass
132
133
Jeremy Hylton66426532001-10-15 21:38:56 +0000134class cPickleFastPicklerTests(AbstractPickleTests):
135
Tim Petersdcaa24e2003-01-28 22:26:28 +0000136 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200137 f = self.output()
138 try:
139 p = cPickle.Pickler(f, proto)
140 p.fast = 1
141 p.dump(arg)
142 f.seek(0)
143 return f.read()
144 finally:
145 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000146
147 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200148 f = self.input(args[0])
149 try:
150 p = cPickle.Unpickler(f)
151 return p.load()
152 finally:
153 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000154
Barry Warsaw52acb492001-12-21 20:04:22 +0000155 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +0000156 # If it's not cyclic, it should pickle OK even if the nesting
157 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
158 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
159 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +0000160 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +0000161 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +0000162 a = [a]
163 b = self.loads(self.dumps(a))
164 self.assertEqual(a, b)
165
Serhiy Storchakada87e452015-11-07 11:15:32 +0200166for name in dir(AbstractPickleTests):
167 if name.startswith('test_recursive_'):
168 func = getattr(AbstractPickleTests, name)
169 if '_subclass' in name and '_and_inst' not in name:
170 assert_args = RuntimeError, 'maximum recursion depth exceeded'
171 else:
172 assert_args = ValueError, "can't pickle cyclic objects"
173 def wrapper(self, func=func, assert_args=assert_args):
174 with self.assertRaisesRegexp(*assert_args):
175 func(self)
176 functools.update_wrapper(wrapper, func)
177 setattr(cPickleFastPicklerTests, name, wrapper)
178
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200179class cStringIOCPicklerFastTests(cStringIOMixin, cPickleFastPicklerTests):
180 pass
181
182class BytesIOCPicklerFastTests(BytesIOMixin, cPickleFastPicklerTests):
183 pass
184
185class FileIOCPicklerFastTests(FileIOMixin, cPickleFastPicklerTests):
186 pass
187
188
Collin Winterf8089c72009-04-09 16:46:46 +0000189class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
190
191 pickler_class = cPickle.Pickler
192 unpickler_class = cPickle.Unpickler
193
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200194class cPickleBigmemPickleTests(BigmemPickleTests):
195
196 def dumps(self, arg, proto=0, fast=0):
197 # Ignore fast
198 return cPickle.dumps(arg, proto)
199
200 def loads(self, buf):
201 # Ignore fast
202 return cPickle.loads(buf)
203
Collin Winterf8089c72009-04-09 16:46:46 +0000204
Facundo Batista9da18b32008-06-22 23:19:14 +0000205class Node(object):
206 pass
207
208class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000209 def test_issue2702(self):
210 # This should raise a RecursionLimit but in some
211 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
212 # or just silently terminates the interpreter (=crashes).
213 nodes = [Node() for i in range(500)]
214 for n in nodes:
215 n.connections = list(nodes)
216 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000217 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000218
219 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000220 # Safe test, because I broke this case when fixing the
221 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000222 res=[]
223 for x in range(1,2000):
224 res.append(dict(doc=x, similar=[]))
225 cPickle.dumps(res)
226
Facundo Batista9da18b32008-06-22 23:19:14 +0000227
Fred Drake694ed092001-12-19 16:42:15 +0000228def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000229 test_support.run_unittest(
230 cPickleTests,
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +0300231 cStringIOCUnpicklerTests,
232 BytesIOCUnpicklerTests,
233 FileIOCUnpicklerTests,
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200234 cStringIOCPicklerTests,
235 BytesIOCPicklerTests,
236 FileIOCPicklerTests,
237 cStringIOCPicklerListTests,
238 BytesIOCPicklerListTests,
239 FileIOCPicklerListTests,
240 cStringIOCPicklerFastTests,
241 BytesIOCPicklerFastTests,
242 FileIOCPicklerFastTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000243 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000244 cPicklePicklerUnpicklerObjectTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200245 cPickleBigmemPickleTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000246 )
Fred Drake694ed092001-12-19 16:42:15 +0000247
Jeremy Hylton66426532001-10-15 21:38:56 +0000248if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000249 test_main()