blob: 85a6daa9912ae5225e14063390a9a53b4f3189f4 [file] [log] [blame]
Guido van Rossumaa3828a1999-03-25 22:38:49 +00001# Test the pickle module
2
Jeremy Hyltonbe467e52000-09-15 15:14:51 +00003# break into multiple strings to please font-lock-mode
Guido van Rossumaa3828a1999-03-25 22:38:49 +00004DATA = """(lp0
5I0
6aL1L
7aF2.0
8ac__builtin__
9complex
10p1
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000011""" \
12"""(F3.0
Guido van Rossumaa3828a1999-03-25 22:38:49 +000013F0.0
14tp2
15Rp3
16a(S'abc'
17p4
18g4
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000019""" \
20"""(i__main__
Guido van Rossumaa3828a1999-03-25 22:38:49 +000021C
22p5
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000023""" \
24"""(dp6
Guido van Rossumaa3828a1999-03-25 22:38:49 +000025S'foo'
26p7
27I1
28sS'bar'
29p8
30I2
31sbg5
32tp9
33ag9
34aI5
35a.
36"""
37
38BINDATA = ']q\000(K\000L1L\012G@\000\000\000\000\000\000\000c__builtin__\012complex\012q\001(G@\010\000\000\000\000\000\000G\000\000\000\000\000\000\000\000tq\002Rq\003(U\003abcq\004h\004(c__main__\012C\012q\005oq\006}q\007(U\003fooq\010K\001U\003barq\011K\002ubh\006tq\012h\012K\005e.'
39
Guido van Rossumaa3828a1999-03-25 22:38:49 +000040class C:
41 def __cmp__(self, other):
42 return cmp(self.__dict__, other.__dict__)
43
44import __main__
45__main__.C = C
46
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000047def dotest(pickle):
Guido van Rossumaa3828a1999-03-25 22:38:49 +000048 c = C()
49 c.foo = 1
50 c.bar = 2
51 x = [0, 1L, 2.0, 3.0+0j]
52 y = ('abc', 'abc', c, c)
53 x.append(y)
54 x.append(y)
55 x.append(5)
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000056 r = []
57 r.append(r)
Guido van Rossumaa3828a1999-03-25 22:38:49 +000058 print "dumps()"
59 s = pickle.dumps(x)
60 print "loads()"
61 x2 = pickle.loads(s)
62 if x2 == x: print "ok"
63 else: print "bad"
64 print "loads() DATA"
65 x2 = pickle.loads(DATA)
66 if x2 == x: print "ok"
67 else: print "bad"
68 print "dumps() binary"
69 s = pickle.dumps(x, 1)
70 print "loads() binary"
71 x2 = pickle.loads(s)
72 if x2 == x: print "ok"
73 else: print "bad"
74 print "loads() BINDATA"
75 x2 = pickle.loads(BINDATA)
76 if x2 == x: print "ok"
77 else: print "bad"
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000078 s = pickle.dumps(r)
79 print "dumps() RECURSIVE"
80 x2 = pickle.loads(s)
81 if x2 == r: print "ok"
82 else: print "bad"
Neil Schemenaueref5f2b92000-09-22 15:30:16 +000083 # don't create cyclic garbage
84 del x2[0]
85 del r[0]
Guido van Rossumaa3828a1999-03-25 22:38:49 +000086
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000087 # Test protection against closed files
88 import tempfile, os
89 fn = tempfile.mktemp()
90 f = open(fn, "w")
91 f.close()
92 try:
93 pickle.dump(123, f)
94 except ValueError:
95 pass
96 else:
97 print "dump to closed file should raise ValueError"
98 f = open(fn, "r")
99 f.close()
100 try:
101 pickle.load(f)
102 except ValueError:
103 pass
104 else:
105 print "load from closed file should raise ValueError"
106 os.remove(fn)
107
108 # Test specific bad cases
109 for i in range(10):
110 try:
111 x = pickle.loads('garyp')
112 except KeyError, y:
113 # pickle
114 del y
115 except pickle.BadPickleGet, y:
116 # cPickle
117 del y
118 else:
119 print "unexpected success!"
120 break
121
122 # Test insecure strings
123 insecure = ["abc", "2 + 2", # not quoted
124 "'abc' + 'def'", # not a single quoted string
125 "'abc", # quote is not closed
126 "'abc\"", # open quote and close quote don't match
127 "'abc' ?", # junk after close quote
128 # some tests of the quoting rules
129 "'abc\"\''",
130 "'\\\\a\'\'\'\\\'\\\\\''",
131 ]
132 for s in insecure:
133 buf = "S" + s + "\012p0\012."
134 try:
135 x = pickle.loads(buf)
136 except ValueError:
137 pass
138 else:
139 print "accepted insecure string: %s" % repr(buf)
Fred Drake004d5e62000-10-23 17:22:08 +0000140
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000141
142import pickle
143dotest(pickle)