blob: 3bc700b1fb8a59f1e5be8636afff9a3374306e9b [file] [log] [blame]
Serhiy Storchaka2556c832013-03-14 20:59:09 +02001import cPickle
2import cStringIO
3import io
4import unittest
Serhiy Storchakacdc7a912013-02-12 21:36:47 +02005from test.pickletester import (AbstractPickleTests,
6 AbstractPickleModuleTests,
7 AbstractPicklerUnpicklerObjectTests,
8 BigmemPickleTests)
Barry Warsaw04f357c2002-07-23 19:04:11 +00009from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +000010
Serhiy Storchaka2556c832013-03-14 20:59:09 +020011class cStringIOMixin:
12 output = input = cStringIO.StringIO
13
14 def close(self, f):
15 pass
16
17class BytesIOMixin:
18 output = input = io.BytesIO
19
20 def close(self, f):
21 pass
22
23class FileIOMixin:
24
25 def output(self):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070026 return open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020027
28 def input(self, data):
Benjamin Petersonbebf75f2013-03-17 21:28:29 -070029 f = open(test_support.TESTFN, 'wb+')
Serhiy Storchaka2556c832013-03-14 20:59:09 +020030 try:
31 f.write(data)
32 f.seek(0)
33 return f
34 except:
35 f.close()
36 raise
37
38 def close(self, f):
39 f.close()
40 test_support.unlink(test_support.TESTFN)
41
42
Jeremy Hylton66426532001-10-15 21:38:56 +000043class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +000044
Jeremy Hylton66426532001-10-15 21:38:56 +000045 def setUp(self):
46 self.dumps = cPickle.dumps
47 self.loads = cPickle.loads
48
49 error = cPickle.BadPickleGet
50 module = cPickle
51
52class cPicklePicklerTests(AbstractPickleTests):
53
Tim Petersdcaa24e2003-01-28 22:26:28 +000054 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020055 f = self.output()
56 try:
57 p = cPickle.Pickler(f, proto)
58 p.dump(arg)
59 f.seek(0)
60 return f.read()
61 finally:
62 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000063
64 def loads(self, buf):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020065 f = self.input(buf)
66 try:
67 p = cPickle.Unpickler(f)
68 return p.load()
69 finally:
70 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000071
72 error = cPickle.BadPickleGet
73
Serhiy Storchaka2556c832013-03-14 20:59:09 +020074class cStringIOCPicklerTests(cStringIOMixin, cPicklePicklerTests):
75 pass
76
77class BytesIOCPicklerTests(BytesIOMixin, cPicklePicklerTests):
78 pass
79
80class FileIOCPicklerTests(FileIOMixin, cPicklePicklerTests):
81 pass
82
83
Jeremy Hylton66426532001-10-15 21:38:56 +000084class cPickleListPicklerTests(AbstractPickleTests):
85
Tim Petersdcaa24e2003-01-28 22:26:28 +000086 def dumps(self, arg, proto=0):
87 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000088 p.dump(arg)
89 return p.getvalue()
90
91 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +020092 f = self.input(args[0])
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
99 error = cPickle.BadPickleGet
100
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200101class cStringIOCPicklerListTests(cStringIOMixin, cPickleListPicklerTests):
102 pass
103
104class BytesIOCPicklerListTests(BytesIOMixin, cPickleListPicklerTests):
105 pass
106
107class FileIOCPicklerListTests(FileIOMixin, cPickleListPicklerTests):
108 pass
109
110
Jeremy Hylton66426532001-10-15 21:38:56 +0000111class cPickleFastPicklerTests(AbstractPickleTests):
112
Tim Petersdcaa24e2003-01-28 22:26:28 +0000113 def dumps(self, arg, proto=0):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200114 f = self.output()
115 try:
116 p = cPickle.Pickler(f, proto)
117 p.fast = 1
118 p.dump(arg)
119 f.seek(0)
120 return f.read()
121 finally:
122 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000123
124 def loads(self, *args):
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200125 f = self.input(args[0])
126 try:
127 p = cPickle.Unpickler(f)
128 return p.load()
129 finally:
130 self.close(f)
Jeremy Hylton66426532001-10-15 21:38:56 +0000131
132 error = cPickle.BadPickleGet
133
134 def test_recursive_list(self):
135 self.assertRaises(ValueError,
136 AbstractPickleTests.test_recursive_list,
137 self)
138
Collin Winter57bef682009-05-26 04:12:39 +0000139 def test_recursive_tuple(self):
140 self.assertRaises(ValueError,
141 AbstractPickleTests.test_recursive_tuple,
142 self)
143
Jeremy Hylton66426532001-10-15 21:38:56 +0000144 def test_recursive_inst(self):
145 self.assertRaises(ValueError,
146 AbstractPickleTests.test_recursive_inst,
147 self)
148
149 def test_recursive_dict(self):
150 self.assertRaises(ValueError,
151 AbstractPickleTests.test_recursive_dict,
152 self)
153
154 def test_recursive_multi(self):
155 self.assertRaises(ValueError,
156 AbstractPickleTests.test_recursive_multi,
157 self)
158
Barry Warsaw52acb492001-12-21 20:04:22 +0000159 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +0000160 # If it's not cyclic, it should pickle OK even if the nesting
161 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
162 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
163 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +0000164 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +0000165 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +0000166 a = [a]
167 b = self.loads(self.dumps(a))
168 self.assertEqual(a, b)
169
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200170class cStringIOCPicklerFastTests(cStringIOMixin, cPickleFastPicklerTests):
171 pass
172
173class BytesIOCPicklerFastTests(BytesIOMixin, cPickleFastPicklerTests):
174 pass
175
176class FileIOCPicklerFastTests(FileIOMixin, cPickleFastPicklerTests):
177 pass
178
179
Collin Winterf8089c72009-04-09 16:46:46 +0000180class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
181
182 pickler_class = cPickle.Pickler
183 unpickler_class = cPickle.Unpickler
184
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200185class cPickleBigmemPickleTests(BigmemPickleTests):
186
187 def dumps(self, arg, proto=0, fast=0):
188 # Ignore fast
189 return cPickle.dumps(arg, proto)
190
191 def loads(self, buf):
192 # Ignore fast
193 return cPickle.loads(buf)
194
Collin Winterf8089c72009-04-09 16:46:46 +0000195
Facundo Batista9da18b32008-06-22 23:19:14 +0000196class Node(object):
197 pass
198
199class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000200 def test_issue2702(self):
201 # This should raise a RecursionLimit but in some
202 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
203 # or just silently terminates the interpreter (=crashes).
204 nodes = [Node() for i in range(500)]
205 for n in nodes:
206 n.connections = list(nodes)
207 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000208 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000209
210 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000211 # Safe test, because I broke this case when fixing the
212 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000213 res=[]
214 for x in range(1,2000):
215 res.append(dict(doc=x, similar=[]))
216 cPickle.dumps(res)
217
Facundo Batista9da18b32008-06-22 23:19:14 +0000218
Fred Drake694ed092001-12-19 16:42:15 +0000219def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000220 test_support.run_unittest(
221 cPickleTests,
Serhiy Storchaka2556c832013-03-14 20:59:09 +0200222 cStringIOCPicklerTests,
223 BytesIOCPicklerTests,
224 FileIOCPicklerTests,
225 cStringIOCPicklerListTests,
226 BytesIOCPicklerListTests,
227 FileIOCPicklerListTests,
228 cStringIOCPicklerFastTests,
229 BytesIOCPicklerFastTests,
230 FileIOCPicklerFastTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000231 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000232 cPicklePicklerUnpicklerObjectTests,
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200233 cPickleBigmemPickleTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000234 )
Fred Drake694ed092001-12-19 16:42:15 +0000235
Jeremy Hylton66426532001-10-15 21:38:56 +0000236if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000237 test_main()