blob: 23c7bd261e85cadf45203e1cf993efb774539847 [file] [log] [blame]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001from _compat_pickle import (IMPORT_MAPPING, REVERSE_IMPORT_MAPPING,
2 NAME_MAPPING, REVERSE_NAME_MAPPING)
3import builtins
Jeremy Hyltonbe467e52000-09-15 15:14:51 +00004import pickle
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005import io
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01006import collections
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007import struct
8import sys
Serhiy Storchaka986375e2017-11-30 22:48:31 +02009import weakref
Tim Peters47a6b132003-01-28 22:34:11 +000010
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +020011import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +000012from test import support
Hai Shi883bc632020-07-06 17:12:49 +080013from test.support import import_helper
Jeremy Hylton66426532001-10-15 21:38:56 +000014
Pierre Glaser289f1f82019-05-08 23:08:25 +020015from test.pickletester import AbstractHookTests
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030016from test.pickletester import AbstractUnpickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000017from test.pickletester import AbstractPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000018from test.pickletester import AbstractPickleModuleTests
19from test.pickletester import AbstractPersistentPicklerTests
Serhiy Storchakadec25af2016-07-17 11:24:17 +030020from test.pickletester import AbstractIdentityPersistentPicklerTests
Collin Winter771d8342009-04-16 03:18:06 +000021from test.pickletester import AbstractPicklerUnpicklerObjectTests
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010022from test.pickletester import AbstractDispatchTableTests
Pierre Glaser289f1f82019-05-08 23:08:25 +020023from test.pickletester import AbstractCustomPicklerClass
Antoine Pitrou82be19f2011-08-29 23:09:33 +020024from test.pickletester import BigmemPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000025
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000026try:
27 import _pickle
28 has_c_implementation = True
29except ImportError:
30 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000031
Guido van Rossum98297ee2007-11-06 21:34:58 +000032
Serhiy Storchaka65452562017-11-15 14:01:08 +020033class PyPickleTests(AbstractPickleModuleTests):
34 dump = staticmethod(pickle._dump)
35 dumps = staticmethod(pickle._dumps)
36 load = staticmethod(pickle._load)
37 loads = staticmethod(pickle._loads)
38 Pickler = pickle._Pickler
39 Unpickler = pickle._Unpickler
Guido van Rossum5d9113d2003-01-29 17:58:45 +000040
Tim Peterse0c446b2001-10-18 21:57:37 +000041
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030042class PyUnpicklerTests(AbstractUnpickleTests):
43
44 unpickler = pickle._Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +020045 bad_stack_errors = (IndexError,)
Serhiy Storchaka7279bef2015-11-29 13:12:10 +020046 truncated_errors = (pickle.UnpicklingError, EOFError,
47 AttributeError, ValueError,
48 struct.error, IndexError, ImportError)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030049
50 def loads(self, buf, **kwds):
51 f = io.BytesIO(buf)
52 u = self.unpickler(f, **kwds)
53 return u.load()
54
55
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000056class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000057
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000058 pickler = pickle._Pickler
59 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000060
Antoine Pitrou91f43802019-05-26 17:10:09 +020061 def dumps(self, arg, proto=None, **kwargs):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000062 f = io.BytesIO()
Antoine Pitrou91f43802019-05-26 17:10:09 +020063 p = self.pickler(f, proto, **kwargs)
Jeremy Hylton66426532001-10-15 21:38:56 +000064 p.dump(arg)
65 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000066 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000067
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000068 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000069 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000070 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000071 return u.load()
72
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000073
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030074class InMemoryPickleTests(AbstractPickleTests, AbstractUnpickleTests,
75 BigmemPickleTests):
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000076
Serhiy Storchakae9b30742015-11-23 15:17:43 +020077 bad_stack_errors = (pickle.UnpicklingError, IndexError)
Serhiy Storchaka7279bef2015-11-29 13:12:10 +020078 truncated_errors = (pickle.UnpicklingError, EOFError,
79 AttributeError, ValueError,
80 struct.error, IndexError, ImportError)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000081
Antoine Pitrou91f43802019-05-26 17:10:09 +020082 def dumps(self, arg, protocol=None, **kwargs):
83 return pickle.dumps(arg, protocol, **kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000084
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000085 def loads(self, buf, **kwds):
86 return pickle.loads(buf, **kwds)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000087
Serhiy Storchaka0a2da502018-01-11 13:03:20 +020088 test_framed_write_sizes_with_delayed_writer = None
89
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000090
Serhiy Storchakadec25af2016-07-17 11:24:17 +030091class PersistentPicklerUnpicklerMixin(object):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000092
Guido van Rossumf4169812008-03-17 22:56:06 +000093 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000094 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000095 def persistent_id(subself, obj):
96 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000097 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000098 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000099 p.dump(arg)
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300100 return f.getvalue()
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000101
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +0000102 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000103 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000104 def persistent_load(subself, obj):
105 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000106 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +0000107 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000108 return u.load()
109
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000110
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300111class PyPersPicklerTests(AbstractPersistentPicklerTests,
112 PersistentPicklerUnpicklerMixin):
113
114 pickler = pickle._Pickler
115 unpickler = pickle._Unpickler
116
117
118class PyIdPersPicklerTests(AbstractIdentityPersistentPicklerTests,
119 PersistentPicklerUnpicklerMixin):
120
121 pickler = pickle._Pickler
122 unpickler = pickle._Unpickler
123
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200124 @support.cpython_only
125 def test_pickler_reference_cycle(self):
126 def check(Pickler):
127 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
128 f = io.BytesIO()
129 pickler = Pickler(f, proto)
130 pickler.dump('abc')
131 self.assertEqual(self.loads(f.getvalue()), 'abc')
132 pickler = Pickler(io.BytesIO())
133 self.assertEqual(pickler.persistent_id('def'), 'def')
134 r = weakref.ref(pickler)
135 del pickler
136 self.assertIsNone(r())
137
138 class PersPickler(self.pickler):
139 def persistent_id(subself, obj):
140 return obj
141 check(PersPickler)
142
143 class PersPickler(self.pickler):
144 @classmethod
145 def persistent_id(cls, obj):
146 return obj
147 check(PersPickler)
148
149 class PersPickler(self.pickler):
150 @staticmethod
151 def persistent_id(obj):
152 return obj
153 check(PersPickler)
154
155 @support.cpython_only
156 def test_unpickler_reference_cycle(self):
157 def check(Unpickler):
158 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
159 unpickler = Unpickler(io.BytesIO(self.dumps('abc', proto)))
160 self.assertEqual(unpickler.load(), 'abc')
161 unpickler = Unpickler(io.BytesIO())
162 self.assertEqual(unpickler.persistent_load('def'), 'def')
163 r = weakref.ref(unpickler)
164 del unpickler
165 self.assertIsNone(r())
166
167 class PersUnpickler(self.unpickler):
168 def persistent_load(subself, pid):
169 return pid
170 check(PersUnpickler)
171
172 class PersUnpickler(self.unpickler):
173 @classmethod
174 def persistent_load(cls, pid):
175 return pid
176 check(PersUnpickler)
177
178 class PersUnpickler(self.unpickler):
179 @staticmethod
180 def persistent_load(pid):
181 return pid
182 check(PersUnpickler)
183
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300184
Collin Winter771d8342009-04-16 03:18:06 +0000185class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
186
187 pickler_class = pickle._Pickler
188 unpickler_class = pickle._Unpickler
189
190
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100191class PyDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800192
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100193 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800194
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100195 def get_dispatch_table(self):
196 return pickle.dispatch_table.copy()
197
198
199class PyChainDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800200
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100201 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800202
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100203 def get_dispatch_table(self):
204 return collections.ChainMap({}, pickle.dispatch_table)
205
206
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200207class PyPicklerHookTests(AbstractHookTests):
208 class CustomPyPicklerClass(pickle._Pickler,
209 AbstractCustomPicklerClass):
210 pass
211 pickler_class = CustomPyPicklerClass
212
213
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000214if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200215 class CPickleTests(AbstractPickleModuleTests):
216 from _pickle import dump, dumps, load, loads, Pickler, Unpickler
217
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300218 class CUnpicklerTests(PyUnpicklerTests):
219 unpickler = _pickle.Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +0200220 bad_stack_errors = (pickle.UnpicklingError,)
Serhiy Storchaka90493ab2016-09-06 23:55:11 +0300221 truncated_errors = (pickle.UnpicklingError,)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300222
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000223 class CPicklerTests(PyPicklerTests):
224 pickler = _pickle.Pickler
225 unpickler = _pickle.Unpickler
226
227 class CPersPicklerTests(PyPersPicklerTests):
228 pickler = _pickle.Pickler
229 unpickler = _pickle.Unpickler
230
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300231 class CIdPersPicklerTests(PyIdPersPicklerTests):
232 pickler = _pickle.Pickler
233 unpickler = _pickle.Unpickler
234
Collin Winter771d8342009-04-16 03:18:06 +0000235 class CDumpPickle_LoadPickle(PyPicklerTests):
236 pickler = _pickle.Pickler
237 unpickler = pickle._Unpickler
238
239 class DumpPickle_CLoadPickle(PyPicklerTests):
240 pickler = pickle._Pickler
241 unpickler = _pickle.Unpickler
242
243 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
244 pickler_class = _pickle.Pickler
245 unpickler_class = _pickle.Unpickler
246
Christian Heimesa24b4d22013-07-01 15:17:45 +0200247 def test_issue18339(self):
248 unpickler = self.unpickler_class(io.BytesIO())
Christian Heimes21782482013-07-01 23:00:13 +0200249 with self.assertRaises(TypeError):
250 unpickler.memo = object
Christian Heimesa24b4d22013-07-01 15:17:45 +0200251 # used to cause a segfault
Christian Heimes21782482013-07-01 23:00:13 +0200252 with self.assertRaises(ValueError):
253 unpickler.memo = {-1: None}
Christian Heimesa24b4d22013-07-01 15:17:45 +0200254 unpickler.memo = {1: None}
255
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100256 class CDispatchTableTests(AbstractDispatchTableTests):
257 pickler_class = pickle.Pickler
258 def get_dispatch_table(self):
259 return pickle.dispatch_table.copy()
260
261 class CChainDispatchTableTests(AbstractDispatchTableTests):
262 pickler_class = pickle.Pickler
263 def get_dispatch_table(self):
264 return collections.ChainMap({}, pickle.dispatch_table)
265
Pierre Glaser289f1f82019-05-08 23:08:25 +0200266 class CPicklerHookTests(AbstractHookTests):
267 class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass):
268 pass
269 pickler_class = CustomCPicklerClass
270
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200271 @support.cpython_only
272 class SizeofTests(unittest.TestCase):
273 check_sizeof = support.check_sizeof
274
275 def test_pickler(self):
Antoine Pitrou91f43802019-05-26 17:10:09 +0200276 basesize = support.calcobjsize('7P2n3i2n3i2P')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200277 p = _pickle.Pickler(io.BytesIO())
278 self.assertEqual(object.__sizeof__(p), basesize)
279 MT_size = struct.calcsize('3nP0n')
280 ME_size = struct.calcsize('Pn0P')
281 check = self.check_sizeof
282 check(p, basesize +
283 MT_size + 8 * ME_size + # Minimal memo table size.
284 sys.getsizeof(b'x'*4096)) # Minimal write buffer size.
285 for i in range(6):
286 p.dump(chr(i))
287 check(p, basesize +
288 MT_size + 32 * ME_size + # Size of memo table required to
289 # save references to 6 objects.
290 0) # Write buffer is cleared after every dump().
291
292 def test_unpickler(self):
Antoine Pitrou91f43802019-05-26 17:10:09 +0200293 basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n8P2n2i')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200294 unpickler = _pickle.Unpickler
295 P = struct.calcsize('P') # Size of memo table entry.
296 n = struct.calcsize('n') # Size of mark table entry.
297 check = self.check_sizeof
298 for encoding in 'ASCII', 'UTF-16', 'latin-1':
299 for errors in 'strict', 'replace':
300 u = unpickler(io.BytesIO(),
301 encoding=encoding, errors=errors)
302 self.assertEqual(object.__sizeof__(u), basesize)
303 check(u, basesize +
304 32 * P + # Minimal memo table size.
305 len(encoding) + 1 + len(errors) + 1)
306
307 stdsize = basesize + len('ASCII') + 1 + len('strict') + 1
308 def check_unpickler(data, memo_size, marks_size):
309 dump = pickle.dumps(data)
310 u = unpickler(io.BytesIO(dump),
311 encoding='ASCII', errors='strict')
312 u.load()
313 check(u, stdsize + memo_size * P + marks_size * n)
314
315 check_unpickler(0, 32, 0)
316 # 20 is minimal non-empty mark stack size.
317 check_unpickler([0] * 100, 32, 20)
318 # 128 is memo table size required to save references to 100 objects.
319 check_unpickler([chr(i) for i in range(100)], 128, 20)
320 def recurse(deep):
321 data = 0
322 for i in range(deep):
323 data = [data, data]
324 return data
325 check_unpickler(recurse(0), 32, 0)
326 check_unpickler(recurse(1), 32, 20)
Sergey Fedoseev86b89912018-08-25 12:54:40 +0500327 check_unpickler(recurse(20), 32, 20)
328 check_unpickler(recurse(50), 64, 60)
329 check_unpickler(recurse(100), 128, 140)
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200330
331 u = unpickler(io.BytesIO(pickle.dumps('a', 0)),
332 encoding='ASCII', errors='strict')
333 u.load()
334 check(u, stdsize + 32 * P + 2 + 1)
335
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000336
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300337ALT_IMPORT_MAPPING = {
338 ('_elementtree', 'xml.etree.ElementTree'),
339 ('cPickle', 'pickle'),
Serhiy Storchaka5c1d9d22016-01-18 22:33:44 +0200340 ('StringIO', 'io'),
341 ('cStringIO', 'io'),
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300342}
343
344ALT_NAME_MAPPING = {
345 ('__builtin__', 'basestring', 'builtins', 'str'),
346 ('exceptions', 'StandardError', 'builtins', 'Exception'),
347 ('UserDict', 'UserDict', 'collections', 'UserDict'),
348 ('socket', '_socketobject', 'socket', 'SocketType'),
349}
350
351def mapping(module, name):
352 if (module, name) in NAME_MAPPING:
353 module, name = NAME_MAPPING[(module, name)]
354 elif module in IMPORT_MAPPING:
355 module = IMPORT_MAPPING[module]
356 return module, name
357
358def reverse_mapping(module, name):
359 if (module, name) in REVERSE_NAME_MAPPING:
360 module, name = REVERSE_NAME_MAPPING[(module, name)]
361 elif module in REVERSE_IMPORT_MAPPING:
362 module = REVERSE_IMPORT_MAPPING[module]
363 return module, name
364
365def getmodule(module):
366 try:
367 return sys.modules[module]
368 except KeyError:
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300369 try:
370 __import__(module)
371 except AttributeError as exc:
372 if support.verbose:
373 print("Can't import module %r: %s" % (module, exc))
374 raise ImportError
375 except ImportError as exc:
376 if support.verbose:
377 print(exc)
378 raise
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300379 return sys.modules[module]
380
381def getattribute(module, name):
382 obj = getmodule(module)
383 for n in name.split('.'):
384 obj = getattr(obj, n)
385 return obj
386
387def get_exceptions(mod):
388 for name in dir(mod):
389 attr = getattr(mod, name)
390 if isinstance(attr, type) and issubclass(attr, BaseException):
391 yield name, attr
392
393class CompatPickleTests(unittest.TestCase):
394 def test_import(self):
395 modules = set(IMPORT_MAPPING.values())
396 modules |= set(REVERSE_IMPORT_MAPPING)
397 modules |= {module for module, name in REVERSE_NAME_MAPPING}
398 modules |= {module for module, name in NAME_MAPPING.values()}
399 for module in modules:
400 try:
401 getmodule(module)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300402 except ImportError:
403 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300404
405 def test_import_mapping(self):
406 for module3, module2 in REVERSE_IMPORT_MAPPING.items():
407 with self.subTest((module3, module2)):
408 try:
409 getmodule(module3)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300410 except ImportError:
411 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300412 if module3[:1] != '_':
413 self.assertIn(module2, IMPORT_MAPPING)
414 self.assertEqual(IMPORT_MAPPING[module2], module3)
415
416 def test_name_mapping(self):
417 for (module3, name3), (module2, name2) in REVERSE_NAME_MAPPING.items():
418 with self.subTest(((module3, name3), (module2, name2))):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300419 if (module2, name2) == ('exceptions', 'OSError'):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300420 attr = getattribute(module3, name3)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300421 self.assertTrue(issubclass(attr, OSError))
Eric Snowc9432652016-09-07 15:42:32 -0700422 elif (module2, name2) == ('exceptions', 'ImportError'):
423 attr = getattribute(module3, name3)
424 self.assertTrue(issubclass(attr, ImportError))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300425 else:
426 module, name = mapping(module2, name2)
427 if module3[:1] != '_':
428 self.assertEqual((module, name), (module3, name3))
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300429 try:
430 attr = getattribute(module3, name3)
431 except ImportError:
432 pass
433 else:
434 self.assertEqual(getattribute(module, name), attr)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300435
436 def test_reverse_import_mapping(self):
437 for module2, module3 in IMPORT_MAPPING.items():
438 with self.subTest((module2, module3)):
439 try:
440 getmodule(module3)
441 except ImportError as exc:
442 if support.verbose:
443 print(exc)
444 if ((module2, module3) not in ALT_IMPORT_MAPPING and
445 REVERSE_IMPORT_MAPPING.get(module3, None) != module2):
446 for (m3, n3), (m2, n2) in REVERSE_NAME_MAPPING.items():
447 if (module3, module2) == (m3, m2):
448 break
449 else:
450 self.fail('No reverse mapping from %r to %r' %
451 (module3, module2))
452 module = REVERSE_IMPORT_MAPPING.get(module3, module3)
453 module = IMPORT_MAPPING.get(module, module)
454 self.assertEqual(module, module3)
455
456 def test_reverse_name_mapping(self):
457 for (module2, name2), (module3, name3) in NAME_MAPPING.items():
458 with self.subTest(((module2, name2), (module3, name3))):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300459 try:
460 attr = getattribute(module3, name3)
461 except ImportError:
462 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300463 module, name = reverse_mapping(module3, name3)
464 if (module2, name2, module3, name3) not in ALT_NAME_MAPPING:
465 self.assertEqual((module, name), (module2, name2))
466 module, name = mapping(module, name)
467 self.assertEqual((module, name), (module3, name3))
468
469 def test_exceptions(self):
470 self.assertEqual(mapping('exceptions', 'StandardError'),
471 ('builtins', 'Exception'))
472 self.assertEqual(mapping('exceptions', 'Exception'),
473 ('builtins', 'Exception'))
474 self.assertEqual(reverse_mapping('builtins', 'Exception'),
475 ('exceptions', 'Exception'))
476 self.assertEqual(mapping('exceptions', 'OSError'),
477 ('builtins', 'OSError'))
478 self.assertEqual(reverse_mapping('builtins', 'OSError'),
479 ('exceptions', 'OSError'))
480
481 for name, exc in get_exceptions(builtins):
482 with self.subTest(name):
Yury Selivanov75445082015-05-11 22:57:16 -0400483 if exc in (BlockingIOError,
484 ResourceWarning,
Yury Selivanovf488fb42015-07-03 01:04:23 -0400485 StopAsyncIteration,
Inada Naoki48274832021-03-29 12:28:14 +0900486 RecursionError,
487 EncodingWarning):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300488 continue
489 if exc is not OSError and issubclass(exc, OSError):
490 self.assertEqual(reverse_mapping('builtins', name),
491 ('exceptions', 'OSError'))
Eric Snowc9432652016-09-07 15:42:32 -0700492 elif exc is not ImportError and issubclass(exc, ImportError):
493 self.assertEqual(reverse_mapping('builtins', name),
494 ('exceptions', 'ImportError'))
495 self.assertEqual(mapping('exceptions', name),
496 ('exceptions', name))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300497 else:
498 self.assertEqual(reverse_mapping('builtins', name),
499 ('exceptions', name))
500 self.assertEqual(mapping('exceptions', name),
501 ('builtins', name))
502
Serhiy Storchaka7b2cfc42015-10-10 20:10:07 +0300503 def test_multiprocessing_exceptions(self):
Hai Shi883bc632020-07-06 17:12:49 +0800504 module = import_helper.import_module('multiprocessing.context')
Serhiy Storchaka7b2cfc42015-10-10 20:10:07 +0300505 for name, exc in get_exceptions(module):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300506 with self.subTest(name):
507 self.assertEqual(reverse_mapping('multiprocessing.context', name),
508 ('multiprocessing', name))
509 self.assertEqual(mapping('multiprocessing', name),
510 ('multiprocessing.context', name))
511
512
Fred Drake694ed092001-12-19 16:42:15 +0000513def test_main():
Serhiy Storchaka65452562017-11-15 14:01:08 +0200514 tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300515 PyPersPicklerTests, PyIdPersPicklerTests,
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300516 PyDispatchTableTests, PyChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200517 CompatPickleTests, PyPicklerHookTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000518 if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200519 tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300520 CPersPicklerTests, CIdPersPicklerTests,
Collin Winter771d8342009-04-16 03:18:06 +0000521 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
522 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000523 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100524 CDispatchTableTests, CChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200525 CPicklerHookTests,
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200526 InMemoryPickleTests, SizeofTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000527 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000528 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000529
Jeremy Hylton66426532001-10-15 21:38:56 +0000530if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000531 test_main()