blob: 895ed48df1d8d20c2ac6b1c3f8f68e994143c483 [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
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030014from test.pickletester import AbstractUnpickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000015from test.pickletester import AbstractPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000016from test.pickletester import AbstractPickleModuleTests
17from test.pickletester import AbstractPersistentPicklerTests
Serhiy Storchakadec25af2016-07-17 11:24:17 +030018from test.pickletester import AbstractIdentityPersistentPicklerTests
Collin Winter771d8342009-04-16 03:18:06 +000019from test.pickletester import AbstractPicklerUnpicklerObjectTests
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010020from test.pickletester import AbstractDispatchTableTests
Antoine Pitrou82be19f2011-08-29 23:09:33 +020021from test.pickletester import BigmemPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000022
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000023try:
24 import _pickle
25 has_c_implementation = True
26except ImportError:
27 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000028
Guido van Rossum98297ee2007-11-06 21:34:58 +000029
Serhiy Storchaka65452562017-11-15 14:01:08 +020030class PyPickleTests(AbstractPickleModuleTests):
31 dump = staticmethod(pickle._dump)
32 dumps = staticmethod(pickle._dumps)
33 load = staticmethod(pickle._load)
34 loads = staticmethod(pickle._loads)
35 Pickler = pickle._Pickler
36 Unpickler = pickle._Unpickler
Guido van Rossum5d9113d2003-01-29 17:58:45 +000037
Tim Peterse0c446b2001-10-18 21:57:37 +000038
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030039class PyUnpicklerTests(AbstractUnpickleTests):
40
41 unpickler = pickle._Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +020042 bad_stack_errors = (IndexError,)
Serhiy Storchaka7279bef2015-11-29 13:12:10 +020043 truncated_errors = (pickle.UnpicklingError, EOFError,
44 AttributeError, ValueError,
45 struct.error, IndexError, ImportError)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030046
47 def loads(self, buf, **kwds):
48 f = io.BytesIO(buf)
49 u = self.unpickler(f, **kwds)
50 return u.load()
51
52
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000053class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000054
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000055 pickler = pickle._Pickler
56 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000057
Guido van Rossumf4169812008-03-17 22:56:06 +000058 def dumps(self, arg, proto=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000059 f = io.BytesIO()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000060 p = self.pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000061 p.dump(arg)
62 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000063 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000064
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000065 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000066 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000067 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000068 return u.load()
69
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000070
Serhiy Storchakac6b54b42015-09-29 15:33:24 +030071class InMemoryPickleTests(AbstractPickleTests, AbstractUnpickleTests,
72 BigmemPickleTests):
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000073
74 pickler = pickle._Pickler
75 unpickler = pickle._Unpickler
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
87
Serhiy Storchakadec25af2016-07-17 11:24:17 +030088class PersistentPicklerUnpicklerMixin(object):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000089
Guido van Rossumf4169812008-03-17 22:56:06 +000090 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000091 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000092 def persistent_id(subself, obj):
93 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000094 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000095 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000096 p.dump(arg)
Serhiy Storchakadec25af2016-07-17 11:24:17 +030097 return f.getvalue()
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000098
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000099 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000100 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000101 def persistent_load(subself, obj):
102 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +0000103 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +0000104 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000105 return u.load()
106
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000107
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300108class PyPersPicklerTests(AbstractPersistentPicklerTests,
109 PersistentPicklerUnpicklerMixin):
110
111 pickler = pickle._Pickler
112 unpickler = pickle._Unpickler
113
114
115class PyIdPersPicklerTests(AbstractIdentityPersistentPicklerTests,
116 PersistentPicklerUnpicklerMixin):
117
118 pickler = pickle._Pickler
119 unpickler = pickle._Unpickler
120
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200121 @support.cpython_only
122 def test_pickler_reference_cycle(self):
123 def check(Pickler):
124 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
125 f = io.BytesIO()
126 pickler = Pickler(f, proto)
127 pickler.dump('abc')
128 self.assertEqual(self.loads(f.getvalue()), 'abc')
129 pickler = Pickler(io.BytesIO())
130 self.assertEqual(pickler.persistent_id('def'), 'def')
131 r = weakref.ref(pickler)
132 del pickler
133 self.assertIsNone(r())
134
135 class PersPickler(self.pickler):
136 def persistent_id(subself, obj):
137 return obj
138 check(PersPickler)
139
140 class PersPickler(self.pickler):
141 @classmethod
142 def persistent_id(cls, obj):
143 return obj
144 check(PersPickler)
145
146 class PersPickler(self.pickler):
147 @staticmethod
148 def persistent_id(obj):
149 return obj
150 check(PersPickler)
151
152 @support.cpython_only
153 def test_unpickler_reference_cycle(self):
154 def check(Unpickler):
155 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
156 unpickler = Unpickler(io.BytesIO(self.dumps('abc', proto)))
157 self.assertEqual(unpickler.load(), 'abc')
158 unpickler = Unpickler(io.BytesIO())
159 self.assertEqual(unpickler.persistent_load('def'), 'def')
160 r = weakref.ref(unpickler)
161 del unpickler
162 self.assertIsNone(r())
163
164 class PersUnpickler(self.unpickler):
165 def persistent_load(subself, pid):
166 return pid
167 check(PersUnpickler)
168
169 class PersUnpickler(self.unpickler):
170 @classmethod
171 def persistent_load(cls, pid):
172 return pid
173 check(PersUnpickler)
174
175 class PersUnpickler(self.unpickler):
176 @staticmethod
177 def persistent_load(pid):
178 return pid
179 check(PersUnpickler)
180
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300181
Collin Winter771d8342009-04-16 03:18:06 +0000182class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
183
184 pickler_class = pickle._Pickler
185 unpickler_class = pickle._Unpickler
186
187
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100188class PyDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800189
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100190 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800191
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100192 def get_dispatch_table(self):
193 return pickle.dispatch_table.copy()
194
195
196class PyChainDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800197
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100198 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800199
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100200 def get_dispatch_table(self):
201 return collections.ChainMap({}, pickle.dispatch_table)
202
203
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000204if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200205 class CPickleTests(AbstractPickleModuleTests):
206 from _pickle import dump, dumps, load, loads, Pickler, Unpickler
207
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300208 class CUnpicklerTests(PyUnpicklerTests):
209 unpickler = _pickle.Unpickler
Serhiy Storchakae9b30742015-11-23 15:17:43 +0200210 bad_stack_errors = (pickle.UnpicklingError,)
Serhiy Storchaka90493ab2016-09-06 23:55:11 +0300211 truncated_errors = (pickle.UnpicklingError,)
Serhiy Storchakac6b54b42015-09-29 15:33:24 +0300212
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000213 class CPicklerTests(PyPicklerTests):
214 pickler = _pickle.Pickler
215 unpickler = _pickle.Unpickler
216
217 class CPersPicklerTests(PyPersPicklerTests):
218 pickler = _pickle.Pickler
219 unpickler = _pickle.Unpickler
220
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300221 class CIdPersPicklerTests(PyIdPersPicklerTests):
222 pickler = _pickle.Pickler
223 unpickler = _pickle.Unpickler
224
Collin Winter771d8342009-04-16 03:18:06 +0000225 class CDumpPickle_LoadPickle(PyPicklerTests):
226 pickler = _pickle.Pickler
227 unpickler = pickle._Unpickler
228
229 class DumpPickle_CLoadPickle(PyPicklerTests):
230 pickler = pickle._Pickler
231 unpickler = _pickle.Unpickler
232
233 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
234 pickler_class = _pickle.Pickler
235 unpickler_class = _pickle.Unpickler
236
Christian Heimesa24b4d22013-07-01 15:17:45 +0200237 def test_issue18339(self):
238 unpickler = self.unpickler_class(io.BytesIO())
Christian Heimes21782482013-07-01 23:00:13 +0200239 with self.assertRaises(TypeError):
240 unpickler.memo = object
Christian Heimesa24b4d22013-07-01 15:17:45 +0200241 # used to cause a segfault
Christian Heimes21782482013-07-01 23:00:13 +0200242 with self.assertRaises(ValueError):
243 unpickler.memo = {-1: None}
Christian Heimesa24b4d22013-07-01 15:17:45 +0200244 unpickler.memo = {1: None}
245
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100246 class CDispatchTableTests(AbstractDispatchTableTests):
247 pickler_class = pickle.Pickler
248 def get_dispatch_table(self):
249 return pickle.dispatch_table.copy()
250
251 class CChainDispatchTableTests(AbstractDispatchTableTests):
252 pickler_class = pickle.Pickler
253 def get_dispatch_table(self):
254 return collections.ChainMap({}, pickle.dispatch_table)
255
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200256 @support.cpython_only
257 class SizeofTests(unittest.TestCase):
258 check_sizeof = support.check_sizeof
259
260 def test_pickler(self):
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200261 basesize = support.calcobjsize('6P2n3i2n3iP')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200262 p = _pickle.Pickler(io.BytesIO())
263 self.assertEqual(object.__sizeof__(p), basesize)
264 MT_size = struct.calcsize('3nP0n')
265 ME_size = struct.calcsize('Pn0P')
266 check = self.check_sizeof
267 check(p, basesize +
268 MT_size + 8 * ME_size + # Minimal memo table size.
269 sys.getsizeof(b'x'*4096)) # Minimal write buffer size.
270 for i in range(6):
271 p.dump(chr(i))
272 check(p, basesize +
273 MT_size + 32 * ME_size + # Size of memo table required to
274 # save references to 6 objects.
275 0) # Write buffer is cleared after every dump().
276
277 def test_unpickler(self):
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200278 basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n6P2n2i')
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200279 unpickler = _pickle.Unpickler
280 P = struct.calcsize('P') # Size of memo table entry.
281 n = struct.calcsize('n') # Size of mark table entry.
282 check = self.check_sizeof
283 for encoding in 'ASCII', 'UTF-16', 'latin-1':
284 for errors in 'strict', 'replace':
285 u = unpickler(io.BytesIO(),
286 encoding=encoding, errors=errors)
287 self.assertEqual(object.__sizeof__(u), basesize)
288 check(u, basesize +
289 32 * P + # Minimal memo table size.
290 len(encoding) + 1 + len(errors) + 1)
291
292 stdsize = basesize + len('ASCII') + 1 + len('strict') + 1
293 def check_unpickler(data, memo_size, marks_size):
294 dump = pickle.dumps(data)
295 u = unpickler(io.BytesIO(dump),
296 encoding='ASCII', errors='strict')
297 u.load()
298 check(u, stdsize + memo_size * P + marks_size * n)
299
300 check_unpickler(0, 32, 0)
301 # 20 is minimal non-empty mark stack size.
302 check_unpickler([0] * 100, 32, 20)
303 # 128 is memo table size required to save references to 100 objects.
304 check_unpickler([chr(i) for i in range(100)], 128, 20)
305 def recurse(deep):
306 data = 0
307 for i in range(deep):
308 data = [data, data]
309 return data
310 check_unpickler(recurse(0), 32, 0)
311 check_unpickler(recurse(1), 32, 20)
312 check_unpickler(recurse(20), 32, 58)
313 check_unpickler(recurse(50), 64, 58)
314 check_unpickler(recurse(100), 128, 134)
315
316 u = unpickler(io.BytesIO(pickle.dumps('a', 0)),
317 encoding='ASCII', errors='strict')
318 u.load()
319 check(u, stdsize + 32 * P + 2 + 1)
320
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000321
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300322ALT_IMPORT_MAPPING = {
323 ('_elementtree', 'xml.etree.ElementTree'),
324 ('cPickle', 'pickle'),
Serhiy Storchaka5c1d9d22016-01-18 22:33:44 +0200325 ('StringIO', 'io'),
326 ('cStringIO', 'io'),
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300327}
328
329ALT_NAME_MAPPING = {
330 ('__builtin__', 'basestring', 'builtins', 'str'),
331 ('exceptions', 'StandardError', 'builtins', 'Exception'),
332 ('UserDict', 'UserDict', 'collections', 'UserDict'),
333 ('socket', '_socketobject', 'socket', 'SocketType'),
334}
335
336def mapping(module, name):
337 if (module, name) in NAME_MAPPING:
338 module, name = NAME_MAPPING[(module, name)]
339 elif module in IMPORT_MAPPING:
340 module = IMPORT_MAPPING[module]
341 return module, name
342
343def reverse_mapping(module, name):
344 if (module, name) in REVERSE_NAME_MAPPING:
345 module, name = REVERSE_NAME_MAPPING[(module, name)]
346 elif module in REVERSE_IMPORT_MAPPING:
347 module = REVERSE_IMPORT_MAPPING[module]
348 return module, name
349
350def getmodule(module):
351 try:
352 return sys.modules[module]
353 except KeyError:
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300354 try:
355 __import__(module)
356 except AttributeError as exc:
357 if support.verbose:
358 print("Can't import module %r: %s" % (module, exc))
359 raise ImportError
360 except ImportError as exc:
361 if support.verbose:
362 print(exc)
363 raise
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300364 return sys.modules[module]
365
366def getattribute(module, name):
367 obj = getmodule(module)
368 for n in name.split('.'):
369 obj = getattr(obj, n)
370 return obj
371
372def get_exceptions(mod):
373 for name in dir(mod):
374 attr = getattr(mod, name)
375 if isinstance(attr, type) and issubclass(attr, BaseException):
376 yield name, attr
377
378class CompatPickleTests(unittest.TestCase):
379 def test_import(self):
380 modules = set(IMPORT_MAPPING.values())
381 modules |= set(REVERSE_IMPORT_MAPPING)
382 modules |= {module for module, name in REVERSE_NAME_MAPPING}
383 modules |= {module for module, name in NAME_MAPPING.values()}
384 for module in modules:
385 try:
386 getmodule(module)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300387 except ImportError:
388 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300389
390 def test_import_mapping(self):
391 for module3, module2 in REVERSE_IMPORT_MAPPING.items():
392 with self.subTest((module3, module2)):
393 try:
394 getmodule(module3)
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300395 except ImportError:
396 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300397 if module3[:1] != '_':
398 self.assertIn(module2, IMPORT_MAPPING)
399 self.assertEqual(IMPORT_MAPPING[module2], module3)
400
401 def test_name_mapping(self):
402 for (module3, name3), (module2, name2) in REVERSE_NAME_MAPPING.items():
403 with self.subTest(((module3, name3), (module2, name2))):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300404 if (module2, name2) == ('exceptions', 'OSError'):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300405 attr = getattribute(module3, name3)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300406 self.assertTrue(issubclass(attr, OSError))
Eric Snowc9432652016-09-07 15:42:32 -0700407 elif (module2, name2) == ('exceptions', 'ImportError'):
408 attr = getattribute(module3, name3)
409 self.assertTrue(issubclass(attr, ImportError))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300410 else:
411 module, name = mapping(module2, name2)
412 if module3[:1] != '_':
413 self.assertEqual((module, name), (module3, name3))
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300414 try:
415 attr = getattribute(module3, name3)
416 except ImportError:
417 pass
418 else:
419 self.assertEqual(getattribute(module, name), attr)
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300420
421 def test_reverse_import_mapping(self):
422 for module2, module3 in IMPORT_MAPPING.items():
423 with self.subTest((module2, module3)):
424 try:
425 getmodule(module3)
426 except ImportError as exc:
427 if support.verbose:
428 print(exc)
429 if ((module2, module3) not in ALT_IMPORT_MAPPING and
430 REVERSE_IMPORT_MAPPING.get(module3, None) != module2):
431 for (m3, n3), (m2, n2) in REVERSE_NAME_MAPPING.items():
432 if (module3, module2) == (m3, m2):
433 break
434 else:
435 self.fail('No reverse mapping from %r to %r' %
436 (module3, module2))
437 module = REVERSE_IMPORT_MAPPING.get(module3, module3)
438 module = IMPORT_MAPPING.get(module, module)
439 self.assertEqual(module, module3)
440
441 def test_reverse_name_mapping(self):
442 for (module2, name2), (module3, name3) in NAME_MAPPING.items():
443 with self.subTest(((module2, name2), (module3, name3))):
Serhiy Storchakab9100e52015-03-31 16:49:26 +0300444 try:
445 attr = getattribute(module3, name3)
446 except ImportError:
447 pass
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300448 module, name = reverse_mapping(module3, name3)
449 if (module2, name2, module3, name3) not in ALT_NAME_MAPPING:
450 self.assertEqual((module, name), (module2, name2))
451 module, name = mapping(module, name)
452 self.assertEqual((module, name), (module3, name3))
453
454 def test_exceptions(self):
455 self.assertEqual(mapping('exceptions', 'StandardError'),
456 ('builtins', 'Exception'))
457 self.assertEqual(mapping('exceptions', 'Exception'),
458 ('builtins', 'Exception'))
459 self.assertEqual(reverse_mapping('builtins', 'Exception'),
460 ('exceptions', 'Exception'))
461 self.assertEqual(mapping('exceptions', 'OSError'),
462 ('builtins', 'OSError'))
463 self.assertEqual(reverse_mapping('builtins', 'OSError'),
464 ('exceptions', 'OSError'))
465
466 for name, exc in get_exceptions(builtins):
467 with self.subTest(name):
Yury Selivanov75445082015-05-11 22:57:16 -0400468 if exc in (BlockingIOError,
469 ResourceWarning,
Yury Selivanovf488fb42015-07-03 01:04:23 -0400470 StopAsyncIteration,
471 RecursionError):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300472 continue
473 if exc is not OSError and issubclass(exc, OSError):
474 self.assertEqual(reverse_mapping('builtins', name),
475 ('exceptions', 'OSError'))
Eric Snowc9432652016-09-07 15:42:32 -0700476 elif exc is not ImportError and issubclass(exc, ImportError):
477 self.assertEqual(reverse_mapping('builtins', name),
478 ('exceptions', 'ImportError'))
479 self.assertEqual(mapping('exceptions', name),
480 ('exceptions', name))
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300481 else:
482 self.assertEqual(reverse_mapping('builtins', name),
483 ('exceptions', name))
484 self.assertEqual(mapping('exceptions', name),
485 ('builtins', name))
486
Serhiy Storchaka7b2cfc42015-10-10 20:10:07 +0300487 def test_multiprocessing_exceptions(self):
488 module = support.import_module('multiprocessing.context')
489 for name, exc in get_exceptions(module):
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300490 with self.subTest(name):
491 self.assertEqual(reverse_mapping('multiprocessing.context', name),
492 ('multiprocessing', name))
493 self.assertEqual(mapping('multiprocessing', name),
494 ('multiprocessing.context', name))
495
496
Fred Drake694ed092001-12-19 16:42:15 +0000497def test_main():
Serhiy Storchaka65452562017-11-15 14:01:08 +0200498 tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300499 PyPersPicklerTests, PyIdPersPicklerTests,
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300500 PyDispatchTableTests, PyChainDispatchTableTests,
501 CompatPickleTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000502 if has_c_implementation:
Serhiy Storchaka65452562017-11-15 14:01:08 +0200503 tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests,
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300504 CPersPicklerTests, CIdPersPicklerTests,
Collin Winter771d8342009-04-16 03:18:06 +0000505 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
506 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000507 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100508 CDispatchTableTests, CChainDispatchTableTests,
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200509 InMemoryPickleTests, SizeofTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000510 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000511 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000512
Jeremy Hylton66426532001-10-15 21:38:56 +0000513if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000514 test_main()