blob: ff9c4673bd697a7537ef46a8ed5adccc5cf16f2e [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"
Guido van Rossumaa3828a1999-03-25 22:38:49 +000083
Jeremy Hyltonbe467e52000-09-15 15:14:51 +000084 # Test protection against closed files
85 import tempfile, os
86 fn = tempfile.mktemp()
87 f = open(fn, "w")
88 f.close()
89 try:
90 pickle.dump(123, f)
91 except ValueError:
92 pass
93 else:
94 print "dump to closed file should raise ValueError"
95 f = open(fn, "r")
96 f.close()
97 try:
98 pickle.load(f)
99 except ValueError:
100 pass
101 else:
102 print "load from closed file should raise ValueError"
103 os.remove(fn)
104
105 # Test specific bad cases
106 for i in range(10):
107 try:
108 x = pickle.loads('garyp')
109 except KeyError, y:
110 # pickle
111 del y
112 except pickle.BadPickleGet, y:
113 # cPickle
114 del y
115 else:
116 print "unexpected success!"
117 break
118
119 # Test insecure strings
120 insecure = ["abc", "2 + 2", # not quoted
121 "'abc' + 'def'", # not a single quoted string
122 "'abc", # quote is not closed
123 "'abc\"", # open quote and close quote don't match
124 "'abc' ?", # junk after close quote
125 # some tests of the quoting rules
126 "'abc\"\''",
127 "'\\\\a\'\'\'\\\'\\\\\''",
128 ]
129 for s in insecure:
130 buf = "S" + s + "\012p0\012."
131 try:
132 x = pickle.loads(buf)
133 except ValueError:
134 pass
135 else:
136 print "accepted insecure string: %s" % repr(buf)
137
138
139import pickle
140dotest(pickle)