blob: 71640dbfc5aed603bc0a2743ce60c31f42d73f80 [file] [log] [blame]
Jeremy Hylton66426532001-10-15 21:38:56 +00001import unittest
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002from test_support import TestFailed, have_unicode
Tim Peterse089c682001-04-10 03:41:41 +00003
Jeremy Hylton66426532001-10-15 21:38:56 +00004class C:
5 def __cmp__(self, other):
6 return cmp(self.__dict__, other.__dict__)
7
8import __main__
9__main__.C = C
10C.__module__ = "__main__"
11
12class myint(int):
13 def __init__(self, x):
14 self.str = str(x)
15
16class initarg(C):
Guido van Rossum1444f672001-12-19 16:38:29 +000017
18 __safe_for_unpickling__ = 1
19
Jeremy Hylton66426532001-10-15 21:38:56 +000020 def __init__(self, a, b):
21 self.a = a
22 self.b = b
23
24 def __getinitargs__(self):
25 return self.a, self.b
26
27# break into multiple strings to avoid confusing font-lock-mode
Tim Peters461922a2001-04-09 20:07:05 +000028DATA = """(lp1
Tim Peterse9358162001-01-22 22:05:20 +000029I0
30aL1L
Tim Peters461922a2001-04-09 20:07:05 +000031aF2
Tim Peterse9358162001-01-22 22:05:20 +000032ac__builtin__
33complex
Tim Peters461922a2001-04-09 20:07:05 +000034p2
35""" + \
36"""(F3
37F0
38tRp3
39aI1
40aI-1
41aI255
42aI-255
43aI-256
44aI65535
45aI-65535
46aI-65536
47aI2147483647
48aI-2147483647
49aI-2147483648
50a""" + \
51"""(S'abc'
Tim Peterse9358162001-01-22 22:05:20 +000052p4
53g4
Tim Peters461922a2001-04-09 20:07:05 +000054""" + \
Guido van Rossum42f92da2001-04-16 00:28:21 +000055"""(i__main__
Tim Peterse9358162001-01-22 22:05:20 +000056C
57p5
Tim Peters461922a2001-04-09 20:07:05 +000058""" + \
Tim Peterse9358162001-01-22 22:05:20 +000059"""(dp6
60S'foo'
61p7
62I1
63sS'bar'
64p8
65I2
66sbg5
67tp9
68ag9
69aI5
70a.
71"""
72
Tim Peters461922a2001-04-09 20:07:05 +000073BINDATA = ']q\x01(K\x00L1L\nG@\x00\x00\x00\x00\x00\x00\x00' + \
74 'c__builtin__\ncomplex\nq\x02(G@\x08\x00\x00\x00\x00\x00' + \
75 '\x00G\x00\x00\x00\x00\x00\x00\x00\x00tRq\x03K\x01J\xff\xff' + \
76 '\xff\xffK\xffJ\x01\xff\xff\xffJ\x00\xff\xff\xffM\xff\xff' + \
77 'J\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff\xff\x7fJ\x01\x00' + \
Guido van Rossum42f92da2001-04-16 00:28:21 +000078 '\x00\x80J\x00\x00\x00\x80(U\x03abcq\x04h\x04(c__main__\n' + \
Tim Peters461922a2001-04-09 20:07:05 +000079 'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \
80 '\x06tq\nh\nK\x05e.'
Tim Peterse0c446b2001-10-18 21:57:37 +000081
Jeremy Hylton66426532001-10-15 21:38:56 +000082def create_data():
Tim Peterse9358162001-01-22 22:05:20 +000083 c = C()
84 c.foo = 1
85 c.bar = 2
86 x = [0, 1L, 2.0, 3.0+0j]
Tim Peters461922a2001-04-09 20:07:05 +000087 # Append some integer test cases at cPickle.c's internal size
88 # cutoffs.
89 uint1max = 0xff
90 uint2max = 0xffff
91 int4max = 0x7fffffff
92 x.extend([1, -1,
93 uint1max, -uint1max, -uint1max-1,
94 uint2max, -uint2max, -uint2max-1,
95 int4max, -int4max, -int4max-1])
Tim Peterse9358162001-01-22 22:05:20 +000096 y = ('abc', 'abc', c, c)
97 x.append(y)
98 x.append(y)
99 x.append(5)
Jeremy Hylton66426532001-10-15 21:38:56 +0000100 return x
Tim Petersc58440f2001-04-09 17:16:31 +0000101
Jeremy Hylton66426532001-10-15 21:38:56 +0000102class AbstractPickleTests(unittest.TestCase):
Tim Petersc58440f2001-04-09 17:16:31 +0000103
Jeremy Hylton66426532001-10-15 21:38:56 +0000104 _testdata = create_data()
Tim Petersc58440f2001-04-09 17:16:31 +0000105
Jeremy Hylton66426532001-10-15 21:38:56 +0000106 def setUp(self):
107 # subclass must define self.dumps, self.loads, self.error
Tim Peterse9358162001-01-22 22:05:20 +0000108 pass
Tim Petersc58440f2001-04-09 17:16:31 +0000109
Jeremy Hylton66426532001-10-15 21:38:56 +0000110 def test_misc(self):
111 # test various datatypes not tested by testdata
112 x = myint(4)
113 s = self.dumps(x)
114 y = self.loads(s)
115 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000116
Jeremy Hylton66426532001-10-15 21:38:56 +0000117 x = (1, ())
118 s = self.dumps(x)
119 y = self.loads(s)
120 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000121
Jeremy Hylton66426532001-10-15 21:38:56 +0000122 x = initarg(1, x)
123 s = self.dumps(x)
124 y = self.loads(s)
125 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000126
Jeremy Hylton66426532001-10-15 21:38:56 +0000127 # XXX test __reduce__ protocol?
128
129 def test_identity(self):
130 s = self.dumps(self._testdata)
131 x = self.loads(s)
132 self.assertEqual(x, self._testdata)
133
134 def test_constant(self):
135 x = self.loads(DATA)
136 self.assertEqual(x, self._testdata)
137 x = self.loads(BINDATA)
138 self.assertEqual(x, self._testdata)
139
140 def test_binary(self):
141 s = self.dumps(self._testdata, 1)
142 x = self.loads(s)
143 self.assertEqual(x, self._testdata)
144
145 def test_recursive_list(self):
146 l = []
147 l.append(l)
148 s = self.dumps(l)
149 x = self.loads(s)
150 self.assertEqual(x, l)
151 self.assertEqual(x, x[0])
152 self.assertEqual(id(x), id(x[0]))
153
154 def test_recursive_dict(self):
155 d = {}
156 d[1] = d
157 s = self.dumps(d)
158 x = self.loads(s)
159 self.assertEqual(x, d)
160 self.assertEqual(x[1], x)
161 self.assertEqual(id(x[1]), id(x))
162
163 def test_recursive_inst(self):
164 i = C()
165 i.attr = i
166 s = self.dumps(i)
167 x = self.loads(s)
168 self.assertEqual(x, i)
169 self.assertEqual(x.attr, x)
170 self.assertEqual(id(x.attr), id(x))
171
172 def test_recursive_multi(self):
173 l = []
174 d = {1:l}
175 i = C()
176 i.attr = d
177 l.append(i)
178 s = self.dumps(l)
179 x = self.loads(s)
180 self.assertEqual(x, l)
181 self.assertEqual(x[0], i)
182 self.assertEqual(x[0].attr, d)
183 self.assertEqual(x[0].attr[1], x)
184 self.assertEqual(x[0].attr[1][0], i)
185 self.assertEqual(x[0].attr[1][0].attr, d)
186
187 def test_garyp(self):
188 self.assertRaises(self.error, self.loads, 'garyp')
189
190 def test_insecure_strings(self):
191 insecure = ["abc", "2 + 2", # not quoted
192 "'abc' + 'def'", # not a single quoted string
193 "'abc", # quote is not closed
194 "'abc\"", # open quote and close quote don't match
195 "'abc' ?", # junk after close quote
196 # some tests of the quoting rules
197 "'abc\"\''",
198 "'\\\\a\'\'\'\\\'\\\\\''",
199 ]
200 for s in insecure:
201 buf = "S" + s + "\012p0\012."
202 self.assertRaises(ValueError, self.loads, buf)
203
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000204 if have_unicode:
Jeremy Hylton66426532001-10-15 21:38:56 +0000205 def test_unicode(self):
206 endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'),
207 unicode('<\n>'), unicode('<\\>')]
208 for u in endcases:
209 p = self.dumps(u)
210 u2 = self.loads(p)
211 self.assertEqual(u2, u)
Tim Peterse089c682001-04-10 03:41:41 +0000212
Jeremy Hylton66426532001-10-15 21:38:56 +0000213 def test_ints(self):
214 import sys
215 n = sys.maxint
216 while n:
217 for expected in (-n, n):
218 s = self.dumps(expected)
219 n2 = self.loads(s)
220 self.assertEqual(expected, n2)
221 n = n >> 1
Tim Peters19ef62d2001-08-28 22:21:18 +0000222
Jeremy Hylton66426532001-10-15 21:38:56 +0000223 def test_maxint64(self):
224 maxint64 = (1L << 63) - 1
225 data = 'I' + str(maxint64) + '\n.'
226 got = self.loads(data)
227 self.assertEqual(got, maxint64)
228
229 # Try too with a bogus literal.
230 data = 'I' + str(maxint64) + 'JUNK\n.'
231 self.assertRaises(ValueError, self.loads, data)
232
233 def test_reduce(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000234 pass
Jeremy Hylton66426532001-10-15 21:38:56 +0000235
236 def test_getinitargs(self):
237 pass
238
239class AbstractPickleModuleTests(unittest.TestCase):
240
241 def test_dump_closed_file(self):
242 import tempfile, os
243 fn = tempfile.mktemp()
244 f = open(fn, "w")
245 f.close()
246 self.assertRaises(ValueError, self.module.dump, 123, f)
247 os.remove(fn)
248
249 def test_load_closed_file(self):
250 import tempfile, os
251 fn = tempfile.mktemp()
252 f = open(fn, "w")
253 f.close()
254 self.assertRaises(ValueError, self.module.dump, 123, f)
255 os.remove(fn)