blob: 435c248802d3d7e537334b480e34770fa579b7b9 [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
Guido van Rossumf4169812008-03-17 22:56:06 +000060 def dumps(self, arg, proto=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000061 f = io.BytesIO()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000062 p = self.pickler(f, proto)
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 Pitrou82be19f2011-08-29 23:09:33 +020081 def dumps(self, arg, protocol=None):
82 return pickle.dumps(arg, protocol)
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
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000206if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200207 class CPickleTests(AbstractPickleModuleTests):
208 from _pickle import dump, dumps, load, loads, Pickler, Unpickler
209
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300210 class CUnpicklerTests(PyUnpicklerTests):
211 unpickler = _pickle.Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +0200212 bad_stack_errors = (pickle.UnpicklingError,)
Serhiy Storchaka90493ab2016-09-06 23:55:11 +0300213 truncated_errors = (pickle.UnpicklingError,)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300214
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000215 class CPicklerTests(PyPicklerTests):
216 pickler = _pickle.Pickler
217 unpickler = _pickle.Unpickler
218
219 class CPersPicklerTests(PyPersPicklerTests):
220 pickler = _pickle.Pickler
221 unpickler = _pickle.Unpickler
222
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300223 class CIdPersPicklerTests(PyIdPersPicklerTests):
224 pickler = _pickle.Pickler
225 unpickler = _pickle.Unpickler
226
Collin Winter771d8342009-04-16 03:18:06 +0000227 class CDumpPickle_LoadPickle(PyPicklerTests):
228 pickler = _pickle.Pickler
229 unpickler = pickle._Unpickler
230
231 class DumpPickle_CLoadPickle(PyPicklerTests):
232 pickler = pickle._Pickler
233 unpickler = _pickle.Unpickler
234
235 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
236 pickler_class = _pickle.Pickler
237 unpickler_class = _pickle.Unpickler
238
Christian Heimesa24b4d22013-07-01 15:17:45 +0200239 def test_issue18339(self):
240 unpickler = self.unpickler_class(io.BytesIO())
Christian Heimes21782482013-07-01 23:00:13 +0200241 with self.assertRaises(TypeError):
242 unpickler.memo = object
Christian Heimesa24b4d22013-07-01 15:17:45 +0200243 # used to cause a segfault
Christian Heimes21782482013-07-01 23:00:13 +0200244 with self.assertRaises(ValueError):
245 unpickler.memo = {-1: None}
Christian Heimesa24b4d22013-07-01 15:17:45 +0200246 unpickler.memo = {1: None}
247
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100248 class CDispatchTableTests(AbstractDispatchTableTests):
249 pickler_class = pickle.Pickler
250 def get_dispatch_table(self):
251 return pickle.dispatch_table.copy()
252
253 class CChainDispatchTableTests(AbstractDispatchTableTests):
254 pickler_class = pickle.Pickler
255 def get_dispatch_table(self):
256 return collections.ChainMap({}, pickle.dispatch_table)
257
Pierre Glaser289f1f82019-05-08 23:08:25 +0200258 class PyPicklerHookTests(AbstractHookTests):
259 class CustomPyPicklerClass(pickle._Pickler,
260 AbstractCustomPicklerClass):
261 pass
262 pickler_class = CustomPyPicklerClass
263
264 class CPicklerHookTests(AbstractHookTests):
265 class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass):
266 pass
267 pickler_class = CustomCPicklerClass
268
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200269 @support.cpython_only
270 class SizeofTests(unittest.TestCase):
271 check_sizeof = support.check_sizeof
272
273 def test_pickler(self):
Pierre Glaser289f1f82019-05-08 23:08:25 +0200274 basesize = support.calcobjsize('6P2n3i2n3i2P')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200275 p = _pickle.Pickler(io.BytesIO())
276 self.assertEqual(object.__sizeof__(p), basesize)
277 MT_size = struct.calcsize('3nP0n')
278 ME_size = struct.calcsize('Pn0P')
279 check = self.check_sizeof
280 check(p, basesize +
281 MT_size + 8 * ME_size + # Minimal memo table size.
282 sys.getsizeof(b'x'*4096)) # Minimal write buffer size.
283 for i in range(6):
284 p.dump(chr(i))
285 check(p, basesize +
286 MT_size + 32 * ME_size + # Size of memo table required to
287 # save references to 6 objects.
288 0) # Write buffer is cleared after every dump().
289
290 def test_unpickler(self):
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200291 basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n6P2n2i')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200292 unpickler = _pickle.Unpickler
293 P = struct.calcsize('P') # Size of memo table entry.
294 n = struct.calcsize('n') # Size of mark table entry.
295 check = self.check_sizeof
296 for encoding in 'ASCII', 'UTF-16', 'latin-1':
297 for errors in 'strict', 'replace':
298 u = unpickler(io.BytesIO(),
299 encoding=encoding, errors=errors)
300 self.assertEqual(object.__sizeof__(u), basesize)
301 check(u, basesize +
302 32 * P + # Minimal memo table size.
303 len(encoding) + 1 + len(errors) + 1)
304
305 stdsize = basesize + len('ASCII') + 1 + len('strict') + 1
306 def check_unpickler(data, memo_size, marks_size):
307 dump = pickle.dumps(data)
308 u = unpickler(io.BytesIO(dump),
309 encoding='ASCII', errors='strict')
310 u.load()
311 check(u, stdsize + memo_size * P + marks_size * n)
312
313 check_unpickler(0, 32, 0)
314 # 20 is minimal non-empty mark stack size.
315 check_unpickler([0] * 100, 32, 20)
316 # 128 is memo table size required to save references to 100 objects.
317 check_unpickler([chr(i) for i in range(100)], 128, 20)
318 def recurse(deep):
319 data = 0
320 for i in range(deep):
321 data = [data, data]
322 return data
323 check_unpickler(recurse(0), 32, 0)
324 check_unpickler(recurse(1), 32, 20)
Sergey Fedoseev86b89912018-08-25 12:54:40 +0500325 check_unpickler(recurse(20), 32, 20)
326 check_unpickler(recurse(50), 64, 60)
327 check_unpickler(recurse(100), 128, 140)
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200328
329 u = unpickler(io.BytesIO(pickle.dumps('a', 0)),
330 encoding='ASCII', errors='strict')
331 u.load()
332 check(u, stdsize + 32 * P + 2 + 1)
333
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000334
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300335ALT_IMPORT_MAPPING = {
336 ('_elementtree', 'xml.etree.ElementTree'),
337 ('cPickle', 'pickle'),
Serhiy Storchaka5c1d9d22016-01-18 22:33:44 +0200338 ('StringIO', 'io'),
339 ('cStringIO', 'io'),
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300340}
341
342ALT_NAME_MAPPING = {
343 ('__builtin__', 'basestring', 'builtins', 'str'),
344 ('exceptions', 'StandardError', 'builtins', 'Exception'),
345 ('UserDict', 'UserDict', 'collections', 'UserDict'),
346 ('socket', '_socketobject', 'socket', 'SocketType'),
347}
348
349def mapping(module, name):
350 if (module, name) in NAME_MAPPING:
351 module, name = NAME_MAPPING[(module, name)]
352 elif module in IMPORT_MAPPING:
353 module = IMPORT_MAPPING[module]
354 return module, name
355
356def reverse_mapping(module, name):
357 if (module, name) in REVERSE_NAME_MAPPING:
358 module, name = REVERSE_NAME_MAPPING[(module, name)]
359 elif module in REVERSE_IMPORT_MAPPING:
360 module = REVERSE_IMPORT_MAPPING[module]
361 return module, name
362
363def getmodule(module):
364 try:
365 return sys.modules[module]
366 except KeyError:
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300367 try:
368 __import__(module)
369 except AttributeError as exc:
370 if support.verbose:
371 print("Can't import module %r: %s" % (module, exc))
372 raise ImportError
373 except ImportError as exc:
374 if support.verbose:
375 print(exc)
376 raise
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300377 return sys.modules[module]
378
379def getattribute(module, name):
380 obj = getmodule(module)
381 for n in name.split('.'):
382 obj = getattr(obj, n)
383 return obj
384
385def get_exceptions(mod):
386 for name in dir(mod):
387 attr = getattr(mod, name)
388 if isinstance(attr, type) and issubclass(attr, BaseException):
389 yield name, attr
390
391class CompatPickleTests(unittest.TestCase):
392 def test_import(self):
393 modules = set(IMPORT_MAPPING.values())
394 modules |= set(REVERSE_IMPORT_MAPPING)
395 modules |= {module for module, name in REVERSE_NAME_MAPPING}
396 modules |= {module for module, name in NAME_MAPPING.values()}
397 for module in modules:
398 try:
399 getmodule(module)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300400 except ImportError:
401 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300402
403 def test_import_mapping(self):
404 for module3, module2 in REVERSE_IMPORT_MAPPING.items():
405 with self.subTest((module3, module2)):
406 try:
407 getmodule(module3)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300408 except ImportError:
409 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300410 if module3[:1] != '_':
411 self.assertIn(module2, IMPORT_MAPPING)
412 self.assertEqual(IMPORT_MAPPING[module2], module3)
413
414 def test_name_mapping(self):
415 for (module3, name3), (module2, name2) in REVERSE_NAME_MAPPING.items():
416 with self.subTest(((module3, name3), (module2, name2))):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300417 if (module2, name2) == ('exceptions', 'OSError'):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300418 attr = getattribute(module3, name3)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300419 self.assertTrue(issubclass(attr, OSError))
Eric Snowc9432652016-09-07 15:42:32 -0700420 elif (module2, name2) == ('exceptions', 'ImportError'):
421 attr = getattribute(module3, name3)
422 self.assertTrue(issubclass(attr, ImportError))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300423 else:
424 module, name = mapping(module2, name2)
425 if module3[:1] != '_':
426 self.assertEqual((module, name), (module3, name3))
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300427 try:
428 attr = getattribute(module3, name3)
429 except ImportError:
430 pass
431 else:
432 self.assertEqual(getattribute(module, name), attr)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300433
434 def test_reverse_import_mapping(self):
435 for module2, module3 in IMPORT_MAPPING.items():
436 with self.subTest((module2, module3)):
437 try:
438 getmodule(module3)
439 except ImportError as exc:
440 if support.verbose:
441 print(exc)
442 if ((module2, module3) not in ALT_IMPORT_MAPPING and
443 REVERSE_IMPORT_MAPPING.get(module3, None) != module2):
444 for (m3, n3), (m2, n2) in REVERSE_NAME_MAPPING.items():
445 if (module3, module2) == (m3, m2):
446 break
447 else:
448 self.fail('No reverse mapping from %r to %r' %
449 (module3, module2))
450 module = REVERSE_IMPORT_MAPPING.get(module3, module3)
451 module = IMPORT_MAPPING.get(module, module)
452 self.assertEqual(module, module3)
453
454 def test_reverse_name_mapping(self):
455 for (module2, name2), (module3, name3) in NAME_MAPPING.items():
456 with self.subTest(((module2, name2), (module3, name3))):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300457 try:
458 attr = getattribute(module3, name3)
459 except ImportError:
460 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300461 module, name = reverse_mapping(module3, name3)
462 if (module2, name2, module3, name3) not in ALT_NAME_MAPPING:
463 self.assertEqual((module, name), (module2, name2))
464 module, name = mapping(module, name)
465 self.assertEqual((module, name), (module3, name3))
466
467 def test_exceptions(self):
468 self.assertEqual(mapping('exceptions', 'StandardError'),
469 ('builtins', 'Exception'))
470 self.assertEqual(mapping('exceptions', 'Exception'),
471 ('builtins', 'Exception'))
472 self.assertEqual(reverse_mapping('builtins', 'Exception'),
473 ('exceptions', 'Exception'))
474 self.assertEqual(mapping('exceptions', 'OSError'),
475 ('builtins', 'OSError'))
476 self.assertEqual(reverse_mapping('builtins', 'OSError'),
477 ('exceptions', 'OSError'))
478
479 for name, exc in get_exceptions(builtins):
480 with self.subTest(name):
Yury Selivanov75445082015-05-11 22:57:16 -0400481 if exc in (BlockingIOError,
482 ResourceWarning,
Yury Selivanovf488fb42015-07-03 01:04:23 -0400483 StopAsyncIteration,
484 RecursionError):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300485 continue
486 if exc is not OSError and issubclass(exc, OSError):
487 self.assertEqual(reverse_mapping('builtins', name),
488 ('exceptions', 'OSError'))
Eric Snowc9432652016-09-07 15:42:32 -0700489 elif exc is not ImportError and issubclass(exc, ImportError):
490 self.assertEqual(reverse_mapping('builtins', name),
491 ('exceptions', 'ImportError'))
492 self.assertEqual(mapping('exceptions', name),
493 ('exceptions', name))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300494 else:
495 self.assertEqual(reverse_mapping('builtins', name),
496 ('exceptions', name))
497 self.assertEqual(mapping('exceptions', name),
498 ('builtins', name))
499
Serhiy Storchaka7b2cfc42015-10-10 20:10:07 +0300500 def test_multiprocessing_exceptions(self):
501 module = support.import_module('multiprocessing.context')
502 for name, exc in get_exceptions(module):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300503 with self.subTest(name):
504 self.assertEqual(reverse_mapping('multiprocessing.context', name),
505 ('multiprocessing', name))
506 self.assertEqual(mapping('multiprocessing', name),
507 ('multiprocessing.context', name))
508
509
Fred Drake694ed092001-12-19 16:42:15 +0000510def test_main():
Serhiy Storchaka65452562017-11-15 14:01:08 +0200511 tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300512 PyPersPicklerTests, PyIdPersPicklerTests,
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300513 PyDispatchTableTests, PyChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200514 CompatPickleTests, PyPicklerHookTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000515 if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200516 tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300517 CPersPicklerTests, CIdPersPicklerTests,
Collin Winter771d8342009-04-16 03:18:06 +0000518 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
519 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000520 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100521 CDispatchTableTests, CChainDispatchTableTests,
Pierre Glaser289f1f82019-05-08 23:08:25 +0200522 CPicklerHookTests,
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200523 InMemoryPickleTests, SizeofTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000524 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000525 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000526
Jeremy Hylton66426532001-10-15 21:38:56 +0000527if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000528 test_main()