blob: 2307b133dbd0d56485cfefab57878e02ac8cc1b4 [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
Jeremy Hylton66426532001-10-15 21:38:56 +000013
Pierre Glaser289f1f82019-05-08 23:08:25 +020014from test.pickletester import AbstractHookTests
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030015from test.pickletester import AbstractUnpickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000016from test.pickletester import AbstractPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000017from test.pickletester import AbstractPickleModuleTests
18from test.pickletester import AbstractPersistentPicklerTests
Serhiy Storchakadec25af2016-07-17 11:24:17 +030019from test.pickletester import AbstractIdentityPersistentPicklerTests
Collin Winter771d8342009-04-16 03:18:06 +000020from test.pickletester import AbstractPicklerUnpicklerObjectTests
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010021from test.pickletester import AbstractDispatchTableTests
Pierre Glaser289f1f82019-05-08 23:08:25 +020022from test.pickletester import AbstractCustomPicklerClass
Antoine Pitrou82be19f2011-08-29 23:09:33 +020023from test.pickletester import BigmemPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000024
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000025try:
26 import _pickle
27 has_c_implementation = True
28except ImportError:
29 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000030
Guido van Rossum98297ee2007-11-06 21:34:58 +000031
Serhiy Storchaka65452562017-11-15 14:01:08 +020032class PyPickleTests(AbstractPickleModuleTests):
33 dump = staticmethod(pickle._dump)
34 dumps = staticmethod(pickle._dumps)
35 load = staticmethod(pickle._load)
36 loads = staticmethod(pickle._loads)
37 Pickler = pickle._Pickler
38 Unpickler = pickle._Unpickler
Guido van Rossum5d9113d2003-01-29 17:58:45 +000039
Tim Peterse0c446b2001-10-18 21:57:37 +000040
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030041class PyUnpicklerTests(AbstractUnpickleTests):
42
43 unpickler = pickle._Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +020044 bad_stack_errors = (IndexError,)
Serhiy Storchaka7279bef2015-11-29 13:12:10 +020045 truncated_errors = (pickle.UnpicklingError, EOFError,
46 AttributeError, ValueError,
47 struct.error, IndexError, ImportError)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030048
49 def loads(self, buf, **kwds):
50 f = io.BytesIO(buf)
51 u = self.unpickler(f, **kwds)
52 return u.load()
53
54
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000055class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000056
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000057 pickler = pickle._Pickler
58 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000059
Antoine Pitrou91f43802019-05-26 17:10:09 +020060 def dumps(self, arg, proto=None, **kwargs):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000061 f = io.BytesIO()
Antoine Pitrou91f43802019-05-26 17:10:09 +020062 p = self.pickler(f, proto, **kwargs)
Jeremy Hylton66426532001-10-15 21:38:56 +000063 p.dump(arg)
64 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000065 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000066
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000067 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000068 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000069 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000070 return u.load()
71
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000072
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030073class InMemoryPickleTests(AbstractPickleTests, AbstractUnpickleTests,
74 BigmemPickleTests):
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000075
Serhiy Storchakae9b30742015-11-23 15:17:43 +020076 bad_stack_errors = (pickle.UnpicklingError, IndexError)
Serhiy Storchaka7279bef2015-11-29 13:12:10 +020077 truncated_errors = (pickle.UnpicklingError, EOFError,
78 AttributeError, ValueError,
79 struct.error, IndexError, ImportError)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000080
Antoine Pitrou91f43802019-05-26 17:10:09 +020081 def dumps(self, arg, protocol=None, **kwargs):
82 return pickle.dumps(arg, protocol, **kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000083
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000084 def loads(self, buf, **kwds):
85 return pickle.loads(buf, **kwds)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000086
Serhiy Storchaka0a2da502018-01-11 13:03:20 +020087 test_framed_write_sizes_with_delayed_writer = None
88
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000089
Serhiy Storchakadec25af2016-07-17 11:24:17 +030090class PersistentPicklerUnpicklerMixin(object):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000091
Guido van Rossumf4169812008-03-17 22:56:06 +000092 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000093 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000094 def persistent_id(subself, obj):
95 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000096 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000097 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000098 p.dump(arg)
Serhiy Storchakadec25af2016-07-17 11:24:17 +030099 return f.getvalue()
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000100
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +0000101 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000102 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000103 def persistent_load(subself, obj):
104 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000105 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +0000106 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000107 return u.load()
108
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000109
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300110class PyPersPicklerTests(AbstractPersistentPicklerTests,
111 PersistentPicklerUnpicklerMixin):
112
113 pickler = pickle._Pickler
114 unpickler = pickle._Unpickler
115
116
117class PyIdPersPicklerTests(AbstractIdentityPersistentPicklerTests,
118 PersistentPicklerUnpicklerMixin):
119
120 pickler = pickle._Pickler
121 unpickler = pickle._Unpickler
122
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200123 @support.cpython_only
124 def test_pickler_reference_cycle(self):
125 def check(Pickler):
126 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
127 f = io.BytesIO()
128 pickler = Pickler(f, proto)
129 pickler.dump('abc')
130 self.assertEqual(self.loads(f.getvalue()), 'abc')
131 pickler = Pickler(io.BytesIO())
132 self.assertEqual(pickler.persistent_id('def'), 'def')
133 r = weakref.ref(pickler)
134 del pickler
135 self.assertIsNone(r())
136
137 class PersPickler(self.pickler):
138 def persistent_id(subself, obj):
139 return obj
140 check(PersPickler)
141
142 class PersPickler(self.pickler):
143 @classmethod
144 def persistent_id(cls, obj):
145 return obj
146 check(PersPickler)
147
148 class PersPickler(self.pickler):
149 @staticmethod
150 def persistent_id(obj):
151 return obj
152 check(PersPickler)
153
154 @support.cpython_only
155 def test_unpickler_reference_cycle(self):
156 def check(Unpickler):
157 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
158 unpickler = Unpickler(io.BytesIO(self.dumps('abc', proto)))
159 self.assertEqual(unpickler.load(), 'abc')
160 unpickler = Unpickler(io.BytesIO())
161 self.assertEqual(unpickler.persistent_load('def'), 'def')
162 r = weakref.ref(unpickler)
163 del unpickler
164 self.assertIsNone(r())
165
166 class PersUnpickler(self.unpickler):
167 def persistent_load(subself, pid):
168 return pid
169 check(PersUnpickler)
170
171 class PersUnpickler(self.unpickler):
172 @classmethod
173 def persistent_load(cls, pid):
174 return pid
175 check(PersUnpickler)
176
177 class PersUnpickler(self.unpickler):
178 @staticmethod
179 def persistent_load(pid):
180 return pid
181 check(PersUnpickler)
182
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300183
Collin Winter771d8342009-04-16 03:18:06 +0000184class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
185
186 pickler_class = pickle._Pickler
187 unpickler_class = pickle._Unpickler
188
189
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100190class PyDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800191
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100192 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800193
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100194 def get_dispatch_table(self):
195 return pickle.dispatch_table.copy()
196
197
198class PyChainDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800199
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100200 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800201
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100202 def get_dispatch_table(self):
203 return collections.ChainMap({}, pickle.dispatch_table)
204
205
Miss Islington (bot)cbda40d2019-06-13 05:28:11 -0700206class PyPicklerHookTests(AbstractHookTests):
207 class CustomPyPicklerClass(pickle._Pickler,
208 AbstractCustomPicklerClass):
209 pass
210 pickler_class = CustomPyPicklerClass
211
212
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000213if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200214 class CPickleTests(AbstractPickleModuleTests):
215 from _pickle import dump, dumps, load, loads, Pickler, Unpickler
216
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300217 class CUnpicklerTests(PyUnpicklerTests):
218 unpickler = _pickle.Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +0200219 bad_stack_errors = (pickle.UnpicklingError,)
Serhiy Storchaka90493ab2016-09-06 23:55:11 +0300220 truncated_errors = (pickle.UnpicklingError,)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300221
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000222 class CPicklerTests(PyPicklerTests):
223 pickler = _pickle.Pickler
224 unpickler = _pickle.Unpickler
225
226 class CPersPicklerTests(PyPersPicklerTests):
227 pickler = _pickle.Pickler
228 unpickler = _pickle.Unpickler
229
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300230 class CIdPersPicklerTests(PyIdPersPicklerTests):
231 pickler = _pickle.Pickler
232 unpickler = _pickle.Unpickler
233
Collin Winter771d8342009-04-16 03:18:06 +0000234 class CDumpPickle_LoadPickle(PyPicklerTests):
235 pickler = _pickle.Pickler
236 unpickler = pickle._Unpickler
237
238 class DumpPickle_CLoadPickle(PyPicklerTests):
239 pickler = pickle._Pickler
240 unpickler = _pickle.Unpickler
241
242 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
243 pickler_class = _pickle.Pickler
244 unpickler_class = _pickle.Unpickler
245
Christian Heimesa24b4d22013-07-01 15:17:45 +0200246 def test_issue18339(self):
247 unpickler = self.unpickler_class(io.BytesIO())
Christian Heimes21782482013-07-01 23:00:13 +0200248 with self.assertRaises(TypeError):
249 unpickler.memo = object
Christian Heimesa24b4d22013-07-01 15:17:45 +0200250 # used to cause a segfault
Christian Heimes21782482013-07-01 23:00:13 +0200251 with self.assertRaises(ValueError):
252 unpickler.memo = {-1: None}
Christian Heimesa24b4d22013-07-01 15:17:45 +0200253 unpickler.memo = {1: None}
254
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100255 class CDispatchTableTests(AbstractDispatchTableTests):
256 pickler_class = pickle.Pickler
257 def get_dispatch_table(self):
258 return pickle.dispatch_table.copy()
259
260 class CChainDispatchTableTests(AbstractDispatchTableTests):
261 pickler_class = pickle.Pickler
262 def get_dispatch_table(self):
263 return collections.ChainMap({}, pickle.dispatch_table)
264
Pierre Glaser289f1f82019-05-08 23:08:25 +0200265 class CPicklerHookTests(AbstractHookTests):
266 class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass):
267 pass
268 pickler_class = CustomCPicklerClass
269
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200270 @support.cpython_only
271 class SizeofTests(unittest.TestCase):
272 check_sizeof = support.check_sizeof
273
274 def test_pickler(self):
Antoine Pitrou91f43802019-05-26 17:10:09 +0200275 basesize = support.calcobjsize('7P2n3i2n3i2P')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200276 p = _pickle.Pickler(io.BytesIO())
277 self.assertEqual(object.__sizeof__(p), basesize)
278 MT_size = struct.calcsize('3nP0n')
279 ME_size = struct.calcsize('Pn0P')
280 check = self.check_sizeof
281 check(p, basesize +
282 MT_size + 8 * ME_size + # Minimal memo table size.
283 sys.getsizeof(b'x'*4096)) # Minimal write buffer size.
284 for i in range(6):
285 p.dump(chr(i))
286 check(p, basesize +
287 MT_size + 32 * ME_size + # Size of memo table required to
288 # save references to 6 objects.
289 0) # Write buffer is cleared after every dump().
290
291 def test_unpickler(self):
Antoine Pitrou91f43802019-05-26 17:10:09 +0200292 basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n8P2n2i')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200293 unpickler = _pickle.Unpickler
294 P = struct.calcsize('P') # Size of memo table entry.
295 n = struct.calcsize('n') # Size of mark table entry.
296 check = self.check_sizeof
297 for encoding in 'ASCII', 'UTF-16', 'latin-1':
298 for errors in 'strict', 'replace':
299 u = unpickler(io.BytesIO(),
300 encoding=encoding, errors=errors)
301 self.assertEqual(object.__sizeof__(u), basesize)
302 check(u, basesize +
303 32 * P + # Minimal memo table size.
304 len(encoding) + 1 + len(errors) + 1)
305
306 stdsize = basesize + len('ASCII') + 1 + len('strict') + 1
307 def check_unpickler(data, memo_size, marks_size):
308 dump = pickle.dumps(data)
309 u = unpickler(io.BytesIO(dump),
310 encoding='ASCII', errors='strict')
311 u.load()
312 check(u, stdsize + memo_size * P + marks_size * n)
313
314 check_unpickler(0, 32, 0)
315 # 20 is minimal non-empty mark stack size.
316 check_unpickler([0] * 100, 32, 20)
317 # 128 is memo table size required to save references to 100 objects.
318 check_unpickler([chr(i) for i in range(100)], 128, 20)
319 def recurse(deep):
320 data = 0
321 for i in range(deep):
322 data = [data, data]
323 return data
324 check_unpickler(recurse(0), 32, 0)
325 check_unpickler(recurse(1), 32, 20)
Sergey Fedoseev86b89912018-08-25 12:54:40 +0500326 check_unpickler(recurse(20), 32, 20)
327 check_unpickler(recurse(50), 64, 60)
328 check_unpickler(recurse(100), 128, 140)
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200329
330 u = unpickler(io.BytesIO(pickle.dumps('a', 0)),
331 encoding='ASCII', errors='strict')
332 u.load()
333 check(u, stdsize + 32 * P + 2 + 1)
334
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000335
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300336ALT_IMPORT_MAPPING = {
337 ('_elementtree', 'xml.etree.ElementTree'),
338 ('cPickle', 'pickle'),
Serhiy Storchaka5c1d9d22016-01-18 22:33:44 +0200339 ('StringIO', 'io'),
340 ('cStringIO', 'io'),
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300341}
342
343ALT_NAME_MAPPING = {
344 ('__builtin__', 'basestring', 'builtins', 'str'),
345 ('exceptions', 'StandardError', 'builtins', 'Exception'),
346 ('UserDict', 'UserDict', 'collections', 'UserDict'),
347 ('socket', '_socketobject', 'socket', 'SocketType'),
348}
349
350def mapping(module, name):
351 if (module, name) in NAME_MAPPING:
352 module, name = NAME_MAPPING[(module, name)]
353 elif module in IMPORT_MAPPING:
354 module = IMPORT_MAPPING[module]
355 return module, name
356
357def reverse_mapping(module, name):
358 if (module, name) in REVERSE_NAME_MAPPING:
359 module, name = REVERSE_NAME_MAPPING[(module, name)]
360 elif module in REVERSE_IMPORT_MAPPING:
361 module = REVERSE_IMPORT_MAPPING[module]
362 return module, name
363
364def getmodule(module):
365 try:
366 return sys.modules[module]
367 except KeyError:
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300368 try:
369 __import__(module)
370 except AttributeError as exc:
371 if support.verbose:
372 print("Can't import module %r: %s" % (module, exc))
373 raise ImportError
374 except ImportError as exc:
375 if support.verbose:
376 print(exc)
377 raise
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300378 return sys.modules[module]
379
380def getattribute(module, name):
381 obj = getmodule(module)
382 for n in name.split('.'):
383 obj = getattr(obj, n)
384 return obj
385
386def get_exceptions(mod):
387 for name in dir(mod):
388 attr = getattr(mod, name)
389 if isinstance(attr, type) and issubclass(attr, BaseException):
390 yield name, attr
391
392class CompatPickleTests(unittest.TestCase):
393 def test_import(self):
394 modules = set(IMPORT_MAPPING.values())
395 modules |= set(REVERSE_IMPORT_MAPPING)
396 modules |= {module for module, name in REVERSE_NAME_MAPPING}
397 modules |= {module for module, name in NAME_MAPPING.values()}
398 for module in modules:
399 try:
400 getmodule(module)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300401 except ImportError:
402 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300403
404 def test_import_mapping(self):
405 for module3, module2 in REVERSE_IMPORT_MAPPING.items():
406 with self.subTest((module3, module2)):
407 try:
408 getmodule(module3)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300409 except ImportError:
410 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300411 if module3[:1] != '_':
412 self.assertIn(module2, IMPORT_MAPPING)
413 self.assertEqual(IMPORT_MAPPING[module2], module3)
414
415 def test_name_mapping(self):
416 for (module3, name3), (module2, name2) in REVERSE_NAME_MAPPING.items():
417 with self.subTest(((module3, name3), (module2, name2))):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300418 if (module2, name2) == ('exceptions', 'OSError'):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300419 attr = getattribute(module3, name3)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300420 self.assertTrue(issubclass(attr, OSError))
Eric Snowc9432652016-09-07 15:42:32 -0700421 elif (module2, name2) == ('exceptions', 'ImportError'):
422 attr = getattribute(module3, name3)
423 self.assertTrue(issubclass(attr, ImportError))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300424 else:
425 module, name = mapping(module2, name2)
426 if module3[:1] != '_':
427 self.assertEqual((module, name), (module3, name3))
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300428 try:
429 attr = getattribute(module3, name3)
430 except ImportError:
431 pass
432 else:
433 self.assertEqual(getattribute(module, name), attr)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300434
435 def test_reverse_import_mapping(self):
436 for module2, module3 in IMPORT_MAPPING.items():
437 with self.subTest((module2, module3)):
438 try:
439 getmodule(module3)
440 except ImportError as exc:
441 if support.verbose:
442 print(exc)
443 if ((module2, module3) not in ALT_IMPORT_MAPPING and
444 REVERSE_IMPORT_MAPPING.get(module3, None) != module2):
445 for (m3, n3), (m2, n2) in REVERSE_NAME_MAPPING.items():
446 if (module3, module2) == (m3, m2):
447 break
448 else:
449 self.fail('No reverse mapping from %r to %r' %
450 (module3, module2))
451 module = REVERSE_IMPORT_MAPPING.get(module3, module3)
452 module = IMPORT_MAPPING.get(module, module)
453 self.assertEqual(module, module3)
454
455 def test_reverse_name_mapping(self):
456 for (module2, name2), (module3, name3) in NAME_MAPPING.items():
457 with self.subTest(((module2, name2), (module3, name3))):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300458 try:
459 attr = getattribute(module3, name3)
460 except ImportError:
461 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300462 module, name = reverse_mapping(module3, name3)
463 if (module2, name2, module3, name3) not in ALT_NAME_MAPPING:
464 self.assertEqual((module, name), (module2, name2))
465 module, name = mapping(module, name)
466 self.assertEqual((module, name), (module3, name3))
467
468 def test_exceptions(self):
469 self.assertEqual(mapping('exceptions', 'StandardError'),
470 ('builtins', 'Exception'))
471 self.assertEqual(mapping('exceptions', 'Exception'),
472 ('builtins', 'Exception'))
473 self.assertEqual(reverse_mapping('builtins', 'Exception'),
474 ('exceptions', 'Exception'))
475 self.assertEqual(mapping('exceptions', 'OSError'),
476 ('builtins', 'OSError'))
477 self.assertEqual(reverse_mapping('builtins', 'OSError'),
478 ('exceptions', 'OSError'))
479
480 for name, exc in get_exceptions(builtins):
481 with self.subTest(name):
Yury Selivanov75445082015-05-11 22:57:16 -0400482 if exc in (BlockingIOError,
483 ResourceWarning,
Yury Selivanovf488fb42015-07-03 01:04:23 -0400484 StopAsyncIteration,
485 RecursionError):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300486 continue
487 if exc is not OSError and issubclass(exc, OSError):
488 self.assertEqual(reverse_mapping('builtins', name),
489 ('exceptions', 'OSError'))
Eric Snowc9432652016-09-07 15:42:32 -0700490 elif exc is not ImportError and issubclass(exc, ImportError):
491 self.assertEqual(reverse_mapping('builtins', name),
492 ('exceptions', 'ImportError'))
493 self.assertEqual(mapping('exceptions', name),
494 ('exceptions', name))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300495 else:
496 self.assertEqual(reverse_mapping('builtins', name),
497 ('exceptions', name))
498 self.assertEqual(mapping('exceptions', name),
499 ('builtins', name))
500
Serhiy Storchaka7b2cfc42015-10-10 20:10:07 +0300501 def test_multiprocessing_exceptions(self):
502 module = support.import_module('multiprocessing.context')
503 for name, exc in get_exceptions(module):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300504 with self.subTest(name):
505 self.assertEqual(reverse_mapping('multiprocessing.context', name),
506 ('multiprocessing', name))
507 self.assertEqual(mapping('multiprocessing', name),
508 ('multiprocessing.context', name))
509
510
Fred Drake694ed092001-12-19 16:42:15 +0000511def test_main():
Serhiy Storchaka65452562017-11-15 14:01:08 +0200512 tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300513 PyPersPicklerTests, PyIdPersPicklerTests,
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300514 PyDispatchTableTests, PyChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200515 CompatPickleTests, PyPicklerHookTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000516 if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200517 tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300518 CPersPicklerTests, CIdPersPicklerTests,
Collin Winter771d8342009-04-16 03:18:06 +0000519 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
520 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000521 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100522 CDispatchTableTests, CChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200523 CPicklerHookTests,
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200524 InMemoryPickleTests, SizeofTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000525 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000526 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000527
Jeremy Hylton66426532001-10-15 21:38:56 +0000528if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000529 test_main()