blob: 01e7a938e2cf859418b3bae36e206a1d8c1d946f [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):
17 def __init__(self, a, b):
18 self.a = a
19 self.b = b
20
21 def __getinitargs__(self):
22 return self.a, self.b
23
24# break into multiple strings to avoid confusing font-lock-mode
Tim Peters461922a2001-04-09 20:07:05 +000025DATA = """(lp1
Tim Peterse9358162001-01-22 22:05:20 +000026I0
27aL1L
Tim Peters461922a2001-04-09 20:07:05 +000028aF2
Tim Peterse9358162001-01-22 22:05:20 +000029ac__builtin__
30complex
Tim Peters461922a2001-04-09 20:07:05 +000031p2
32""" + \
33"""(F3
34F0
35tRp3
36aI1
37aI-1
38aI255
39aI-255
40aI-256
41aI65535
42aI-65535
43aI-65536
44aI2147483647
45aI-2147483647
46aI-2147483648
47a""" + \
48"""(S'abc'
Tim Peterse9358162001-01-22 22:05:20 +000049p4
50g4
Tim Peters461922a2001-04-09 20:07:05 +000051""" + \
Guido van Rossum42f92da2001-04-16 00:28:21 +000052"""(i__main__
Tim Peterse9358162001-01-22 22:05:20 +000053C
54p5
Tim Peters461922a2001-04-09 20:07:05 +000055""" + \
Tim Peterse9358162001-01-22 22:05:20 +000056"""(dp6
57S'foo'
58p7
59I1
60sS'bar'
61p8
62I2
63sbg5
64tp9
65ag9
66aI5
67a.
68"""
69
Tim Peters461922a2001-04-09 20:07:05 +000070BINDATA = ']q\x01(K\x00L1L\nG@\x00\x00\x00\x00\x00\x00\x00' + \
71 'c__builtin__\ncomplex\nq\x02(G@\x08\x00\x00\x00\x00\x00' + \
72 '\x00G\x00\x00\x00\x00\x00\x00\x00\x00tRq\x03K\x01J\xff\xff' + \
73 '\xff\xffK\xffJ\x01\xff\xff\xffJ\x00\xff\xff\xffM\xff\xff' + \
74 'J\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff\xff\x7fJ\x01\x00' + \
Guido van Rossum42f92da2001-04-16 00:28:21 +000075 '\x00\x80J\x00\x00\x00\x80(U\x03abcq\x04h\x04(c__main__\n' + \
Tim Peters461922a2001-04-09 20:07:05 +000076 'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \
77 '\x06tq\nh\nK\x05e.'
Tim Peterse0c446b2001-10-18 21:57:37 +000078
Jeremy Hylton66426532001-10-15 21:38:56 +000079def create_data():
Tim Peterse9358162001-01-22 22:05:20 +000080 c = C()
81 c.foo = 1
82 c.bar = 2
83 x = [0, 1L, 2.0, 3.0+0j]
Tim Peters461922a2001-04-09 20:07:05 +000084 # Append some integer test cases at cPickle.c's internal size
85 # cutoffs.
86 uint1max = 0xff
87 uint2max = 0xffff
88 int4max = 0x7fffffff
89 x.extend([1, -1,
90 uint1max, -uint1max, -uint1max-1,
91 uint2max, -uint2max, -uint2max-1,
92 int4max, -int4max, -int4max-1])
Tim Peterse9358162001-01-22 22:05:20 +000093 y = ('abc', 'abc', c, c)
94 x.append(y)
95 x.append(y)
96 x.append(5)
Jeremy Hylton66426532001-10-15 21:38:56 +000097 return x
Tim Petersc58440f2001-04-09 17:16:31 +000098
Jeremy Hylton66426532001-10-15 21:38:56 +000099class AbstractPickleTests(unittest.TestCase):
Tim Petersc58440f2001-04-09 17:16:31 +0000100
Jeremy Hylton66426532001-10-15 21:38:56 +0000101 _testdata = create_data()
Tim Petersc58440f2001-04-09 17:16:31 +0000102
Jeremy Hylton66426532001-10-15 21:38:56 +0000103 def setUp(self):
104 # subclass must define self.dumps, self.loads, self.error
Tim Peterse9358162001-01-22 22:05:20 +0000105 pass
Tim Petersc58440f2001-04-09 17:16:31 +0000106
Jeremy Hylton66426532001-10-15 21:38:56 +0000107 def test_misc(self):
108 # test various datatypes not tested by testdata
109 x = myint(4)
110 s = self.dumps(x)
111 y = self.loads(s)
112 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000113
Jeremy Hylton66426532001-10-15 21:38:56 +0000114 x = (1, ())
115 s = self.dumps(x)
116 y = self.loads(s)
117 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000118
Jeremy Hylton66426532001-10-15 21:38:56 +0000119 x = initarg(1, x)
120 s = self.dumps(x)
121 y = self.loads(s)
122 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000123
Jeremy Hylton66426532001-10-15 21:38:56 +0000124 # XXX test __reduce__ protocol?
125
126 def test_identity(self):
127 s = self.dumps(self._testdata)
128 x = self.loads(s)
129 self.assertEqual(x, self._testdata)
130
131 def test_constant(self):
132 x = self.loads(DATA)
133 self.assertEqual(x, self._testdata)
134 x = self.loads(BINDATA)
135 self.assertEqual(x, self._testdata)
136
137 def test_binary(self):
138 s = self.dumps(self._testdata, 1)
139 x = self.loads(s)
140 self.assertEqual(x, self._testdata)
141
142 def test_recursive_list(self):
143 l = []
144 l.append(l)
145 s = self.dumps(l)
146 x = self.loads(s)
147 self.assertEqual(x, l)
148 self.assertEqual(x, x[0])
149 self.assertEqual(id(x), id(x[0]))
150
151 def test_recursive_dict(self):
152 d = {}
153 d[1] = d
154 s = self.dumps(d)
155 x = self.loads(s)
156 self.assertEqual(x, d)
157 self.assertEqual(x[1], x)
158 self.assertEqual(id(x[1]), id(x))
159
160 def test_recursive_inst(self):
161 i = C()
162 i.attr = i
163 s = self.dumps(i)
164 x = self.loads(s)
165 self.assertEqual(x, i)
166 self.assertEqual(x.attr, x)
167 self.assertEqual(id(x.attr), id(x))
168
169 def test_recursive_multi(self):
170 l = []
171 d = {1:l}
172 i = C()
173 i.attr = d
174 l.append(i)
175 s = self.dumps(l)
176 x = self.loads(s)
177 self.assertEqual(x, l)
178 self.assertEqual(x[0], i)
179 self.assertEqual(x[0].attr, d)
180 self.assertEqual(x[0].attr[1], x)
181 self.assertEqual(x[0].attr[1][0], i)
182 self.assertEqual(x[0].attr[1][0].attr, d)
183
184 def test_garyp(self):
185 self.assertRaises(self.error, self.loads, 'garyp')
186
187 def test_insecure_strings(self):
188 insecure = ["abc", "2 + 2", # not quoted
189 "'abc' + 'def'", # not a single quoted string
190 "'abc", # quote is not closed
191 "'abc\"", # open quote and close quote don't match
192 "'abc' ?", # junk after close quote
193 # some tests of the quoting rules
194 "'abc\"\''",
195 "'\\\\a\'\'\'\\\'\\\\\''",
196 ]
197 for s in insecure:
198 buf = "S" + s + "\012p0\012."
199 self.assertRaises(ValueError, self.loads, buf)
200
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000201 if have_unicode:
Jeremy Hylton66426532001-10-15 21:38:56 +0000202 def test_unicode(self):
203 endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'),
204 unicode('<\n>'), unicode('<\\>')]
205 for u in endcases:
206 p = self.dumps(u)
207 u2 = self.loads(p)
208 self.assertEqual(u2, u)
Tim Peterse089c682001-04-10 03:41:41 +0000209
Jeremy Hylton66426532001-10-15 21:38:56 +0000210 def test_ints(self):
211 import sys
212 n = sys.maxint
213 while n:
214 for expected in (-n, n):
215 s = self.dumps(expected)
216 n2 = self.loads(s)
217 self.assertEqual(expected, n2)
218 n = n >> 1
Tim Peters19ef62d2001-08-28 22:21:18 +0000219
Jeremy Hylton66426532001-10-15 21:38:56 +0000220 def test_maxint64(self):
221 maxint64 = (1L << 63) - 1
222 data = 'I' + str(maxint64) + '\n.'
223 got = self.loads(data)
224 self.assertEqual(got, maxint64)
225
226 # Try too with a bogus literal.
227 data = 'I' + str(maxint64) + 'JUNK\n.'
228 self.assertRaises(ValueError, self.loads, data)
229
230 def test_reduce(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000231 pass
Jeremy Hylton66426532001-10-15 21:38:56 +0000232
233 def test_getinitargs(self):
234 pass
235
236class AbstractPickleModuleTests(unittest.TestCase):
237
238 def test_dump_closed_file(self):
239 import tempfile, os
240 fn = tempfile.mktemp()
241 f = open(fn, "w")
242 f.close()
243 self.assertRaises(ValueError, self.module.dump, 123, f)
244 os.remove(fn)
245
246 def test_load_closed_file(self):
247 import tempfile, os
248 fn = tempfile.mktemp()
249 f = open(fn, "w")
250 f.close()
251 self.assertRaises(ValueError, self.module.dump, 123, f)
252 os.remove(fn)