blob: f6b3347543c109e13b08bb74a82d43d6ed6a8404 [file] [log] [blame]
Serhiy Storchaka2556c832013-03-14 20:59:09 +02001import cPickle
2import cStringIO
3import io
4import unittest
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +03005from test.pickletester import (AbstractUnpickleTests,
6 AbstractPickleTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +02007 AbstractPickleModuleTests,
8 AbstractPicklerUnpicklerObjectTests,
9 BigmemPickleTests)
Barry Warsaw04f357c2002-07-23 19:04:11 +000010from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +000011
Serhiy Storchaka2556c832013-03-14 20:59:09 +020012class cStringIOMixin:
13 output = input = cStringIO.StringIO
14
15 def close(self, f):
16 pass
17
18class BytesIOMixin:
19 output = input = io.BytesIO
20
21 def close(self, f):
22 pass
23
24class FileIOMixin:
25
26 def output(self):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070027 return open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020028
29 def input(self, data):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070030 f = open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020031 try:
32 f.write(data)
33 f.seek(0)
34 return f
35 except:
36 f.close()
37 raise
38
39 def close(self, f):
40 f.close()
41 test_support.unlink(test_support.TESTFN)
42
43
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030044class cPickleTests(AbstractUnpickleTests, AbstractPickleTests,
45 AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +000046
Jeremy Hylton66426532001-10-15 21:38:56 +000047 def setUp(self):
48 self.dumps = cPickle.dumps
49 self.loads = cPickle.loads
50
51 error = cPickle.BadPickleGet
52 module = cPickle
53
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +030054class cPickleUnpicklerTests(AbstractUnpickleTests):
55
56 def loads(self, buf):
57 f = self.input(buf)
58 try:
59 p = cPickle.Unpickler(f)
60 return p.load()
61 finally:
62 self.close(f)
63
64 error = cPickle.BadPickleGet
65
66class cStringIOCUnpicklerTests(cStringIOMixin, cPickleUnpicklerTests):
67 pass
68
69class BytesIOCUnpicklerTests(BytesIOMixin, cPickleUnpicklerTests):
70 pass
71
72class FileIOCUnpicklerTests(FileIOMixin, cPickleUnpicklerTests):
73 pass
74
75
Jeremy Hylton66426532001-10-15 21:38:56 +000076class cPicklePicklerTests(AbstractPickleTests):
77
Tim Petersdcaa24e2003-01-28 22:26:28 +000078 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020079 f = self.output()
80 try:
81 p = cPickle.Pickler(f, proto)
82 p.dump(arg)
83 f.seek(0)
84 return f.read()
85 finally:
86 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000087
88 def loads(self, buf):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020089 f = self.input(buf)
90 try:
91 p = cPickle.Unpickler(f)
92 return p.load()
93 finally:
94 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000095
Serhiy Storchaka2556c832013-03-14 20:59:09 +020096class cStringIOCPicklerTests(cStringIOMixin, cPicklePicklerTests):
97 pass
98
99class BytesIOCPicklerTests(BytesIOMixin, cPicklePicklerTests):
100 pass
101
102class FileIOCPicklerTests(FileIOMixin, cPicklePicklerTests):
103 pass
104
105
Jeremy Hylton66426532001-10-15 21:38:56 +0000106class cPickleListPicklerTests(AbstractPickleTests):
107
Tim Petersdcaa24e2003-01-28 22:26:28 +0000108 def dumps(self, arg, proto=0):
109 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +0000110 p.dump(arg)
111 return p.getvalue()
112
113 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200114 f = self.input(args[0])
115 try:
116 p = cPickle.Unpickler(f)
117 return p.load()
118 finally:
119 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000120
121 error = cPickle.BadPickleGet
122
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200123class cStringIOCPicklerListTests(cStringIOMixin, cPickleListPicklerTests):
124 pass
125
126class BytesIOCPicklerListTests(BytesIOMixin, cPickleListPicklerTests):
127 pass
128
129class FileIOCPicklerListTests(FileIOMixin, cPickleListPicklerTests):
130 pass
131
132
Jeremy Hylton66426532001-10-15 21:38:56 +0000133class cPickleFastPicklerTests(AbstractPickleTests):
134
Tim Petersdcaa24e2003-01-28 22:26:28 +0000135 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200136 f = self.output()
137 try:
138 p = cPickle.Pickler(f, proto)
139 p.fast = 1
140 p.dump(arg)
141 f.seek(0)
142 return f.read()
143 finally:
144 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000145
146 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200147 f = self.input(args[0])
148 try:
149 p = cPickle.Unpickler(f)
150 return p.load()
151 finally:
152 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000153
Jeremy Hylton66426532001-10-15 21:38:56 +0000154 def test_recursive_list(self):
155 self.assertRaises(ValueError,
156 AbstractPickleTests.test_recursive_list,
157 self)
158
Collin Winter57bef682009-05-26 04:12:39 +0000159 def test_recursive_tuple(self):
160 self.assertRaises(ValueError,
161 AbstractPickleTests.test_recursive_tuple,
162 self)
163
Jeremy Hylton66426532001-10-15 21:38:56 +0000164 def test_recursive_inst(self):
165 self.assertRaises(ValueError,
166 AbstractPickleTests.test_recursive_inst,
167 self)
168
169 def test_recursive_dict(self):
170 self.assertRaises(ValueError,
171 AbstractPickleTests.test_recursive_dict,
172 self)
173
174 def test_recursive_multi(self):
175 self.assertRaises(ValueError,
176 AbstractPickleTests.test_recursive_multi,
177 self)
178
Barry Warsaw52acb492001-12-21 20:04:22 +0000179 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +0000180 # If it's not cyclic, it should pickle OK even if the nesting
181 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
182 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
183 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +0000184 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +0000185 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +0000186 a = [a]
187 b = self.loads(self.dumps(a))
188 self.assertEqual(a, b)
189
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200190class cStringIOCPicklerFastTests(cStringIOMixin, cPickleFastPicklerTests):
191 pass
192
193class BytesIOCPicklerFastTests(BytesIOMixin, cPickleFastPicklerTests):
194 pass
195
196class FileIOCPicklerFastTests(FileIOMixin, cPickleFastPicklerTests):
197 pass
198
199
Collin Winterf8089c72009-04-09 16:46:46 +0000200class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
201
202 pickler_class = cPickle.Pickler
203 unpickler_class = cPickle.Unpickler
204
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200205class cPickleBigmemPickleTests(BigmemPickleTests):
206
207 def dumps(self, arg, proto=0, fast=0):
208 # Ignore fast
209 return cPickle.dumps(arg, proto)
210
211 def loads(self, buf):
212 # Ignore fast
213 return cPickle.loads(buf)
214
Collin Winterf8089c72009-04-09 16:46:46 +0000215
Facundo Batista9da18b32008-06-22 23:19:14 +0000216class Node(object):
217 pass
218
219class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000220 def test_issue2702(self):
221 # This should raise a RecursionLimit but in some
222 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
223 # or just silently terminates the interpreter (=crashes).
224 nodes = [Node() for i in range(500)]
225 for n in nodes:
226 n.connections = list(nodes)
227 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000228 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000229
230 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000231 # Safe test, because I broke this case when fixing the
232 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000233 res=[]
234 for x in range(1,2000):
235 res.append(dict(doc=x, similar=[]))
236 cPickle.dumps(res)
237
Facundo Batista9da18b32008-06-22 23:19:14 +0000238
Fred Drake694ed092001-12-19 16:42:15 +0000239def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000240 test_support.run_unittest(
241 cPickleTests,
Serhiy Storchaka4d2cf552015-09-29 15:36:28 +0300242 cStringIOCUnpicklerTests,
243 BytesIOCUnpicklerTests,
244 FileIOCUnpicklerTests,
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200245 cStringIOCPicklerTests,
246 BytesIOCPicklerTests,
247 FileIOCPicklerTests,
248 cStringIOCPicklerListTests,
249 BytesIOCPicklerListTests,
250 FileIOCPicklerListTests,
251 cStringIOCPicklerFastTests,
252 BytesIOCPicklerFastTests,
253 FileIOCPicklerFastTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000254 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000255 cPicklePicklerUnpicklerObjectTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200256 cPickleBigmemPickleTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000257 )
Fred Drake694ed092001-12-19 16:42:15 +0000258
Jeremy Hylton66426532001-10-15 21:38:56 +0000259if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000260 test_main()