Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e935816

Browse files
committed
Reorganize pickle/cPickle testing so the tests pass regardless of the order
they're run.
1 parent da6daee commit e935816

4 files changed

Lines changed: 157 additions & 170 deletions

File tree

Lib/test/output/test_cpickle

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,3 @@ loads() BINDATA
1111
ok
1212
dumps() RECURSIVE
1313
ok
14-
dumps()
15-
loads()
16-
ok
17-
loads() DATA
18-
ok
19-
dumps() binary
20-
loads() binary
21-
ok
22-
loads() BINDATA
23-
ok
24-
dumps() RECURSIVE
25-
ok

Lib/test/pickletester.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# test_pick and test_cpickle both use this.
2+
3+
# break into multiple strings to please font-lock-mode
4+
DATA = """(lp0
5+
I0
6+
aL1L
7+
aF2.0
8+
ac__builtin__
9+
complex
10+
p1
11+
""" \
12+
"""(F3.0
13+
F0.0
14+
tp2
15+
Rp3
16+
a(S'abc'
17+
p4
18+
g4
19+
""" \
20+
"""(i__main__
21+
C
22+
p5
23+
""" \
24+
"""(dp6
25+
S'foo'
26+
p7
27+
I1
28+
sS'bar'
29+
p8
30+
I2
31+
sbg5
32+
tp9
33+
ag9
34+
aI5
35+
a.
36+
"""
37+
38+
BINDATA = ']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+
40+
class C:
41+
def __cmp__(self, other):
42+
return cmp(self.__dict__, other.__dict__)
43+
44+
import __main__
45+
__main__.C = C
46+
47+
# Call this with the module to be tested (pickle or cPickle).
48+
49+
def dotest(pickle):
50+
c = C()
51+
c.foo = 1
52+
c.bar = 2
53+
x = [0, 1L, 2.0, 3.0+0j]
54+
y = ('abc', 'abc', c, c)
55+
x.append(y)
56+
x.append(y)
57+
x.append(5)
58+
r = []
59+
r.append(r)
60+
print "dumps()"
61+
s = pickle.dumps(x)
62+
print "loads()"
63+
x2 = pickle.loads(s)
64+
if x2 == x: print "ok"
65+
else: print "bad"
66+
print "loads() DATA"
67+
x2 = pickle.loads(DATA)
68+
if x2 == x: print "ok"
69+
else: print "bad"
70+
print "dumps() binary"
71+
s = pickle.dumps(x, 1)
72+
print "loads() binary"
73+
x2 = pickle.loads(s)
74+
if x2 == x: print "ok"
75+
else: print "bad"
76+
print "loads() BINDATA"
77+
x2 = pickle.loads(BINDATA)
78+
if x2 == x: print "ok"
79+
else: print "bad"
80+
s = pickle.dumps(r)
81+
print "dumps() RECURSIVE"
82+
x2 = pickle.loads(s)
83+
if x2 == r: print "ok"
84+
else: print "bad"
85+
# don't create cyclic garbage
86+
del x2[0]
87+
del r[0]
88+
89+
# Test protection against closed files
90+
import tempfile, os
91+
fn = tempfile.mktemp()
92+
f = open(fn, "w")
93+
f.close()
94+
try:
95+
pickle.dump(123, f)
96+
except ValueError:
97+
pass
98+
else:
99+
print "dump to closed file should raise ValueError"
100+
f = open(fn, "r")
101+
f.close()
102+
try:
103+
pickle.load(f)
104+
except ValueError:
105+
pass
106+
else:
107+
print "load from closed file should raise ValueError"
108+
os.remove(fn)
109+
110+
# Test specific bad cases
111+
for i in range(10):
112+
try:
113+
x = pickle.loads('garyp')
114+
except KeyError, y:
115+
# pickle
116+
del y
117+
except pickle.BadPickleGet, y:
118+
# cPickle
119+
del y
120+
else:
121+
print "unexpected success!"
122+
break
123+
124+
# Test insecure strings
125+
insecure = ["abc", "2 + 2", # not quoted
126+
"'abc' + 'def'", # not a single quoted string
127+
"'abc", # quote is not closed
128+
"'abc\"", # open quote and close quote don't match
129+
"'abc' ?", # junk after close quote
130+
# some tests of the quoting rules
131+
"'abc\"\''",
132+
"'\\\\a\'\'\'\\\'\\\\\''",
133+
]
134+
for s in insecure:
135+
buf = "S" + s + "\012p0\012."
136+
try:
137+
x = pickle.loads(buf)
138+
except ValueError:
139+
pass
140+
else:
141+
print "accepted insecure string: %s" % repr(buf)
142+
143+
# Test some Unicode end cases
144+
endcases = [u'', u'<\\u>', u'<\\\u1234>', u'<\n>', u'<\\>']
145+
for u in endcases:
146+
try:
147+
u2 = pickle.loads(pickle.dumps(u))
148+
except Exception, msg:
149+
print "Endcase exception: %s => %s(%s)" % \
150+
(`u`, msg.__class__.__name__, str(msg))
151+
else:
152+
if u2 != u:
153+
print "Endcase failure: %s => %s" % (`u`, `u2`)

Lib/test/test_cpickle.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# Test the cPickle module
2-
31
import cPickle
4-
import test_pickle
5-
test_pickle.dotest(cPickle)
2+
import pickletester
3+
pickletester.dotest(cPickle)

Lib/test/test_pickle.py

Lines changed: 2 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1,155 +1,3 @@
1-
# Test the pickle module
2-
3-
# break into multiple strings to please font-lock-mode
4-
DATA = """(lp0
5-
I0
6-
aL1L
7-
aF2.0
8-
ac__builtin__
9-
complex
10-
p1
11-
""" \
12-
"""(F3.0
13-
F0.0
14-
tp2
15-
Rp3
16-
a(S'abc'
17-
p4
18-
g4
19-
""" \
20-
"""(i__main__
21-
C
22-
p5
23-
""" \
24-
"""(dp6
25-
S'foo'
26-
p7
27-
I1
28-
sS'bar'
29-
p8
30-
I2
31-
sbg5
32-
tp9
33-
ag9
34-
aI5
35-
a.
36-
"""
37-
38-
BINDATA = ']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-
40-
class C:
41-
def __cmp__(self, other):
42-
return cmp(self.__dict__, other.__dict__)
43-
44-
import __main__
45-
__main__.C = C
46-
47-
def dotest(pickle):
48-
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)
56-
r = []
57-
r.append(r)
58-
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"
78-
s = pickle.dumps(r)
79-
print "dumps() RECURSIVE"
80-
x2 = pickle.loads(s)
81-
if x2 == r: print "ok"
82-
else: print "bad"
83-
# don't create cyclic garbage
84-
del x2[0]
85-
del r[0]
86-
87-
# 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)
140-
141-
# Test some Unicode end cases
142-
endcases = [u'', u'<\\u>', u'<\\\u1234>', u'<\n>', u'<\\>']
143-
for u in endcases:
144-
try:
145-
u2 = pickle.loads(pickle.dumps(u))
146-
except Exception, msg:
147-
print "Endcase exception: %s => %s(%s)" % \
148-
(`u`, msg.__class__.__name__, str(msg))
149-
else:
150-
if u2 != u:
151-
print "Endcase failure: %s => %s" % (`u`, `u2`)
152-
153-
1541
import pickle
155-
dotest(pickle)
2+
import pickletester
3+
pickletester.dotest(pickle)

0 commit comments

Comments
 (0)