blob: cab0523e351fbf9459f891f68ae699a9944bf008 [file] [log] [blame]
Collin Winter771d8342009-04-16 03:18:06 +00001import io
Jeremy Hylton66426532001-10-15 21:38:56 +00002import unittest
Tim Peters4190fb82003-02-02 16:09:05 +00003import pickle
Tim Peters31f119e2003-02-03 16:20:13 +00004import pickletools
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005import sys
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00006import copyreg
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007from http.cookies import SimpleCookie
Tim Peters4190fb82003-02-02 16:09:05 +00008
Antoine Pitrou82be19f2011-08-29 23:09:33 +02009from test.support import (
10 TestFailed, TESTFN, run_with_locale,
Antoine Pitrou94190bb2011-10-04 10:22:36 +020011 _2G, _4G, bigmemtest,
Antoine Pitrou82be19f2011-08-29 23:09:33 +020012 )
Tim Peterse089c682001-04-10 03:41:41 +000013
Guido van Rossum98297ee2007-11-06 21:34:58 +000014from pickle import bytes_types
15
Tim Petersee1a53c2003-02-02 02:57:53 +000016# Tests that try a number of pickle protocols should have a
17# for proto in protocols:
Tim Peters8587b3c2003-02-13 15:44:41 +000018# kind of outer loop.
Tim Peters8587b3c2003-02-13 15:44:41 +000019protocols = range(pickle.HIGHEST_PROTOCOL + 1)
Tim Petersee1a53c2003-02-02 02:57:53 +000020
Antoine Pitrou82be19f2011-08-29 23:09:33 +020021character_size = 4 if sys.maxunicode > 0xFFFF else 2
22
Tim Peters22e71712003-02-03 22:27:38 +000023
24# Return True if opcode code appears in the pickle, else False.
25def opcode_in_pickle(code, pickle):
26 for op, dummy, dummy in pickletools.genops(pickle):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000027 if op.code == code.decode("latin-1"):
Tim Peters22e71712003-02-03 22:27:38 +000028 return True
29 return False
30
Tim Peters8d2613a2003-02-11 16:40:16 +000031# Return the number of times opcode code appears in pickle.
32def count_opcode(code, pickle):
33 n = 0
34 for op, dummy, dummy in pickletools.genops(pickle):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000035 if op.code == code.decode("latin-1"):
Tim Peters8d2613a2003-02-11 16:40:16 +000036 n += 1
37 return n
38
Antoine Pitrou04248a82010-10-12 20:51:21 +000039
40class UnseekableIO(io.BytesIO):
41 def peek(self, *args):
42 raise NotImplementedError
43
44 def seekable(self):
45 return False
46
47 def seek(self, *args):
48 raise io.UnsupportedOperation
49
50 def tell(self):
51 raise io.UnsupportedOperation
52
53
Tim Peters3e667d52003-02-04 21:47:44 +000054# We can't very well test the extension registry without putting known stuff
55# in it, but we have to be careful to restore its original state. Code
56# should do this:
57#
58# e = ExtensionSaver(extension_code)
59# try:
60# fiddle w/ the extension registry's stuff for extension_code
61# finally:
62# e.restore()
63
64class ExtensionSaver:
65 # Remember current registration for code (if any), and remove it (if
66 # there is one).
67 def __init__(self, code):
68 self.code = code
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000069 if code in copyreg._inverted_registry:
70 self.pair = copyreg._inverted_registry[code]
71 copyreg.remove_extension(self.pair[0], self.pair[1], code)
Tim Peters3e667d52003-02-04 21:47:44 +000072 else:
73 self.pair = None
74
75 # Restore previous registration for code.
76 def restore(self):
77 code = self.code
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000078 curpair = copyreg._inverted_registry.get(code)
Tim Peters3e667d52003-02-04 21:47:44 +000079 if curpair is not None:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000080 copyreg.remove_extension(curpair[0], curpair[1], code)
Tim Peters3e667d52003-02-04 21:47:44 +000081 pair = self.pair
82 if pair is not None:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000083 copyreg.add_extension(pair[0], pair[1], code)
Tim Peters3e667d52003-02-04 21:47:44 +000084
Jeremy Hylton66426532001-10-15 21:38:56 +000085class C:
Guido van Rossum47b9ff62006-08-24 00:41:19 +000086 def __eq__(self, other):
87 return self.__dict__ == other.__dict__
Jeremy Hylton66426532001-10-15 21:38:56 +000088
Alexander Belopolskyd92f0402010-07-17 22:50:45 +000089class D(C):
90 def __init__(self, arg):
91 pass
92
93class E(C):
94 def __getinitargs__(self):
95 return ()
96
Jeremy Hylton66426532001-10-15 21:38:56 +000097import __main__
98__main__.C = C
99C.__module__ = "__main__"
Alexander Belopolskyd92f0402010-07-17 22:50:45 +0000100__main__.D = D
101D.__module__ = "__main__"
102__main__.E = E
103E.__module__ = "__main__"
Jeremy Hylton66426532001-10-15 21:38:56 +0000104
105class myint(int):
106 def __init__(self, x):
107 self.str = str(x)
108
109class initarg(C):
Guido van Rossum1444f672001-12-19 16:38:29 +0000110
Jeremy Hylton66426532001-10-15 21:38:56 +0000111 def __init__(self, a, b):
112 self.a = a
113 self.b = b
114
115 def __getinitargs__(self):
116 return self.a, self.b
117
Guido van Rossum04a86612001-12-19 16:58:54 +0000118class metaclass(type):
119 pass
120
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000121class use_metaclass(object, metaclass=metaclass):
122 pass
Guido van Rossum04a86612001-12-19 16:58:54 +0000123
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200124class pickling_metaclass(type):
125 def __eq__(self, other):
126 return (type(self) == type(other) and
127 self.reduce_args == other.reduce_args)
128
129 def __reduce__(self):
130 return (create_dynamic_class, self.reduce_args)
131
132def create_dynamic_class(name, bases):
133 result = pickling_metaclass(name, bases, dict())
134 result.reduce_args = (name, bases)
135 return result
136
Tim Peters70b02d72003-02-02 17:26:40 +0000137# DATA0 .. DATA2 are the pickles we expect under the various protocols, for
138# the object returned by create_data().
Tim Petersee1a53c2003-02-02 02:57:53 +0000139
Guido van Rossum98297ee2007-11-06 21:34:58 +0000140DATA0 = (
Mark Dickinson8dd05142009-01-20 20:43:58 +0000141 b'(lp0\nL0L\naL1L\naF2.0\nac'
Georg Brandl1a3284e2007-12-02 09:40:06 +0000142 b'builtins\ncomplex\n'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000143 b'p1\n(F3.0\nF0.0\ntp2\nRp'
Mark Dickinson8dd05142009-01-20 20:43:58 +0000144 b'3\naL1L\naL-1L\naL255L\naL-'
145 b'255L\naL-256L\naL65535L\na'
146 b'L-65535L\naL-65536L\naL2'
147 b'147483647L\naL-2147483'
148 b'647L\naL-2147483648L\na('
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000149 b'Vabc\np4\ng4\nccopyreg'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000150 b'\n_reconstructor\np5\n('
Georg Brandl1a3284e2007-12-02 09:40:06 +0000151 b'c__main__\nC\np6\ncbu'
152 b'iltins\nobject\np7\nNt'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000153 b'p8\nRp9\n(dp10\nVfoo\np1'
Mark Dickinson8dd05142009-01-20 20:43:58 +0000154 b'1\nL1L\nsVbar\np12\nL2L\nsb'
155 b'g9\ntp13\nag13\naL5L\na.'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000156)
Tim Peterse9358162001-01-22 22:05:20 +0000157
Guido van Rossum98297ee2007-11-06 21:34:58 +0000158# Disassembly of DATA0
Tim Peters70b02d72003-02-02 17:26:40 +0000159DATA0_DIS = """\
160 0: ( MARK
161 1: l LIST (MARK at 0)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000162 2: p PUT 0
163 5: L LONG 0
Mark Dickinson8dd05142009-01-20 20:43:58 +0000164 9: a APPEND
165 10: L LONG 1
166 14: a APPEND
167 15: F FLOAT 2.0
168 20: a APPEND
169 21: c GLOBAL 'builtins complex'
170 39: p PUT 1
171 42: ( MARK
172 43: F FLOAT 3.0
173 48: F FLOAT 0.0
174 53: t TUPLE (MARK at 42)
175 54: p PUT 2
176 57: R REDUCE
177 58: p PUT 3
178 61: a APPEND
179 62: L LONG 1
180 66: a APPEND
181 67: L LONG -1
182 72: a APPEND
183 73: L LONG 255
184 79: a APPEND
185 80: L LONG -255
186 87: a APPEND
187 88: L LONG -256
188 95: a APPEND
189 96: L LONG 65535
190 104: a APPEND
191 105: L LONG -65535
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000192 114: a APPEND
Mark Dickinson8dd05142009-01-20 20:43:58 +0000193 115: L LONG -65536
194 124: a APPEND
195 125: L LONG 2147483647
196 138: a APPEND
197 139: L LONG -2147483647
198 153: a APPEND
199 154: L LONG -2147483648
200 168: a APPEND
201 169: ( MARK
202 170: V UNICODE 'abc'
203 175: p PUT 4
204 178: g GET 4
205 181: c GLOBAL 'copyreg _reconstructor'
206 205: p PUT 5
207 208: ( MARK
208 209: c GLOBAL '__main__ C'
209 221: p PUT 6
210 224: c GLOBAL 'builtins object'
211 241: p PUT 7
212 244: N NONE
213 245: t TUPLE (MARK at 208)
214 246: p PUT 8
215 249: R REDUCE
216 250: p PUT 9
217 253: ( MARK
218 254: d DICT (MARK at 253)
219 255: p PUT 10
220 259: V UNICODE 'foo'
221 264: p PUT 11
222 268: L LONG 1
223 272: s SETITEM
224 273: V UNICODE 'bar'
225 278: p PUT 12
226 282: L LONG 2
227 286: s SETITEM
228 287: b BUILD
229 288: g GET 9
230 291: t TUPLE (MARK at 169)
231 292: p PUT 13
232 296: a APPEND
233 297: g GET 13
234 301: a APPEND
235 302: L LONG 5
236 306: a APPEND
237 307: . STOP
Tim Peters70b02d72003-02-02 17:26:40 +0000238highest protocol among opcodes = 0
239"""
240
Guido van Rossum98297ee2007-11-06 21:34:58 +0000241DATA1 = (
Georg Brandl1a3284e2007-12-02 09:40:06 +0000242 b']q\x00(K\x00K\x01G@\x00\x00\x00\x00\x00\x00\x00c'
243 b'builtins\ncomplex\nq\x01'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000244 b'(G@\x08\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00t'
245 b'q\x02Rq\x03K\x01J\xff\xff\xff\xffK\xffJ\x01\xff\xff\xffJ'
246 b'\x00\xff\xff\xffM\xff\xffJ\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff'
247 b'\xff\x7fJ\x01\x00\x00\x80J\x00\x00\x00\x80(X\x03\x00\x00\x00ab'
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000248 b'cq\x04h\x04ccopyreg\n_reco'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000249 b'nstructor\nq\x05(c__main'
Georg Brandl1a3284e2007-12-02 09:40:06 +0000250 b'__\nC\nq\x06cbuiltins\n'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000251 b'object\nq\x07Ntq\x08Rq\t}q\n('
252 b'X\x03\x00\x00\x00fooq\x0bK\x01X\x03\x00\x00\x00bar'
253 b'q\x0cK\x02ubh\ttq\rh\rK\x05e.'
254)
Tim Peters70b02d72003-02-02 17:26:40 +0000255
Guido van Rossum98297ee2007-11-06 21:34:58 +0000256# Disassembly of DATA1
Tim Peters70b02d72003-02-02 17:26:40 +0000257DATA1_DIS = """\
258 0: ] EMPTY_LIST
Guido van Rossum98297ee2007-11-06 21:34:58 +0000259 1: q BINPUT 0
Tim Peters70b02d72003-02-02 17:26:40 +0000260 3: ( MARK
261 4: K BININT1 0
Guido van Rossum98297ee2007-11-06 21:34:58 +0000262 6: K BININT1 1
263 8: G BINFLOAT 2.0
Georg Brandl1a3284e2007-12-02 09:40:06 +0000264 17: c GLOBAL 'builtins complex'
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000265 35: q BINPUT 1
266 37: ( MARK
267 38: G BINFLOAT 3.0
268 47: G BINFLOAT 0.0
269 56: t TUPLE (MARK at 37)
270 57: q BINPUT 2
271 59: R REDUCE
272 60: q BINPUT 3
273 62: K BININT1 1
274 64: J BININT -1
275 69: K BININT1 255
276 71: J BININT -255
277 76: J BININT -256
278 81: M BININT2 65535
279 84: J BININT -65535
280 89: J BININT -65536
281 94: J BININT 2147483647
282 99: J BININT -2147483647
283 104: J BININT -2147483648
284 109: ( MARK
285 110: X BINUNICODE 'abc'
286 118: q BINPUT 4
287 120: h BINGET 4
288 122: c GLOBAL 'copyreg _reconstructor'
289 146: q BINPUT 5
290 148: ( MARK
291 149: c GLOBAL '__main__ C'
292 161: q BINPUT 6
293 163: c GLOBAL 'builtins object'
294 180: q BINPUT 7
295 182: N NONE
296 183: t TUPLE (MARK at 148)
297 184: q BINPUT 8
298 186: R REDUCE
299 187: q BINPUT 9
300 189: } EMPTY_DICT
301 190: q BINPUT 10
302 192: ( MARK
303 193: X BINUNICODE 'foo'
304 201: q BINPUT 11
305 203: K BININT1 1
306 205: X BINUNICODE 'bar'
307 213: q BINPUT 12
308 215: K BININT1 2
309 217: u SETITEMS (MARK at 192)
310 218: b BUILD
311 219: h BINGET 9
312 221: t TUPLE (MARK at 109)
313 222: q BINPUT 13
314 224: h BINGET 13
315 226: K BININT1 5
316 228: e APPENDS (MARK at 3)
317 229: . STOP
Tim Peters70b02d72003-02-02 17:26:40 +0000318highest protocol among opcodes = 1
319"""
Tim Peterse0c446b2001-10-18 21:57:37 +0000320
Guido van Rossum98297ee2007-11-06 21:34:58 +0000321DATA2 = (
322 b'\x80\x02]q\x00(K\x00K\x01G@\x00\x00\x00\x00\x00\x00\x00c'
Georg Brandl1a3284e2007-12-02 09:40:06 +0000323 b'builtins\ncomplex\n'
Guido van Rossum98297ee2007-11-06 21:34:58 +0000324 b'q\x01G@\x08\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00'
325 b'\x86q\x02Rq\x03K\x01J\xff\xff\xff\xffK\xffJ\x01\xff\xff\xff'
326 b'J\x00\xff\xff\xffM\xff\xffJ\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff'
327 b'\xff\xff\x7fJ\x01\x00\x00\x80J\x00\x00\x00\x80(X\x03\x00\x00\x00a'
328 b'bcq\x04h\x04c__main__\nC\nq\x05'
329 b')\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08K\x01'
330 b'X\x03\x00\x00\x00barq\tK\x02ubh\x06tq\nh'
331 b'\nK\x05e.'
332)
Tim Petersfc273752003-03-02 04:54:24 +0000333
Guido van Rossum98297ee2007-11-06 21:34:58 +0000334# Disassembly of DATA2
Tim Petersfc273752003-03-02 04:54:24 +0000335DATA2_DIS = """\
336 0: \x80 PROTO 2
337 2: ] EMPTY_LIST
Guido van Rossum98297ee2007-11-06 21:34:58 +0000338 3: q BINPUT 0
Tim Petersfc273752003-03-02 04:54:24 +0000339 5: ( MARK
340 6: K BININT1 0
Guido van Rossum98297ee2007-11-06 21:34:58 +0000341 8: K BININT1 1
342 10: G BINFLOAT 2.0
Georg Brandl1a3284e2007-12-02 09:40:06 +0000343 19: c GLOBAL 'builtins complex'
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000344 37: q BINPUT 1
345 39: G BINFLOAT 3.0
346 48: G BINFLOAT 0.0
347 57: \x86 TUPLE2
348 58: q BINPUT 2
349 60: R REDUCE
350 61: q BINPUT 3
351 63: K BININT1 1
352 65: J BININT -1
353 70: K BININT1 255
354 72: J BININT -255
355 77: J BININT -256
356 82: M BININT2 65535
357 85: J BININT -65535
358 90: J BININT -65536
359 95: J BININT 2147483647
360 100: J BININT -2147483647
361 105: J BININT -2147483648
362 110: ( MARK
363 111: X BINUNICODE 'abc'
364 119: q BINPUT 4
365 121: h BINGET 4
366 123: c GLOBAL '__main__ C'
367 135: q BINPUT 5
368 137: ) EMPTY_TUPLE
369 138: \x81 NEWOBJ
370 139: q BINPUT 6
371 141: } EMPTY_DICT
372 142: q BINPUT 7
373 144: ( MARK
374 145: X BINUNICODE 'foo'
375 153: q BINPUT 8
376 155: K BININT1 1
377 157: X BINUNICODE 'bar'
378 165: q BINPUT 9
379 167: K BININT1 2
380 169: u SETITEMS (MARK at 144)
381 170: b BUILD
382 171: h BINGET 6
383 173: t TUPLE (MARK at 110)
384 174: q BINPUT 10
385 176: h BINGET 10
386 178: K BININT1 5
387 180: e APPENDS (MARK at 5)
388 181: . STOP
Tim Petersfc273752003-03-02 04:54:24 +0000389highest protocol among opcodes = 2
390"""
391
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000392# set([1,2]) pickled from 2.x with protocol 2
393DATA3 = b'\x80\x02c__builtin__\nset\nq\x00]q\x01(K\x01K\x02e\x85q\x02Rq\x03.'
394
395# xrange(5) pickled from 2.x with protocol 2
396DATA4 = b'\x80\x02c__builtin__\nxrange\nq\x00K\x00K\x05K\x01\x87q\x01Rq\x02.'
397
398# a SimpleCookie() object pickled from 2.x with protocol 2
399DATA5 = (b'\x80\x02cCookie\nSimpleCookie\nq\x00)\x81q\x01U\x03key'
400 b'q\x02cCookie\nMorsel\nq\x03)\x81q\x04(U\x07commentq\x05U'
401 b'\x00q\x06U\x06domainq\x07h\x06U\x06secureq\x08h\x06U\x07'
402 b'expiresq\th\x06U\x07max-ageq\nh\x06U\x07versionq\x0bh\x06U'
403 b'\x04pathq\x0ch\x06U\x08httponlyq\rh\x06u}q\x0e(U\x0b'
404 b'coded_valueq\x0fU\x05valueq\x10h\x10h\x10h\x02h\x02ubs}q\x11b.')
405
406# set([3]) pickled from 2.x with protocol 2
407DATA6 = b'\x80\x02c__builtin__\nset\nq\x00]q\x01K\x03a\x85q\x02Rq\x03.'
408
409
Jeremy Hylton66426532001-10-15 21:38:56 +0000410def create_data():
Tim Peterse9358162001-01-22 22:05:20 +0000411 c = C()
412 c.foo = 1
413 c.bar = 2
Guido van Rossume2a383d2007-01-15 16:59:06 +0000414 x = [0, 1, 2.0, 3.0+0j]
Tim Peters461922a2001-04-09 20:07:05 +0000415 # Append some integer test cases at cPickle.c's internal size
416 # cutoffs.
417 uint1max = 0xff
418 uint2max = 0xffff
419 int4max = 0x7fffffff
420 x.extend([1, -1,
421 uint1max, -uint1max, -uint1max-1,
422 uint2max, -uint2max, -uint2max-1,
423 int4max, -int4max, -int4max-1])
Tim Peterse9358162001-01-22 22:05:20 +0000424 y = ('abc', 'abc', c, c)
425 x.append(y)
426 x.append(y)
427 x.append(5)
Jeremy Hylton66426532001-10-15 21:38:56 +0000428 return x
Tim Petersc58440f2001-04-09 17:16:31 +0000429
Jeremy Hylton66426532001-10-15 21:38:56 +0000430class AbstractPickleTests(unittest.TestCase):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000431 # Subclass must define self.dumps, self.loads.
Tim Petersc58440f2001-04-09 17:16:31 +0000432
Jeremy Hylton66426532001-10-15 21:38:56 +0000433 _testdata = create_data()
Tim Petersc58440f2001-04-09 17:16:31 +0000434
Jeremy Hylton66426532001-10-15 21:38:56 +0000435 def setUp(self):
Tim Peterse9358162001-01-22 22:05:20 +0000436 pass
Tim Petersc58440f2001-04-09 17:16:31 +0000437
Jeremy Hylton66426532001-10-15 21:38:56 +0000438 def test_misc(self):
439 # test various datatypes not tested by testdata
Tim Peters70b02d72003-02-02 17:26:40 +0000440 for proto in protocols:
441 x = myint(4)
442 s = self.dumps(x, proto)
443 y = self.loads(s)
444 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000445
Tim Peters70b02d72003-02-02 17:26:40 +0000446 x = (1, ())
447 s = self.dumps(x, proto)
448 y = self.loads(s)
449 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000450
Tim Peters70b02d72003-02-02 17:26:40 +0000451 x = initarg(1, x)
452 s = self.dumps(x, proto)
453 y = self.loads(s)
454 self.assertEqual(x, y)
Tim Peterse9358162001-01-22 22:05:20 +0000455
Jeremy Hylton66426532001-10-15 21:38:56 +0000456 # XXX test __reduce__ protocol?
457
Tim Peters70b02d72003-02-02 17:26:40 +0000458 def test_roundtrip_equality(self):
459 expected = self._testdata
460 for proto in protocols:
461 s = self.dumps(expected, proto)
462 got = self.loads(s)
463 self.assertEqual(expected, got)
Jeremy Hylton66426532001-10-15 21:38:56 +0000464
Guido van Rossum98297ee2007-11-06 21:34:58 +0000465 def test_load_from_data0(self):
466 self.assertEqual(self._testdata, self.loads(DATA0))
467
468 def test_load_from_data1(self):
469 self.assertEqual(self._testdata, self.loads(DATA1))
470
471 def test_load_from_data2(self):
472 self.assertEqual(self._testdata, self.loads(DATA2))
Jeremy Hylton66426532001-10-15 21:38:56 +0000473
Alexander Belopolskyd92f0402010-07-17 22:50:45 +0000474 def test_load_classic_instance(self):
475 # See issue5180. Test loading 2.x pickles that
476 # contain an instance of old style class.
477 for X, args in [(C, ()), (D, ('x',)), (E, ())]:
478 xname = X.__name__.encode('ascii')
479 # Protocol 0 (text mode pickle):
480 """
481 0: ( MARK
482 1: i INST '__main__ X' (MARK at 0)
483 15: p PUT 0
484 18: ( MARK
485 19: d DICT (MARK at 18)
486 20: p PUT 1
487 23: b BUILD
488 24: . STOP
489 """
490 pickle0 = (b"(i__main__\n"
491 b"X\n"
492 b"p0\n"
493 b"(dp1\nb.").replace(b'X', xname)
494 self.assertEqual(X(*args), self.loads(pickle0))
495
496 # Protocol 1 (binary mode pickle)
497 """
498 0: ( MARK
499 1: c GLOBAL '__main__ X'
500 15: q BINPUT 0
501 17: o OBJ (MARK at 0)
502 18: q BINPUT 1
503 20: } EMPTY_DICT
504 21: q BINPUT 2
505 23: b BUILD
506 24: . STOP
507 """
508 pickle1 = (b'(c__main__\n'
509 b'X\n'
510 b'q\x00oq\x01}q\x02b.').replace(b'X', xname)
511 self.assertEqual(X(*args), self.loads(pickle1))
512
513 # Protocol 2 (pickle2 = b'\x80\x02' + pickle1)
514 """
515 0: \x80 PROTO 2
516 2: ( MARK
517 3: c GLOBAL '__main__ X'
518 17: q BINPUT 0
519 19: o OBJ (MARK at 2)
520 20: q BINPUT 1
521 22: } EMPTY_DICT
522 23: q BINPUT 2
523 25: b BUILD
524 26: . STOP
525 """
526 pickle2 = (b'\x80\x02(c__main__\n'
527 b'X\n'
528 b'q\x00oq\x01}q\x02b.').replace(b'X', xname)
529 self.assertEqual(X(*args), self.loads(pickle2))
530
Tim Peters70b02d72003-02-02 17:26:40 +0000531 # There are gratuitous differences between pickles produced by
532 # pickle and cPickle, largely because cPickle starts PUT indices at
533 # 1 and pickle starts them at 0. See XXX comment in cPickle's put2() --
534 # there's a comment with an exclamation point there whose meaning
535 # is a mystery. cPickle also suppresses PUT for objects with a refcount
536 # of 1.
537 def dont_test_disassembly(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000538 from io import StringIO
Tim Peters70b02d72003-02-02 17:26:40 +0000539 from pickletools import dis
540
541 for proto, expected in (0, DATA0_DIS), (1, DATA1_DIS):
542 s = self.dumps(self._testdata, proto)
543 filelike = StringIO()
544 dis(s, out=filelike)
545 got = filelike.getvalue()
546 self.assertEqual(expected, got)
Jeremy Hylton66426532001-10-15 21:38:56 +0000547
548 def test_recursive_list(self):
549 l = []
550 l.append(l)
Tim Peters70b02d72003-02-02 17:26:40 +0000551 for proto in protocols:
552 s = self.dumps(l, proto)
553 x = self.loads(s)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000554 self.assertEqual(len(x), 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000555 self.assertTrue(x is x[0])
Jeremy Hylton66426532001-10-15 21:38:56 +0000556
Collin Winter8ca69de2009-05-26 16:53:41 +0000557 def test_recursive_tuple(self):
558 t = ([],)
559 t[0].append(t)
560 for proto in protocols:
561 s = self.dumps(t, proto)
562 x = self.loads(s)
563 self.assertEqual(len(x), 1)
564 self.assertEqual(len(x[0]), 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000565 self.assertTrue(x is x[0][0])
Collin Winter8ca69de2009-05-26 16:53:41 +0000566
Jeremy Hylton66426532001-10-15 21:38:56 +0000567 def test_recursive_dict(self):
568 d = {}
569 d[1] = d
Tim Peters70b02d72003-02-02 17:26:40 +0000570 for proto in protocols:
571 s = self.dumps(d, proto)
572 x = self.loads(s)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000573 self.assertEqual(list(x.keys()), [1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000574 self.assertTrue(x[1] is x)
Jeremy Hylton66426532001-10-15 21:38:56 +0000575
576 def test_recursive_inst(self):
577 i = C()
578 i.attr = i
Tim Peters70b02d72003-02-02 17:26:40 +0000579 for proto in protocols:
580 s = self.dumps(i, 2)
581 x = self.loads(s)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000582 self.assertEqual(dir(x), dir(i))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000583 self.assertTrue(x.attr is x)
Jeremy Hylton66426532001-10-15 21:38:56 +0000584
585 def test_recursive_multi(self):
586 l = []
587 d = {1:l}
588 i = C()
589 i.attr = d
590 l.append(i)
Tim Peters70b02d72003-02-02 17:26:40 +0000591 for proto in protocols:
592 s = self.dumps(l, proto)
593 x = self.loads(s)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000594 self.assertEqual(len(x), 1)
595 self.assertEqual(dir(x[0]), dir(i))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000596 self.assertEqual(list(x[0].attr.keys()), [1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000597 self.assertTrue(x[0].attr[1] is x)
Jeremy Hylton66426532001-10-15 21:38:56 +0000598
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000599 def test_get(self):
600 self.assertRaises(KeyError, self.loads, b'g0\np0')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000601 self.assertEqual(self.loads(b'((Kdtp0\nh\x00l.))'), [(100,), (100,)])
Jeremy Hylton66426532001-10-15 21:38:56 +0000602
603 def test_insecure_strings(self):
Guido van Rossum39478e82007-08-27 17:23:59 +0000604 # XXX Some of these tests are temporarily disabled
605 insecure = [b"abc", b"2 + 2", # not quoted
606 ## b"'abc' + 'def'", # not a single quoted string
607 b"'abc", # quote is not closed
608 b"'abc\"", # open quote and close quote don't match
609 b"'abc' ?", # junk after close quote
610 b"'\\'", # trailing backslash
Jeremy Hylton66426532001-10-15 21:38:56 +0000611 # some tests of the quoting rules
Guido van Rossum39478e82007-08-27 17:23:59 +0000612 ## b"'abc\"\''",
613 ## b"'\\\\a\'\'\'\\\'\\\\\''",
Jeremy Hylton66426532001-10-15 21:38:56 +0000614 ]
Guido van Rossum39478e82007-08-27 17:23:59 +0000615 for b in insecure:
616 buf = b"S" + b + b"\012p0\012."
Jeremy Hylton66426532001-10-15 21:38:56 +0000617 self.assertRaises(ValueError, self.loads, buf)
618
Walter Dörwald9b775532007-06-08 14:30:53 +0000619 def test_unicode(self):
Benjamin Petersond1486302008-12-27 16:58:50 +0000620 endcases = ['', '<\\u>', '<\\\u1234>', '<\n>',
Victor Stinner485fb562010-04-13 11:07:24 +0000621 '<\\>', '<\\\U00012345>',
622 # surrogates
623 '<\udc80>']
Walter Dörwald9b775532007-06-08 14:30:53 +0000624 for proto in protocols:
625 for u in endcases:
626 p = self.dumps(u, proto)
627 u2 = self.loads(p)
628 self.assertEqual(u2, u)
Tim Peterse089c682001-04-10 03:41:41 +0000629
Alexandre Vassalotti554d8782008-12-27 07:32:41 +0000630 def test_unicode_high_plane(self):
631 t = '\U00012345'
632 for proto in protocols:
633 p = self.dumps(t, proto)
634 t2 = self.loads(p)
635 self.assertEqual(t2, t)
636
Guido van Rossumf4169812008-03-17 22:56:06 +0000637 def test_bytes(self):
638 for proto in protocols:
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500639 for s in b'', b'xyz', b'xyz'*100:
640 p = self.dumps(s)
641 self.assertEqual(self.loads(p), s)
642 for s in [bytes([i]) for i in range(256)]:
643 p = self.dumps(s)
644 self.assertEqual(self.loads(p), s)
645 for s in [bytes([i, i]) for i in range(256)]:
646 p = self.dumps(s)
647 self.assertEqual(self.loads(p), s)
Guido van Rossumf4169812008-03-17 22:56:06 +0000648
Jeremy Hylton66426532001-10-15 21:38:56 +0000649 def test_ints(self):
650 import sys
Tim Petersee1a53c2003-02-02 02:57:53 +0000651 for proto in protocols:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000652 n = sys.maxsize
Tim Petersee1a53c2003-02-02 02:57:53 +0000653 while n:
654 for expected in (-n, n):
655 s = self.dumps(expected, proto)
656 n2 = self.loads(s)
657 self.assertEqual(expected, n2)
658 n = n >> 1
Tim Peters19ef62d2001-08-28 22:21:18 +0000659
Jeremy Hylton66426532001-10-15 21:38:56 +0000660 def test_maxint64(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000661 maxint64 = (1 << 63) - 1
Guido van Rossum39478e82007-08-27 17:23:59 +0000662 data = b'I' + str(maxint64).encode("ascii") + b'\n.'
Jeremy Hylton66426532001-10-15 21:38:56 +0000663 got = self.loads(data)
664 self.assertEqual(got, maxint64)
665
666 # Try too with a bogus literal.
Guido van Rossum39478e82007-08-27 17:23:59 +0000667 data = b'I' + str(maxint64).encode("ascii") + b'JUNK\n.'
Jeremy Hylton66426532001-10-15 21:38:56 +0000668 self.assertRaises(ValueError, self.loads, data)
669
Tim Petersee1a53c2003-02-02 02:57:53 +0000670 def test_long(self):
671 for proto in protocols:
Tim Petersbf2674b2003-02-02 07:51:32 +0000672 # 256 bytes is where LONG4 begins.
Tim Petersee1a53c2003-02-02 02:57:53 +0000673 for nbits in 1, 8, 8*254, 8*255, 8*256, 8*257:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000674 nbase = 1 << nbits
Tim Petersee1a53c2003-02-02 02:57:53 +0000675 for npos in nbase-1, nbase, nbase+1:
676 for n in npos, -npos:
677 pickle = self.dumps(n, proto)
678 got = self.loads(pickle)
679 self.assertEqual(n, got)
680 # Try a monster. This is quadratic-time in protos 0 & 1, so don't
681 # bother with those.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000682 nbase = int("deadbeeffeedface", 16)
Tim Petersee1a53c2003-02-02 02:57:53 +0000683 nbase += nbase << 1000000
684 for n in nbase, -nbase:
Tim Petersee1a53c2003-02-02 02:57:53 +0000685 p = self.dumps(n, 2)
Tim Petersee1a53c2003-02-02 02:57:53 +0000686 got = self.loads(p)
Tim Petersee1a53c2003-02-02 02:57:53 +0000687 self.assertEqual(n, got)
688
Mark Dickinsoncddcf442009-01-24 21:46:33 +0000689 def test_float(self):
690 test_values = [0.0, 4.94e-324, 1e-310, 7e-308, 6.626e-34, 0.1, 0.5,
691 3.14, 263.44582062374053, 6.022e23, 1e30]
692 test_values = test_values + [-x for x in test_values]
693 for proto in protocols:
694 for value in test_values:
695 pickle = self.dumps(value, proto)
696 got = self.loads(pickle)
697 self.assertEqual(value, got)
698
Thomas Wouters477c8d52006-05-27 19:21:47 +0000699 @run_with_locale('LC_ALL', 'de_DE', 'fr_FR')
700 def test_float_format(self):
Guido van Rossumf4169812008-03-17 22:56:06 +0000701 # make sure that floats are formatted locale independent with proto 0
702 self.assertEqual(self.dumps(1.2, 0)[0:3], b'F1.')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000703
Jeremy Hylton66426532001-10-15 21:38:56 +0000704 def test_reduce(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000705 pass
Jeremy Hylton66426532001-10-15 21:38:56 +0000706
707 def test_getinitargs(self):
708 pass
709
Guido van Rossum04a86612001-12-19 16:58:54 +0000710 def test_metaclass(self):
711 a = use_metaclass()
Tim Peters70b02d72003-02-02 17:26:40 +0000712 for proto in protocols:
713 s = self.dumps(a, proto)
714 b = self.loads(s)
715 self.assertEqual(a.__class__, b.__class__)
Guido van Rossum04a86612001-12-19 16:58:54 +0000716
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200717 def test_dynamic_class(self):
718 a = create_dynamic_class("my_dynamic_class", (object,))
719 copyreg.pickle(pickling_metaclass, pickling_metaclass.__reduce__)
720 for proto in protocols:
721 s = self.dumps(a, proto)
722 b = self.loads(s)
723 self.assertEqual(a, b)
724
Michael W. Hudson7bb466a2002-03-05 13:27:58 +0000725 def test_structseq(self):
726 import time
Michael W. Hudson0e025302002-03-06 17:11:18 +0000727 import os
Tim Peters70b02d72003-02-02 17:26:40 +0000728
729 t = time.localtime()
730 for proto in protocols:
731 s = self.dumps(t, proto)
Michael W. Hudson0e025302002-03-06 17:11:18 +0000732 u = self.loads(s)
733 self.assertEqual(t, u)
Tim Peters70b02d72003-02-02 17:26:40 +0000734 if hasattr(os, "stat"):
735 t = os.stat(os.curdir)
736 s = self.dumps(t, proto)
737 u = self.loads(s)
738 self.assertEqual(t, u)
739 if hasattr(os, "statvfs"):
740 t = os.statvfs(os.curdir)
741 s = self.dumps(t, proto)
742 u = self.loads(s)
743 self.assertEqual(t, u)
Michael W. Hudson7bb466a2002-03-05 13:27:58 +0000744
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000745 # Tests for protocol 2
746
Tim Peters4190fb82003-02-02 16:09:05 +0000747 def test_proto(self):
748 build_none = pickle.NONE + pickle.STOP
749 for proto in protocols:
750 expected = build_none
751 if proto >= 2:
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000752 expected = pickle.PROTO + bytes([proto]) + expected
Tim Peters4190fb82003-02-02 16:09:05 +0000753 p = self.dumps(None, proto)
754 self.assertEqual(p, expected)
755
756 oob = protocols[-1] + 1 # a future protocol
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000757 badpickle = pickle.PROTO + bytes([oob]) + build_none
Tim Peters4190fb82003-02-02 16:09:05 +0000758 try:
759 self.loads(badpickle)
Guido van Rossumb940e112007-01-10 16:19:56 +0000760 except ValueError as detail:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000761 self.assertTrue(str(detail).startswith(
Tim Peters4190fb82003-02-02 16:09:05 +0000762 "unsupported pickle protocol"))
763 else:
764 self.fail("expected bad protocol number to raise ValueError")
765
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000766 def test_long1(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000767 x = 12345678910111213141516178920
Tim Peters61bf2572003-02-03 21:31:22 +0000768 for proto in protocols:
769 s = self.dumps(x, proto)
770 y = self.loads(s)
771 self.assertEqual(x, y)
Tim Peters22e71712003-02-03 22:27:38 +0000772 self.assertEqual(opcode_in_pickle(pickle.LONG1, s), proto >= 2)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000773
774 def test_long4(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000775 x = 12345678910111213141516178920 << (256*8)
Tim Peters61bf2572003-02-03 21:31:22 +0000776 for proto in protocols:
777 s = self.dumps(x, proto)
778 y = self.loads(s)
779 self.assertEqual(x, y)
Tim Peters22e71712003-02-03 22:27:38 +0000780 self.assertEqual(opcode_in_pickle(pickle.LONG4, s), proto >= 2)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000781
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000782 def test_short_tuples(self):
Tim Peters1d63c9f2003-02-02 20:29:39 +0000783 # Map (proto, len(tuple)) to expected opcode.
784 expected_opcode = {(0, 0): pickle.TUPLE,
785 (0, 1): pickle.TUPLE,
786 (0, 2): pickle.TUPLE,
787 (0, 3): pickle.TUPLE,
788 (0, 4): pickle.TUPLE,
789
790 (1, 0): pickle.EMPTY_TUPLE,
791 (1, 1): pickle.TUPLE,
792 (1, 2): pickle.TUPLE,
793 (1, 3): pickle.TUPLE,
794 (1, 4): pickle.TUPLE,
795
796 (2, 0): pickle.EMPTY_TUPLE,
797 (2, 1): pickle.TUPLE1,
798 (2, 2): pickle.TUPLE2,
799 (2, 3): pickle.TUPLE3,
800 (2, 4): pickle.TUPLE,
Guido van Rossumf4169812008-03-17 22:56:06 +0000801
802 (3, 0): pickle.EMPTY_TUPLE,
803 (3, 1): pickle.TUPLE1,
804 (3, 2): pickle.TUPLE2,
805 (3, 3): pickle.TUPLE3,
806 (3, 4): pickle.TUPLE,
Tim Peters1d63c9f2003-02-02 20:29:39 +0000807 }
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000808 a = ()
Guido van Rossum025bc2f2003-01-28 04:20:02 +0000809 b = (1,)
810 c = (1, 2)
811 d = (1, 2, 3)
812 e = (1, 2, 3, 4)
Tim Peters4190fb82003-02-02 16:09:05 +0000813 for proto in protocols:
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000814 for x in a, b, c, d, e:
815 s = self.dumps(x, proto)
816 y = self.loads(s)
817 self.assertEqual(x, y, (proto, x, s, y))
Tim Peters1d63c9f2003-02-02 20:29:39 +0000818 expected = expected_opcode[proto, len(x)]
Tim Peters22e71712003-02-03 22:27:38 +0000819 self.assertEqual(opcode_in_pickle(expected, s), True)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000820
Guido van Rossum7d97d312003-01-28 04:25:27 +0000821 def test_singletons(self):
Tim Peters61bf2572003-02-03 21:31:22 +0000822 # Map (proto, singleton) to expected opcode.
823 expected_opcode = {(0, None): pickle.NONE,
824 (1, None): pickle.NONE,
825 (2, None): pickle.NONE,
Guido van Rossumf4169812008-03-17 22:56:06 +0000826 (3, None): pickle.NONE,
Tim Peters61bf2572003-02-03 21:31:22 +0000827
828 (0, True): pickle.INT,
829 (1, True): pickle.INT,
830 (2, True): pickle.NEWTRUE,
Guido van Rossumf4169812008-03-17 22:56:06 +0000831 (3, True): pickle.NEWTRUE,
Tim Peters61bf2572003-02-03 21:31:22 +0000832
833 (0, False): pickle.INT,
834 (1, False): pickle.INT,
835 (2, False): pickle.NEWFALSE,
Guido van Rossumf4169812008-03-17 22:56:06 +0000836 (3, False): pickle.NEWFALSE,
Tim Peters61bf2572003-02-03 21:31:22 +0000837 }
Tim Peters4190fb82003-02-02 16:09:05 +0000838 for proto in protocols:
Guido van Rossum7d97d312003-01-28 04:25:27 +0000839 for x in None, False, True:
840 s = self.dumps(x, proto)
841 y = self.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000842 self.assertTrue(x is y, (proto, x, s, y))
Tim Peters61bf2572003-02-03 21:31:22 +0000843 expected = expected_opcode[proto, x]
Tim Peters22e71712003-02-03 22:27:38 +0000844 self.assertEqual(opcode_in_pickle(expected, s), True)
Tim Peters3c67d792003-02-02 17:59:11 +0000845
Guido van Rossum533dbcf2003-01-28 17:55:05 +0000846 def test_newobj_tuple(self):
Guido van Rossum3d8c01b2003-01-28 19:48:18 +0000847 x = MyTuple([1, 2, 3])
848 x.foo = 42
849 x.bar = "hello"
Tim Peters894453a2003-02-03 22:32:18 +0000850 for proto in protocols:
851 s = self.dumps(x, proto)
852 y = self.loads(s)
853 self.assertEqual(tuple(x), tuple(y))
854 self.assertEqual(x.__dict__, y.__dict__)
Guido van Rossum533dbcf2003-01-28 17:55:05 +0000855
856 def test_newobj_list(self):
Guido van Rossum3d8c01b2003-01-28 19:48:18 +0000857 x = MyList([1, 2, 3])
858 x.foo = 42
859 x.bar = "hello"
Tim Peters894453a2003-02-03 22:32:18 +0000860 for proto in protocols:
861 s = self.dumps(x, proto)
862 y = self.loads(s)
863 self.assertEqual(list(x), list(y))
864 self.assertEqual(x.__dict__, y.__dict__)
Guido van Rossum533dbcf2003-01-28 17:55:05 +0000865
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000866 def test_newobj_generic(self):
Tim Peters5013bd92003-02-03 22:28:41 +0000867 for proto in protocols:
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000868 for C in myclasses:
869 B = C.__base__
870 x = C(C.sample)
871 x.foo = 42
872 s = self.dumps(x, proto)
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000873 y = self.loads(s)
874 detail = (proto, C, B, x, y, type(y))
875 self.assertEqual(B(x), B(y), detail)
876 self.assertEqual(x.__dict__, y.__dict__, detail)
877
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000878 # Register a type with copyreg, with extension code extcode. Pickle
Tim Peters22e71712003-02-03 22:27:38 +0000879 # an object of that type. Check that the resulting pickle uses opcode
880 # (EXT[124]) under proto 2, and not in proto 1.
Tim Peters3e667d52003-02-04 21:47:44 +0000881
Tim Peters22e71712003-02-03 22:27:38 +0000882 def produce_global_ext(self, extcode, opcode):
Tim Peters3e667d52003-02-04 21:47:44 +0000883 e = ExtensionSaver(extcode)
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000884 try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000885 copyreg.add_extension(__name__, "MyList", extcode)
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000886 x = MyList([1, 2, 3])
887 x.foo = 42
888 x.bar = "hello"
889
Tim Peters22e71712003-02-03 22:27:38 +0000890 # Dump using protocol 1 for comparison.
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000891 s1 = self.dumps(x, 1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000892 self.assertIn(__name__.encode("utf-8"), s1)
893 self.assertIn(b"MyList", s1)
Tim Peters3e667d52003-02-04 21:47:44 +0000894 self.assertEqual(opcode_in_pickle(opcode, s1), False)
895
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000896 y = self.loads(s1)
897 self.assertEqual(list(x), list(y))
898 self.assertEqual(x.__dict__, y.__dict__)
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000899
Tim Peters22e71712003-02-03 22:27:38 +0000900 # Dump using protocol 2 for test.
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000901 s2 = self.dumps(x, 2)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000902 self.assertNotIn(__name__.encode("utf-8"), s2)
903 self.assertNotIn(b"MyList", s2)
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000904 self.assertEqual(opcode_in_pickle(opcode, s2), True, repr(s2))
Tim Peters3e667d52003-02-04 21:47:44 +0000905
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000906 y = self.loads(s2)
907 self.assertEqual(list(x), list(y))
908 self.assertEqual(x.__dict__, y.__dict__)
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000909
910 finally:
Tim Peters3e667d52003-02-04 21:47:44 +0000911 e.restore()
Tim Peters22e71712003-02-03 22:27:38 +0000912
913 def test_global_ext1(self):
Tim Peters3e667d52003-02-04 21:47:44 +0000914 self.produce_global_ext(0x00000001, pickle.EXT1) # smallest EXT1 code
915 self.produce_global_ext(0x000000ff, pickle.EXT1) # largest EXT1 code
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000916
917 def test_global_ext2(self):
Tim Peters3e667d52003-02-04 21:47:44 +0000918 self.produce_global_ext(0x00000100, pickle.EXT2) # smallest EXT2 code
919 self.produce_global_ext(0x0000ffff, pickle.EXT2) # largest EXT2 code
920 self.produce_global_ext(0x0000abcd, pickle.EXT2) # check endianness
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000921
922 def test_global_ext4(self):
Tim Peters3e667d52003-02-04 21:47:44 +0000923 self.produce_global_ext(0x00010000, pickle.EXT4) # smallest EXT4 code
924 self.produce_global_ext(0x7fffffff, pickle.EXT4) # largest EXT4 code
925 self.produce_global_ext(0x12abcdef, pickle.EXT4) # check endianness
926
Tim Peters8d2613a2003-02-11 16:40:16 +0000927 def test_list_chunking(self):
928 n = 10 # too small to chunk
Guido van Rossum805365e2007-05-07 22:24:25 +0000929 x = list(range(n))
Tim Peters8d2613a2003-02-11 16:40:16 +0000930 for proto in protocols:
931 s = self.dumps(x, proto)
932 y = self.loads(s)
933 self.assertEqual(x, y)
934 num_appends = count_opcode(pickle.APPENDS, s)
935 self.assertEqual(num_appends, proto > 0)
936
937 n = 2500 # expect at least two chunks when proto > 0
Guido van Rossum805365e2007-05-07 22:24:25 +0000938 x = list(range(n))
Tim Peters8d2613a2003-02-11 16:40:16 +0000939 for proto in protocols:
940 s = self.dumps(x, proto)
941 y = self.loads(s)
942 self.assertEqual(x, y)
943 num_appends = count_opcode(pickle.APPENDS, s)
944 if proto == 0:
945 self.assertEqual(num_appends, 0)
946 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000947 self.assertTrue(num_appends >= 2)
Tim Peters8d2613a2003-02-11 16:40:16 +0000948
949 def test_dict_chunking(self):
950 n = 10 # too small to chunk
951 x = dict.fromkeys(range(n))
952 for proto in protocols:
953 s = self.dumps(x, proto)
Ezio Melottie9615932010-01-24 19:26:24 +0000954 self.assertIsInstance(s, bytes_types)
Tim Peters8d2613a2003-02-11 16:40:16 +0000955 y = self.loads(s)
956 self.assertEqual(x, y)
957 num_setitems = count_opcode(pickle.SETITEMS, s)
958 self.assertEqual(num_setitems, proto > 0)
959
960 n = 2500 # expect at least two chunks when proto > 0
961 x = dict.fromkeys(range(n))
962 for proto in protocols:
963 s = self.dumps(x, proto)
964 y = self.loads(s)
965 self.assertEqual(x, y)
966 num_setitems = count_opcode(pickle.SETITEMS, s)
967 if proto == 0:
968 self.assertEqual(num_setitems, 0)
969 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000970 self.assertTrue(num_setitems >= 2)
Guido van Rossum0322d0f2003-01-29 06:12:46 +0000971
Tim Peterse9ef2032003-02-13 18:42:00 +0000972 def test_simple_newobj(self):
973 x = object.__new__(SimpleNewObj) # avoid __init__
974 x.abc = 666
975 for proto in protocols:
976 s = self.dumps(x, proto)
977 self.assertEqual(opcode_in_pickle(pickle.NEWOBJ, s), proto >= 2)
978 y = self.loads(s) # will raise TypeError if __init__ called
979 self.assertEqual(y.abc, 666)
980 self.assertEqual(x.__dict__, y.__dict__)
981
Tim Peters42f08ac2003-02-11 22:43:24 +0000982 def test_newobj_list_slots(self):
983 x = SlotList([1, 2, 3])
984 x.foo = 42
985 x.bar = "hello"
986 s = self.dumps(x, 2)
987 y = self.loads(s)
988 self.assertEqual(list(x), list(y))
989 self.assertEqual(x.__dict__, y.__dict__)
990 self.assertEqual(x.foo, y.foo)
991 self.assertEqual(x.bar, y.bar)
992
Guido van Rossum2a30b212003-02-18 22:41:24 +0000993 def test_reduce_overrides_default_reduce_ex(self):
Collin Winter771d8342009-04-16 03:18:06 +0000994 for proto in protocols:
Guido van Rossum2a30b212003-02-18 22:41:24 +0000995 x = REX_one()
996 self.assertEqual(x._reduce_called, 0)
997 s = self.dumps(x, proto)
998 self.assertEqual(x._reduce_called, 1)
999 y = self.loads(s)
1000 self.assertEqual(y._reduce_called, 0)
1001
1002 def test_reduce_ex_called(self):
Collin Winter771d8342009-04-16 03:18:06 +00001003 for proto in protocols:
Guido van Rossum2a30b212003-02-18 22:41:24 +00001004 x = REX_two()
1005 self.assertEqual(x._proto, None)
1006 s = self.dumps(x, proto)
1007 self.assertEqual(x._proto, proto)
1008 y = self.loads(s)
1009 self.assertEqual(y._proto, None)
1010
1011 def test_reduce_ex_overrides_reduce(self):
Collin Winter771d8342009-04-16 03:18:06 +00001012 for proto in protocols:
Guido van Rossum2a30b212003-02-18 22:41:24 +00001013 x = REX_three()
1014 self.assertEqual(x._proto, None)
1015 s = self.dumps(x, proto)
1016 self.assertEqual(x._proto, proto)
1017 y = self.loads(s)
1018 self.assertEqual(y._proto, None)
1019
Guido van Rossumd8faa362007-04-27 19:54:29 +00001020 def test_reduce_ex_calls_base(self):
Collin Winter771d8342009-04-16 03:18:06 +00001021 for proto in protocols:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001022 x = REX_four()
1023 self.assertEqual(x._proto, None)
1024 s = self.dumps(x, proto)
1025 self.assertEqual(x._proto, proto)
1026 y = self.loads(s)
1027 self.assertEqual(y._proto, proto)
1028
1029 def test_reduce_calls_base(self):
Collin Winter771d8342009-04-16 03:18:06 +00001030 for proto in protocols:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001031 x = REX_five()
1032 self.assertEqual(x._reduce_called, 0)
1033 s = self.dumps(x, proto)
1034 self.assertEqual(x._reduce_called, 1)
1035 y = self.loads(s)
1036 self.assertEqual(y._reduce_called, 1)
1037
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00001038 def test_bad_getattr(self):
1039 x = BadGetattr()
1040 for proto in 0, 1:
1041 self.assertRaises(RuntimeError, self.dumps, x, proto)
1042 # protocol 2 don't raise a RuntimeError.
1043 d = self.dumps(x, 2)
Antoine Pitrouff150f22010-10-22 21:41:05 +00001044 self.assertRaises(RuntimeError, self.loads, d)
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00001045
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00001046 def test_reduce_bad_iterator(self):
1047 # Issue4176: crash when 4th and 5th items of __reduce__()
1048 # are not iterators
1049 class C(object):
1050 def __reduce__(self):
1051 # 4th item is not an iterator
1052 return list, (), None, [], None
1053 class D(object):
1054 def __reduce__(self):
1055 # 5th item is not an iterator
1056 return dict, (), None, None, []
1057
Amaury Forgeot d'Arc6285ffd2008-10-31 17:52:47 +00001058 # Protocol 0 is less strict and also accept iterables.
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00001059 for proto in protocols:
Amaury Forgeot d'Arc6285ffd2008-10-31 17:52:47 +00001060 try:
1061 self.dumps(C(), proto)
1062 except (pickle.PickleError):
1063 pass
1064 try:
1065 self.dumps(D(), proto)
1066 except (pickle.PickleError):
1067 pass
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00001068
Collin Winter771d8342009-04-16 03:18:06 +00001069 def test_many_puts_and_gets(self):
1070 # Test that internal data structures correctly deal with lots of
1071 # puts/gets.
1072 keys = ("aaa" + str(i) for i in range(100))
1073 large_dict = dict((k, [4, 5, 6]) for k in keys)
1074 obj = [dict(large_dict), dict(large_dict), dict(large_dict)]
1075
1076 for proto in protocols:
1077 dumped = self.dumps(obj, proto)
1078 loaded = self.loads(dumped)
1079 self.assertEqual(loaded, obj,
1080 "Failed protocol %d: %r != %r"
1081 % (proto, obj, loaded))
1082
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001083 def test_attribute_name_interning(self):
1084 # Test that attribute names of pickled objects are interned when
1085 # unpickling.
1086 for proto in protocols:
1087 x = C()
1088 x.foo = 42
1089 x.bar = "hello"
1090 s = self.dumps(x, proto)
1091 y = self.loads(s)
1092 x_keys = sorted(x.__dict__)
1093 y_keys = sorted(y.__dict__)
1094 for x_key, y_key in zip(x_keys, y_keys):
1095 self.assertIs(x_key, y_key)
1096
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001097 def test_unpickle_from_2x(self):
1098 # Unpickle non-trivial data from Python 2.x.
1099 loaded = self.loads(DATA3)
1100 self.assertEqual(loaded, set([1, 2]))
1101 loaded = self.loads(DATA4)
1102 self.assertEqual(type(loaded), type(range(0)))
1103 self.assertEqual(list(loaded), list(range(5)))
1104 loaded = self.loads(DATA5)
1105 self.assertEqual(type(loaded), SimpleCookie)
1106 self.assertEqual(list(loaded.keys()), ["key"])
1107 self.assertEqual(loaded["key"].value, "Set-Cookie: key=value")
1108
1109 def test_pickle_to_2x(self):
1110 # Pickle non-trivial data with protocol 2, expecting that it yields
1111 # the same result as Python 2.x did.
1112 # NOTE: this test is a bit too strong since we can produce different
1113 # bytecode that 2.x will still understand.
1114 dumped = self.dumps(range(5), 2)
1115 self.assertEqual(dumped, DATA4)
1116 dumped = self.dumps(set([3]), 2)
1117 self.assertEqual(dumped, DATA6)
1118
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001119 def test_large_pickles(self):
1120 # Test the correctness of internal buffering routines when handling
1121 # large data.
1122 for proto in protocols:
Antoine Pitrou04248a82010-10-12 20:51:21 +00001123 data = (1, min, b'xy' * (30 * 1024), len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001124 dumped = self.dumps(data, proto)
1125 loaded = self.loads(dumped)
Antoine Pitrou04248a82010-10-12 20:51:21 +00001126 self.assertEqual(len(loaded), len(data))
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001127 self.assertEqual(loaded, data)
1128
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +00001129 def test_empty_bytestring(self):
1130 # issue 11286
1131 empty = self.loads(b'\x80\x03U\x00q\x00.', encoding='koi8-r')
1132 self.assertEqual(empty, '')
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001133
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001134 def check_negative_32b_binXXX(self, dumped):
1135 if sys.maxsize > 2**32:
1136 self.skipTest("test is only meaningful on 32-bit builds")
1137 # XXX Pure Python pickle reads lengths as signed and passes
1138 # them directly to read() (hence the EOFError)
1139 with self.assertRaises((pickle.UnpicklingError, EOFError,
1140 ValueError, OverflowError)):
1141 self.loads(dumped)
1142
1143 def test_negative_32b_binbytes(self):
1144 # On 32-bit builds, a BINBYTES of 2**31 or more is refused
1145 self.check_negative_32b_binXXX(b'\x80\x03B\xff\xff\xff\xffxyzq\x00.')
1146
1147 def test_negative_32b_binunicode(self):
1148 # On 32-bit builds, a BINUNICODE of 2**31 or more is refused
1149 self.check_negative_32b_binXXX(b'\x80\x03X\xff\xff\xff\xffxyzq\x00.')
1150
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001151 def test_negative_put(self):
1152 # Issue #12847
1153 dumped = b'Va\np-1\n.'
1154 self.assertRaises(ValueError, self.loads, dumped)
1155
1156 def test_negative_32b_binput(self):
1157 # Issue #12847
1158 if sys.maxsize > 2**32:
1159 self.skipTest("test is only meaningful on 32-bit builds")
1160 dumped = b'\x80\x03X\x01\x00\x00\x00ar\xff\xff\xff\xff.'
1161 self.assertRaises(ValueError, self.loads, dumped)
1162
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001163
1164class BigmemPickleTests(unittest.TestCase):
1165
1166 # Binary protocols can serialize longs of up to 2GB-1
1167
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001168 @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001169 def test_huge_long_32b(self, size):
1170 data = 1 << (8 * size)
1171 try:
1172 for proto in protocols:
1173 if proto < 2:
1174 continue
1175 with self.assertRaises((ValueError, OverflowError)):
1176 self.dumps(data, protocol=proto)
1177 finally:
1178 data = None
1179
1180 # Protocol 3 can serialize up to 4GB-1 as a bytes object
1181 # (older protocols don't have a dedicated opcode for bytes and are
1182 # too inefficient)
1183
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001184 @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001185 def test_huge_bytes_32b(self, size):
1186 data = b"abcd" * (size // 4)
1187 try:
1188 for proto in protocols:
1189 if proto < 3:
1190 continue
1191 try:
1192 pickled = self.dumps(data, protocol=proto)
1193 self.assertTrue(b"abcd" in pickled[:15])
1194 self.assertTrue(b"abcd" in pickled[-15:])
1195 finally:
1196 pickled = None
1197 finally:
1198 data = None
1199
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001200 @bigmemtest(size=_4G, memuse=1 + 1, dry_run=False)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001201 def test_huge_bytes_64b(self, size):
1202 data = b"a" * size
1203 try:
1204 for proto in protocols:
1205 if proto < 3:
1206 continue
1207 with self.assertRaises((ValueError, OverflowError)):
1208 self.dumps(data, protocol=proto)
1209 finally:
1210 data = None
1211
1212 # All protocols use 1-byte per printable ASCII character; we add another
1213 # byte because the encoded form has to be copied into the internal buffer.
1214
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001215 @bigmemtest(size=_2G, memuse=2 + character_size, dry_run=False)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001216 def test_huge_str_32b(self, size):
1217 data = "abcd" * (size // 4)
1218 try:
1219 for proto in protocols:
1220 try:
1221 pickled = self.dumps(data, protocol=proto)
1222 self.assertTrue(b"abcd" in pickled[:15])
1223 self.assertTrue(b"abcd" in pickled[-15:])
1224 finally:
1225 pickled = None
1226 finally:
1227 data = None
1228
Antoine Pitroue897e952011-08-30 23:39:34 +02001229 # BINUNICODE (protocols 1, 2 and 3) cannot carry more than
1230 # 2**32 - 1 bytes of utf-8 encoded unicode.
1231
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001232 @bigmemtest(size=_4G, memuse=1 + character_size, dry_run=False)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001233 def test_huge_str_64b(self, size):
1234 data = "a" * size
1235 try:
1236 for proto in protocols:
Antoine Pitroue897e952011-08-30 23:39:34 +02001237 if proto == 0:
1238 continue
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001239 with self.assertRaises((ValueError, OverflowError)):
1240 self.dumps(data, protocol=proto)
1241 finally:
1242 data = None
1243
1244
Guido van Rossum2a30b212003-02-18 22:41:24 +00001245# Test classes for reduce_ex
1246
1247class REX_one(object):
1248 _reduce_called = 0
1249 def __reduce__(self):
1250 self._reduce_called = 1
1251 return REX_one, ()
1252 # No __reduce_ex__ here, but inheriting it from object
1253
1254class REX_two(object):
1255 _proto = None
1256 def __reduce_ex__(self, proto):
1257 self._proto = proto
1258 return REX_two, ()
1259 # No __reduce__ here, but inheriting it from object
1260
1261class REX_three(object):
1262 _proto = None
1263 def __reduce_ex__(self, proto):
1264 self._proto = proto
1265 return REX_two, ()
1266 def __reduce__(self):
Collin Winter3add4d72007-08-29 23:37:32 +00001267 raise TestFailed("This __reduce__ shouldn't be called")
Guido van Rossum2a30b212003-02-18 22:41:24 +00001268
Guido van Rossumd8faa362007-04-27 19:54:29 +00001269class REX_four(object):
1270 _proto = None
1271 def __reduce_ex__(self, proto):
1272 self._proto = proto
1273 return object.__reduce_ex__(self, proto)
1274 # Calling base class method should succeed
1275
1276class REX_five(object):
1277 _reduce_called = 0
1278 def __reduce__(self):
1279 self._reduce_called = 1
1280 return object.__reduce__(self)
1281 # This one used to fail with infinite recursion
1282
Guido van Rossum2a30b212003-02-18 22:41:24 +00001283# Test classes for newobj
Tim Peters080c88b2003-02-15 03:01:11 +00001284
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001285class MyInt(int):
1286 sample = 1
1287
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001288class MyFloat(float):
1289 sample = 1.0
1290
1291class MyComplex(complex):
1292 sample = 1.0 + 0.0j
1293
1294class MyStr(str):
1295 sample = "hello"
1296
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001297class MyUnicode(str):
1298 sample = "hello \u1234"
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001299
Guido van Rossum533dbcf2003-01-28 17:55:05 +00001300class MyTuple(tuple):
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001301 sample = (1, 2, 3)
Guido van Rossum533dbcf2003-01-28 17:55:05 +00001302
1303class MyList(list):
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001304 sample = [1, 2, 3]
1305
1306class MyDict(dict):
1307 sample = {"a": 1, "b": 2}
1308
Mark Dickinson5c2db372009-12-05 20:28:34 +00001309myclasses = [MyInt, MyFloat,
Guido van Rossum206b9a72003-03-02 13:53:18 +00001310 MyComplex,
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001311 MyStr, MyUnicode,
1312 MyTuple, MyList, MyDict]
1313
Guido van Rossum533dbcf2003-01-28 17:55:05 +00001314
Guido van Rossumc8d6ef52003-01-28 22:02:31 +00001315class SlotList(MyList):
1316 __slots__ = ["foo"]
1317
Tim Peterse9ef2032003-02-13 18:42:00 +00001318class SimpleNewObj(object):
1319 def __init__(self, a, b, c):
1320 # raise an error, to make sure this isn't called
1321 raise TypeError("SimpleNewObj.__init__() didn't expect to get called")
1322
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00001323class BadGetattr:
1324 def __getattr__(self, key):
1325 self.foo
1326
Collin Winter771d8342009-04-16 03:18:06 +00001327
Jeremy Hylton66426532001-10-15 21:38:56 +00001328class AbstractPickleModuleTests(unittest.TestCase):
1329
1330 def test_dump_closed_file(self):
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001331 import os
Walter Dörwald11b41f62007-06-20 12:46:31 +00001332 f = open(TESTFN, "wb")
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001333 try:
1334 f.close()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001335 self.assertRaises(ValueError, pickle.dump, 123, f)
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001336 finally:
1337 os.remove(TESTFN)
Jeremy Hylton66426532001-10-15 21:38:56 +00001338
1339 def test_load_closed_file(self):
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001340 import os
Walter Dörwald11b41f62007-06-20 12:46:31 +00001341 f = open(TESTFN, "wb")
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001342 try:
1343 f.close()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001344 self.assertRaises(ValueError, pickle.dump, 123, f)
Guido van Rossum3b0a3292002-08-09 16:38:32 +00001345 finally:
1346 os.remove(TESTFN)
Jeremy Hylton4c8be852002-11-13 22:10:47 +00001347
Collin Winter771d8342009-04-16 03:18:06 +00001348 def test_load_from_and_dump_to_file(self):
1349 stream = io.BytesIO()
1350 data = [123, {}, 124]
1351 pickle.dump(data, stream)
1352 stream.seek(0)
1353 unpickled = pickle.load(stream)
1354 self.assertEqual(unpickled, data)
1355
Tim Petersc0c93702003-02-13 19:30:57 +00001356 def test_highest_protocol(self):
1357 # Of course this needs to be changed when HIGHEST_PROTOCOL changes.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001358 self.assertEqual(pickle.HIGHEST_PROTOCOL, 3)
Tim Petersc0c93702003-02-13 19:30:57 +00001359
Martin v. Löwis544f1192004-07-27 05:22:33 +00001360 def test_callapi(self):
Collin Winter771d8342009-04-16 03:18:06 +00001361 f = io.BytesIO()
Martin v. Löwis544f1192004-07-27 05:22:33 +00001362 # With and without keyword arguments
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001363 pickle.dump(123, f, -1)
1364 pickle.dump(123, file=f, protocol=-1)
1365 pickle.dumps(123, -1)
1366 pickle.dumps(123, protocol=-1)
1367 pickle.Pickler(f, -1)
1368 pickle.Pickler(f, protocol=-1)
Tim Petersc0c93702003-02-13 19:30:57 +00001369
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00001370 def test_bad_init(self):
1371 # Test issue3664 (pickle can segfault from a badly initialized Pickler).
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00001372 # Override initialization without calling __init__() of the superclass.
1373 class BadPickler(pickle.Pickler):
1374 def __init__(self): pass
1375
1376 class BadUnpickler(pickle.Unpickler):
1377 def __init__(self): pass
1378
1379 self.assertRaises(pickle.PicklingError, BadPickler().dump, 0)
1380 self.assertRaises(pickle.UnpicklingError, BadUnpickler().load)
1381
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001382 def test_bad_input(self):
1383 # Test issue4298
1384 s = bytes([0x58, 0, 0, 0, 0x54])
1385 self.assertRaises(EOFError, pickle.loads, s)
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00001386 # Test issue7455
1387 s = b'0'
1388 self.assertRaises(pickle.UnpicklingError, pickle.loads, s)
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001389
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00001390
Jeremy Hylton4c8be852002-11-13 22:10:47 +00001391class AbstractPersistentPicklerTests(unittest.TestCase):
1392
1393 # This class defines persistent_id() and persistent_load()
1394 # functions that should be used by the pickler. All even integers
1395 # are pickled using persistent ids.
1396
1397 def persistent_id(self, object):
1398 if isinstance(object, int) and object % 2 == 0:
1399 self.id_count += 1
1400 return str(object)
1401 else:
1402 return None
1403
1404 def persistent_load(self, oid):
1405 self.load_count += 1
1406 object = int(oid)
1407 assert object % 2 == 0
1408 return object
1409
1410 def test_persistence(self):
1411 self.id_count = 0
1412 self.load_count = 0
Guido van Rossum805365e2007-05-07 22:24:25 +00001413 L = list(range(10))
Jeremy Hylton4c8be852002-11-13 22:10:47 +00001414 self.assertEqual(self.loads(self.dumps(L)), L)
1415 self.assertEqual(self.id_count, 5)
1416 self.assertEqual(self.load_count, 5)
1417
1418 def test_bin_persistence(self):
1419 self.id_count = 0
1420 self.load_count = 0
Guido van Rossum805365e2007-05-07 22:24:25 +00001421 L = list(range(10))
Jeremy Hylton4c8be852002-11-13 22:10:47 +00001422 self.assertEqual(self.loads(self.dumps(L, 1)), L)
1423 self.assertEqual(self.id_count, 5)
1424 self.assertEqual(self.load_count, 5)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001425
Collin Winter771d8342009-04-16 03:18:06 +00001426
1427class AbstractPicklerUnpicklerObjectTests(unittest.TestCase):
1428
1429 pickler_class = None
1430 unpickler_class = None
1431
1432 def setUp(self):
1433 assert self.pickler_class
1434 assert self.unpickler_class
1435
1436 def test_clear_pickler_memo(self):
1437 # To test whether clear_memo() has any effect, we pickle an object,
1438 # then pickle it again without clearing the memo; the two serialized
1439 # forms should be different. If we clear_memo() and then pickle the
1440 # object again, the third serialized form should be identical to the
1441 # first one we obtained.
1442 data = ["abcdefg", "abcdefg", 44]
1443 f = io.BytesIO()
1444 pickler = self.pickler_class(f)
1445
1446 pickler.dump(data)
1447 first_pickled = f.getvalue()
1448
1449 # Reset StringIO object.
1450 f.seek(0)
1451 f.truncate()
1452
1453 pickler.dump(data)
1454 second_pickled = f.getvalue()
1455
1456 # Reset the Pickler and StringIO objects.
1457 pickler.clear_memo()
1458 f.seek(0)
1459 f.truncate()
1460
1461 pickler.dump(data)
1462 third_pickled = f.getvalue()
1463
1464 self.assertNotEqual(first_pickled, second_pickled)
1465 self.assertEqual(first_pickled, third_pickled)
1466
1467 def test_priming_pickler_memo(self):
1468 # Verify that we can set the Pickler's memo attribute.
1469 data = ["abcdefg", "abcdefg", 44]
1470 f = io.BytesIO()
1471 pickler = self.pickler_class(f)
1472
1473 pickler.dump(data)
1474 first_pickled = f.getvalue()
1475
1476 f = io.BytesIO()
1477 primed = self.pickler_class(f)
1478 primed.memo = pickler.memo
1479
1480 primed.dump(data)
1481 primed_pickled = f.getvalue()
1482
1483 self.assertNotEqual(first_pickled, primed_pickled)
1484
1485 def test_priming_unpickler_memo(self):
1486 # Verify that we can set the Unpickler's memo attribute.
1487 data = ["abcdefg", "abcdefg", 44]
1488 f = io.BytesIO()
1489 pickler = self.pickler_class(f)
1490
1491 pickler.dump(data)
1492 first_pickled = f.getvalue()
1493
1494 f = io.BytesIO()
1495 primed = self.pickler_class(f)
1496 primed.memo = pickler.memo
1497
1498 primed.dump(data)
1499 primed_pickled = f.getvalue()
1500
1501 unpickler = self.unpickler_class(io.BytesIO(first_pickled))
1502 unpickled_data1 = unpickler.load()
1503
1504 self.assertEqual(unpickled_data1, data)
1505
1506 primed = self.unpickler_class(io.BytesIO(primed_pickled))
1507 primed.memo = unpickler.memo
1508 unpickled_data2 = primed.load()
1509
1510 primed.memo.clear()
1511
1512 self.assertEqual(unpickled_data2, data)
1513 self.assertTrue(unpickled_data2 is unpickled_data1)
1514
1515 def test_reusing_unpickler_objects(self):
1516 data1 = ["abcdefg", "abcdefg", 44]
1517 f = io.BytesIO()
1518 pickler = self.pickler_class(f)
1519 pickler.dump(data1)
1520 pickled1 = f.getvalue()
1521
1522 data2 = ["abcdefg", 44, 44]
1523 f = io.BytesIO()
1524 pickler = self.pickler_class(f)
1525 pickler.dump(data2)
1526 pickled2 = f.getvalue()
1527
1528 f = io.BytesIO()
1529 f.write(pickled1)
1530 f.seek(0)
1531 unpickler = self.unpickler_class(f)
1532 self.assertEqual(unpickler.load(), data1)
1533
1534 f.seek(0)
1535 f.truncate()
1536 f.write(pickled2)
1537 f.seek(0)
1538 self.assertEqual(unpickler.load(), data2)
1539
Antoine Pitrou04248a82010-10-12 20:51:21 +00001540 def _check_multiple_unpicklings(self, ioclass):
1541 for proto in protocols:
1542 data1 = [(x, str(x)) for x in range(2000)] + [b"abcde", len]
1543 f = ioclass()
1544 pickler = self.pickler_class(f, protocol=proto)
1545 pickler.dump(data1)
1546 pickled = f.getvalue()
1547
1548 N = 5
1549 f = ioclass(pickled * N)
1550 unpickler = self.unpickler_class(f)
1551 for i in range(N):
1552 if f.seekable():
1553 pos = f.tell()
1554 self.assertEqual(unpickler.load(), data1)
1555 if f.seekable():
1556 self.assertEqual(f.tell(), pos + len(pickled))
1557 self.assertRaises(EOFError, unpickler.load)
1558
1559 def test_multiple_unpicklings_seekable(self):
1560 self._check_multiple_unpicklings(io.BytesIO)
1561
1562 def test_multiple_unpicklings_unseekable(self):
1563 self._check_multiple_unpicklings(UnseekableIO)
1564
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001565 def test_unpickling_buffering_readline(self):
1566 # Issue #12687: the unpickler's buffering logic could fail with
1567 # text mode opcodes.
1568 data = list(range(10))
1569 for proto in protocols:
1570 for buf_size in range(1, 11):
1571 f = io.BufferedRandom(io.BytesIO(), buffer_size=buf_size)
1572 pickler = self.pickler_class(f, protocol=proto)
1573 pickler.dump(data)
1574 f.seek(0)
1575 unpickler = self.unpickler_class(f)
1576 self.assertEqual(unpickler.load(), data)
1577
Collin Winter771d8342009-04-16 03:18:06 +00001578
Guido van Rossum98297ee2007-11-06 21:34:58 +00001579if __name__ == "__main__":
1580 # Print some stuff that can be used to rewrite DATA{0,1,2}
1581 from pickletools import dis
1582 x = create_data()
1583 for i in range(3):
1584 p = pickle.dumps(x, i)
1585 print("DATA{0} = (".format(i))
1586 for j in range(0, len(p), 20):
1587 b = bytes(p[j:j+20])
1588 print(" {0!r}".format(b))
1589 print(")")
1590 print()
1591 print("# Disassembly of DATA{0}".format(i))
1592 print("DATA{0}_DIS = \"\"\"\\".format(i))
1593 dis(p)
1594 print("\"\"\"")
1595 print()