blob: 54a43b27494a9cd0a6f4864921ec856933967566 [file] [log] [blame]
Tim Peters763cb0a2001-01-22 22:43:35 +00001# test_pickle and test_cpickle both use this.
Tim Peterse9358162001-01-22 22:05:20 +00002
3# break into multiple strings to please font-lock-mode
Tim Peters461922a2001-04-09 20:07:05 +00004DATA = """(lp1
Tim Peterse9358162001-01-22 22:05:20 +00005I0
6aL1L
Tim Peters461922a2001-04-09 20:07:05 +00007aF2
Tim Peterse9358162001-01-22 22:05:20 +00008ac__builtin__
9complex
Tim Peters461922a2001-04-09 20:07:05 +000010p2
11""" + \
12"""(F3
13F0
14tRp3
15aI1
16aI-1
17aI255
18aI-255
19aI-256
20aI65535
21aI-65535
22aI-65536
23aI2147483647
24aI-2147483647
25aI-2147483648
26a""" + \
27"""(S'abc'
Tim Peterse9358162001-01-22 22:05:20 +000028p4
29g4
Tim Peters461922a2001-04-09 20:07:05 +000030""" + \
31"""(ipickletester
Tim Peterse9358162001-01-22 22:05:20 +000032C
33p5
Tim Peters461922a2001-04-09 20:07:05 +000034""" + \
Tim Peterse9358162001-01-22 22:05:20 +000035"""(dp6
36S'foo'
37p7
38I1
39sS'bar'
40p8
41I2
42sbg5
43tp9
44ag9
45aI5
46a.
47"""
48
Tim Peters461922a2001-04-09 20:07:05 +000049BINDATA = ']q\x01(K\x00L1L\nG@\x00\x00\x00\x00\x00\x00\x00' + \
50 'c__builtin__\ncomplex\nq\x02(G@\x08\x00\x00\x00\x00\x00' + \
51 '\x00G\x00\x00\x00\x00\x00\x00\x00\x00tRq\x03K\x01J\xff\xff' + \
52 '\xff\xffK\xffJ\x01\xff\xff\xffJ\x00\xff\xff\xffM\xff\xff' + \
53 'J\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff\xff\x7fJ\x01\x00' + \
54 '\x00\x80J\x00\x00\x00\x80(U\x03abcq\x04h\x04(cpickletester\n' + \
55 'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \
56 '\x06tq\nh\nK\x05e.'
Tim Peterse9358162001-01-22 22:05:20 +000057
58class C:
59 def __cmp__(self, other):
60 return cmp(self.__dict__, other.__dict__)
61
62import __main__
63__main__.C = C
64
65# Call this with the module to be tested (pickle or cPickle).
66
67def dotest(pickle):
68 c = C()
69 c.foo = 1
70 c.bar = 2
71 x = [0, 1L, 2.0, 3.0+0j]
Tim Peters461922a2001-04-09 20:07:05 +000072 # Append some integer test cases at cPickle.c's internal size
73 # cutoffs.
74 uint1max = 0xff
75 uint2max = 0xffff
76 int4max = 0x7fffffff
77 x.extend([1, -1,
78 uint1max, -uint1max, -uint1max-1,
79 uint2max, -uint2max, -uint2max-1,
80 int4max, -int4max, -int4max-1])
Tim Peterse9358162001-01-22 22:05:20 +000081 y = ('abc', 'abc', c, c)
82 x.append(y)
83 x.append(y)
84 x.append(5)
85 r = []
86 r.append(r)
Tim Petersc58440f2001-04-09 17:16:31 +000087
Tim Peterse9358162001-01-22 22:05:20 +000088 print "dumps()"
89 s = pickle.dumps(x)
Tim Petersc58440f2001-04-09 17:16:31 +000090
Tim Peterse9358162001-01-22 22:05:20 +000091 print "loads()"
92 x2 = pickle.loads(s)
Tim Petersc58440f2001-04-09 17:16:31 +000093 if x2 == x:
94 print "ok"
95 else:
96 print "bad"
97
Tim Peterse9358162001-01-22 22:05:20 +000098 print "loads() DATA"
99 x2 = pickle.loads(DATA)
Tim Petersc58440f2001-04-09 17:16:31 +0000100 if x2 == x:
101 print "ok"
102 else:
103 print "bad"
104
Tim Peterse9358162001-01-22 22:05:20 +0000105 print "dumps() binary"
106 s = pickle.dumps(x, 1)
Tim Petersc58440f2001-04-09 17:16:31 +0000107
Tim Peterse9358162001-01-22 22:05:20 +0000108 print "loads() binary"
109 x2 = pickle.loads(s)
Tim Petersc58440f2001-04-09 17:16:31 +0000110 if x2 == x:
111 print "ok"
112 else:
113 print "bad"
114
Tim Peterse9358162001-01-22 22:05:20 +0000115 print "loads() BINDATA"
116 x2 = pickle.loads(BINDATA)
Tim Petersc58440f2001-04-09 17:16:31 +0000117 if x2 == x:
118 print "ok"
119 else:
120 print "bad"
121
Tim Peterse9358162001-01-22 22:05:20 +0000122 print "dumps() RECURSIVE"
Tim Petersc58440f2001-04-09 17:16:31 +0000123 s = pickle.dumps(r)
Tim Peterse9358162001-01-22 22:05:20 +0000124 x2 = pickle.loads(s)
Tim Petersc58440f2001-04-09 17:16:31 +0000125 if x2 == r:
126 print "ok"
127 else:
128 print "bad"
129
Tim Peterse9358162001-01-22 22:05:20 +0000130 # don't create cyclic garbage
131 del x2[0]
132 del r[0]
133
134 # Test protection against closed files
135 import tempfile, os
136 fn = tempfile.mktemp()
137 f = open(fn, "w")
138 f.close()
139 try:
140 pickle.dump(123, f)
141 except ValueError:
142 pass
143 else:
144 print "dump to closed file should raise ValueError"
Tim Petersc58440f2001-04-09 17:16:31 +0000145
Tim Peterse9358162001-01-22 22:05:20 +0000146 f = open(fn, "r")
147 f.close()
148 try:
149 pickle.load(f)
150 except ValueError:
151 pass
152 else:
153 print "load from closed file should raise ValueError"
154 os.remove(fn)
155
156 # Test specific bad cases
157 for i in range(10):
158 try:
159 x = pickle.loads('garyp')
160 except KeyError, y:
161 # pickle
162 del y
163 except pickle.BadPickleGet, y:
164 # cPickle
165 del y
166 else:
167 print "unexpected success!"
168 break
169
170 # Test insecure strings
171 insecure = ["abc", "2 + 2", # not quoted
172 "'abc' + 'def'", # not a single quoted string
173 "'abc", # quote is not closed
174 "'abc\"", # open quote and close quote don't match
175 "'abc' ?", # junk after close quote
176 # some tests of the quoting rules
177 "'abc\"\''",
178 "'\\\\a\'\'\'\\\'\\\\\''",
179 ]
180 for s in insecure:
181 buf = "S" + s + "\012p0\012."
182 try:
183 x = pickle.loads(buf)
184 except ValueError:
185 pass
186 else:
187 print "accepted insecure string: %s" % repr(buf)
188
189 # Test some Unicode end cases
190 endcases = [u'', u'<\\u>', u'<\\\u1234>', u'<\n>', u'<\\>']
191 for u in endcases:
192 try:
193 u2 = pickle.loads(pickle.dumps(u))
194 except Exception, msg:
195 print "Endcase exception: %s => %s(%s)" % \
196 (`u`, msg.__class__.__name__, str(msg))
197 else:
198 if u2 != u:
199 print "Endcase failure: %s => %s" % (`u`, `u2`)