| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  | from _compat_pickle import (IMPORT_MAPPING, REVERSE_IMPORT_MAPPING, | 
					
						
							|  |  |  |                             NAME_MAPPING, REVERSE_NAME_MAPPING) | 
					
						
							|  |  |  | import builtins | 
					
						
							| 
									
										
										
										
											2000-09-15 15:14:51 +00:00
										 |  |  | import pickle | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  | import io | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  | import collections | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  | import struct | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2017-11-30 22:48:31 +02:00
										 |  |  | import weakref | 
					
						
							| 
									
										
										
										
											2003-01-28 22:34:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  | from test.support import import_helper | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-08 23:08:25 +02:00
										 |  |  | from test.pickletester import AbstractHookTests | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  | from test.pickletester import AbstractUnpickleTests | 
					
						
							| 
									
										
										
										
											2003-01-28 22:34:11 +00:00
										 |  |  | from test.pickletester import AbstractPickleTests | 
					
						
							|  |  |  | from test.pickletester import AbstractPickleModuleTests | 
					
						
							|  |  |  | from test.pickletester import AbstractPersistentPicklerTests | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  | from test.pickletester import AbstractIdentityPersistentPicklerTests | 
					
						
							| 
									
										
										
										
											2009-04-16 03:18:06 +00:00
										 |  |  | from test.pickletester import AbstractPicklerUnpicklerObjectTests | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  | from test.pickletester import AbstractDispatchTableTests | 
					
						
							| 
									
										
										
										
											2019-05-08 23:08:25 +02:00
										 |  |  | from test.pickletester import AbstractCustomPicklerClass | 
					
						
							| 
									
										
										
										
											2011-08-29 23:09:33 +02:00
										 |  |  | from test.pickletester import BigmemPickleTests | 
					
						
							| 
									
										
										
										
											2003-01-28 22:34:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     import _pickle | 
					
						
							|  |  |  |     has_c_implementation = True | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     has_c_implementation = False | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-06 21:34:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 14:01:08 +02:00
										 |  |  | class PyPickleTests(AbstractPickleModuleTests): | 
					
						
							|  |  |  |     dump = staticmethod(pickle._dump) | 
					
						
							|  |  |  |     dumps = staticmethod(pickle._dumps) | 
					
						
							|  |  |  |     load = staticmethod(pickle._load) | 
					
						
							|  |  |  |     loads = staticmethod(pickle._loads) | 
					
						
							|  |  |  |     Pickler = pickle._Pickler | 
					
						
							|  |  |  |     Unpickler = pickle._Unpickler | 
					
						
							| 
									
										
										
										
											2003-01-29 17:58:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-18 21:57:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  | class PyUnpicklerTests(AbstractUnpickleTests): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     unpickler = pickle._Unpickler | 
					
						
							| 
									
										
										
										
											2015-11-23 15:17:43 +02:00
										 |  |  |     bad_stack_errors = (IndexError,) | 
					
						
							| 
									
										
										
										
											2015-11-29 13:12:10 +02:00
										 |  |  |     truncated_errors = (pickle.UnpicklingError, EOFError, | 
					
						
							|  |  |  |                         AttributeError, ValueError, | 
					
						
							|  |  |  |                         struct.error, IndexError, ImportError) | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def loads(self, buf, **kwds): | 
					
						
							|  |  |  |         f = io.BytesIO(buf) | 
					
						
							|  |  |  |         u = self.unpickler(f, **kwds) | 
					
						
							|  |  |  |         return u.load() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | class PyPicklerTests(AbstractPickleTests): | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |     pickler = pickle._Pickler | 
					
						
							|  |  |  |     unpickler = pickle._Unpickler | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-26 17:10:09 +02:00
										 |  |  |     def dumps(self, arg, proto=None, **kwargs): | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  |         f = io.BytesIO() | 
					
						
							| 
									
										
										
										
											2019-05-26 17:10:09 +02:00
										 |  |  |         p = self.pickler(f, proto, **kwargs) | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  |         p.dump(arg) | 
					
						
							|  |  |  |         f.seek(0) | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  |         return bytes(f.read()) | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 20:34:38 +00:00
										 |  |  |     def loads(self, buf, **kwds): | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  |         f = io.BytesIO(buf) | 
					
						
							| 
									
										
										
										
											2011-02-24 20:34:38 +00:00
										 |  |  |         u = self.unpickler(f, **kwds) | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  |         return u.load() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  | class InMemoryPickleTests(AbstractPickleTests, AbstractUnpickleTests, | 
					
						
							|  |  |  |                           BigmemPickleTests): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-23 15:17:43 +02:00
										 |  |  |     bad_stack_errors = (pickle.UnpicklingError, IndexError) | 
					
						
							| 
									
										
										
										
											2015-11-29 13:12:10 +02:00
										 |  |  |     truncated_errors = (pickle.UnpicklingError, EOFError, | 
					
						
							|  |  |  |                         AttributeError, ValueError, | 
					
						
							|  |  |  |                         struct.error, IndexError, ImportError) | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-26 17:10:09 +02:00
										 |  |  |     def dumps(self, arg, protocol=None, **kwargs): | 
					
						
							|  |  |  |         return pickle.dumps(arg, protocol, **kwargs) | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 20:34:38 +00:00
										 |  |  |     def loads(self, buf, **kwds): | 
					
						
							|  |  |  |         return pickle.loads(buf, **kwds) | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-11 13:03:20 +02:00
										 |  |  |     test_framed_write_sizes_with_delayed_writer = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  | class PersistentPicklerUnpicklerMixin(object): | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-17 22:56:06 +00:00
										 |  |  |     def dumps(self, arg, proto=None): | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |         class PersPickler(self.pickler): | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  |             def persistent_id(subself, obj): | 
					
						
							|  |  |  |                 return self.persistent_id(obj) | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  |         f = io.BytesIO() | 
					
						
							| 
									
										
										
										
											2003-01-28 03:51:53 +00:00
										 |  |  |         p = PersPickler(f, proto) | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  |         p.dump(arg) | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  |         return f.getvalue() | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 20:34:38 +00:00
										 |  |  |     def loads(self, buf, **kwds): | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |         class PersUnpickler(self.unpickler): | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  |             def persistent_load(subself, obj): | 
					
						
							|  |  |  |                 return self.persistent_load(obj) | 
					
						
							| 
									
										
										
										
											2007-05-08 21:26:54 +00:00
										 |  |  |         f = io.BytesIO(buf) | 
					
						
							| 
									
										
										
										
											2011-02-24 20:34:38 +00:00
										 |  |  |         u = PersUnpickler(f, **kwds) | 
					
						
							| 
									
										
										
										
											2002-11-13 22:01:27 +00:00
										 |  |  |         return u.load() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  | class PyPersPicklerTests(AbstractPersistentPicklerTests, | 
					
						
							|  |  |  |                          PersistentPicklerUnpicklerMixin): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pickler = pickle._Pickler | 
					
						
							|  |  |  |     unpickler = pickle._Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PyIdPersPicklerTests(AbstractIdentityPersistentPicklerTests, | 
					
						
							|  |  |  |                            PersistentPicklerUnpicklerMixin): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pickler = pickle._Pickler | 
					
						
							|  |  |  |     unpickler = pickle._Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-30 22:48:31 +02:00
										 |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     def test_pickler_reference_cycle(self): | 
					
						
							|  |  |  |         def check(Pickler): | 
					
						
							|  |  |  |             for proto in range(pickle.HIGHEST_PROTOCOL + 1): | 
					
						
							|  |  |  |                 f = io.BytesIO() | 
					
						
							|  |  |  |                 pickler = Pickler(f, proto) | 
					
						
							|  |  |  |                 pickler.dump('abc') | 
					
						
							|  |  |  |                 self.assertEqual(self.loads(f.getvalue()), 'abc') | 
					
						
							|  |  |  |             pickler = Pickler(io.BytesIO()) | 
					
						
							|  |  |  |             self.assertEqual(pickler.persistent_id('def'), 'def') | 
					
						
							|  |  |  |             r = weakref.ref(pickler) | 
					
						
							|  |  |  |             del pickler | 
					
						
							|  |  |  |             self.assertIsNone(r()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersPickler(self.pickler): | 
					
						
							|  |  |  |             def persistent_id(subself, obj): | 
					
						
							|  |  |  |                 return obj | 
					
						
							|  |  |  |         check(PersPickler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersPickler(self.pickler): | 
					
						
							|  |  |  |             @classmethod | 
					
						
							|  |  |  |             def persistent_id(cls, obj): | 
					
						
							|  |  |  |                 return obj | 
					
						
							|  |  |  |         check(PersPickler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersPickler(self.pickler): | 
					
						
							|  |  |  |             @staticmethod | 
					
						
							|  |  |  |             def persistent_id(obj): | 
					
						
							|  |  |  |                 return obj | 
					
						
							|  |  |  |         check(PersPickler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     def test_unpickler_reference_cycle(self): | 
					
						
							|  |  |  |         def check(Unpickler): | 
					
						
							|  |  |  |             for proto in range(pickle.HIGHEST_PROTOCOL + 1): | 
					
						
							|  |  |  |                 unpickler = Unpickler(io.BytesIO(self.dumps('abc', proto))) | 
					
						
							|  |  |  |                 self.assertEqual(unpickler.load(), 'abc') | 
					
						
							|  |  |  |             unpickler = Unpickler(io.BytesIO()) | 
					
						
							|  |  |  |             self.assertEqual(unpickler.persistent_load('def'), 'def') | 
					
						
							|  |  |  |             r = weakref.ref(unpickler) | 
					
						
							|  |  |  |             del unpickler | 
					
						
							|  |  |  |             self.assertIsNone(r()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersUnpickler(self.unpickler): | 
					
						
							|  |  |  |             def persistent_load(subself, pid): | 
					
						
							|  |  |  |                 return pid | 
					
						
							|  |  |  |         check(PersUnpickler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersUnpickler(self.unpickler): | 
					
						
							|  |  |  |             @classmethod | 
					
						
							|  |  |  |             def persistent_load(cls, pid): | 
					
						
							|  |  |  |                 return pid | 
					
						
							|  |  |  |         check(PersUnpickler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class PersUnpickler(self.unpickler): | 
					
						
							|  |  |  |             @staticmethod | 
					
						
							|  |  |  |             def persistent_load(pid): | 
					
						
							|  |  |  |                 return pid | 
					
						
							|  |  |  |         check(PersUnpickler) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 03:18:06 +00:00
										 |  |  | class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pickler_class = pickle._Pickler | 
					
						
							|  |  |  |     unpickler_class = pickle._Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  | class PyDispatchTableTests(AbstractDispatchTableTests): | 
					
						
							| 
									
										
										
										
											2013-12-07 01:09:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |     pickler_class = pickle._Pickler | 
					
						
							| 
									
										
										
										
											2013-12-07 01:09:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |     def get_dispatch_table(self): | 
					
						
							|  |  |  |         return pickle.dispatch_table.copy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PyChainDispatchTableTests(AbstractDispatchTableTests): | 
					
						
							| 
									
										
										
										
											2013-12-07 01:09:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |     pickler_class = pickle._Pickler | 
					
						
							| 
									
										
										
										
											2013-12-07 01:09:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |     def get_dispatch_table(self): | 
					
						
							|  |  |  |         return collections.ChainMap({}, pickle.dispatch_table) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-13 13:58:51 +02:00
										 |  |  | class PyPicklerHookTests(AbstractHookTests): | 
					
						
							|  |  |  |     class CustomPyPicklerClass(pickle._Pickler, | 
					
						
							|  |  |  |                                AbstractCustomPicklerClass): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     pickler_class = CustomPyPicklerClass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | if has_c_implementation: | 
					
						
							| 
									
										
										
										
											2017-11-15 14:01:08 +02:00
										 |  |  |     class CPickleTests(AbstractPickleModuleTests): | 
					
						
							|  |  |  |         from _pickle import dump, dumps, load, loads, Pickler, Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  |     class CUnpicklerTests(PyUnpicklerTests): | 
					
						
							|  |  |  |         unpickler = _pickle.Unpickler | 
					
						
							| 
									
										
										
										
											2015-11-23 15:17:43 +02:00
										 |  |  |         bad_stack_errors = (pickle.UnpicklingError,) | 
					
						
							| 
									
										
										
										
											2016-09-06 23:55:11 +03:00
										 |  |  |         truncated_errors = (pickle.UnpicklingError,) | 
					
						
							| 
									
										
										
										
											2015-09-29 15:33:24 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |     class CPicklerTests(PyPicklerTests): | 
					
						
							|  |  |  |         pickler = _pickle.Pickler | 
					
						
							|  |  |  |         unpickler = _pickle.Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class CPersPicklerTests(PyPersPicklerTests): | 
					
						
							|  |  |  |         pickler = _pickle.Pickler | 
					
						
							|  |  |  |         unpickler = _pickle.Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  |     class CIdPersPicklerTests(PyIdPersPicklerTests): | 
					
						
							|  |  |  |         pickler = _pickle.Pickler | 
					
						
							|  |  |  |         unpickler = _pickle.Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 03:18:06 +00:00
										 |  |  |     class CDumpPickle_LoadPickle(PyPicklerTests): | 
					
						
							|  |  |  |         pickler = _pickle.Pickler | 
					
						
							|  |  |  |         unpickler = pickle._Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class DumpPickle_CLoadPickle(PyPicklerTests): | 
					
						
							|  |  |  |         pickler = pickle._Pickler | 
					
						
							|  |  |  |         unpickler = _pickle.Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests): | 
					
						
							|  |  |  |         pickler_class = _pickle.Pickler | 
					
						
							|  |  |  |         unpickler_class = _pickle.Unpickler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-01 15:17:45 +02:00
										 |  |  |         def test_issue18339(self): | 
					
						
							|  |  |  |             unpickler = self.unpickler_class(io.BytesIO()) | 
					
						
							| 
									
										
										
										
											2013-07-01 23:00:13 +02:00
										 |  |  |             with self.assertRaises(TypeError): | 
					
						
							|  |  |  |                 unpickler.memo = object | 
					
						
							| 
									
										
										
										
											2013-07-01 15:17:45 +02:00
										 |  |  |             # used to cause a segfault | 
					
						
							| 
									
										
										
										
											2013-07-01 23:00:13 +02:00
										 |  |  |             with self.assertRaises(ValueError): | 
					
						
							|  |  |  |                 unpickler.memo = {-1: None} | 
					
						
							| 
									
										
										
										
											2013-07-01 15:17:45 +02:00
										 |  |  |             unpickler.memo = {1: None} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |     class CDispatchTableTests(AbstractDispatchTableTests): | 
					
						
							|  |  |  |         pickler_class = pickle.Pickler | 
					
						
							|  |  |  |         def get_dispatch_table(self): | 
					
						
							|  |  |  |             return pickle.dispatch_table.copy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class CChainDispatchTableTests(AbstractDispatchTableTests): | 
					
						
							|  |  |  |         pickler_class = pickle.Pickler | 
					
						
							|  |  |  |         def get_dispatch_table(self): | 
					
						
							|  |  |  |             return collections.ChainMap({}, pickle.dispatch_table) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-08 23:08:25 +02:00
										 |  |  |     class CPicklerHookTests(AbstractHookTests): | 
					
						
							|  |  |  |         class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         pickler_class = CustomCPicklerClass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     class SizeofTests(unittest.TestCase): | 
					
						
							|  |  |  |         check_sizeof = support.check_sizeof | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_pickler(self): | 
					
						
							| 
									
										
										
										
											2019-05-26 17:10:09 +02:00
										 |  |  |             basesize = support.calcobjsize('7P2n3i2n3i2P') | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  |             p = _pickle.Pickler(io.BytesIO()) | 
					
						
							|  |  |  |             self.assertEqual(object.__sizeof__(p), basesize) | 
					
						
							|  |  |  |             MT_size = struct.calcsize('3nP0n') | 
					
						
							|  |  |  |             ME_size = struct.calcsize('Pn0P') | 
					
						
							|  |  |  |             check = self.check_sizeof | 
					
						
							|  |  |  |             check(p, basesize + | 
					
						
							|  |  |  |                 MT_size + 8 * ME_size +  # Minimal memo table size. | 
					
						
							|  |  |  |                 sys.getsizeof(b'x'*4096))  # Minimal write buffer size. | 
					
						
							|  |  |  |             for i in range(6): | 
					
						
							|  |  |  |                 p.dump(chr(i)) | 
					
						
							|  |  |  |             check(p, basesize + | 
					
						
							|  |  |  |                 MT_size + 32 * ME_size +  # Size of memo table required to | 
					
						
							|  |  |  |                                           # save references to 6 objects. | 
					
						
							|  |  |  |                 0)  # Write buffer is cleared after every dump(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_unpickler(self): | 
					
						
							| 
									
										
										
										
											2019-05-26 17:10:09 +02:00
										 |  |  |             basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n8P2n2i') | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  |             unpickler = _pickle.Unpickler | 
					
						
							|  |  |  |             P = struct.calcsize('P')  # Size of memo table entry. | 
					
						
							|  |  |  |             n = struct.calcsize('n')  # Size of mark table entry. | 
					
						
							|  |  |  |             check = self.check_sizeof | 
					
						
							|  |  |  |             for encoding in 'ASCII', 'UTF-16', 'latin-1': | 
					
						
							|  |  |  |                 for errors in 'strict', 'replace': | 
					
						
							|  |  |  |                     u = unpickler(io.BytesIO(), | 
					
						
							|  |  |  |                                   encoding=encoding, errors=errors) | 
					
						
							|  |  |  |                     self.assertEqual(object.__sizeof__(u), basesize) | 
					
						
							|  |  |  |                     check(u, basesize + | 
					
						
							|  |  |  |                              32 * P +  # Minimal memo table size. | 
					
						
							|  |  |  |                              len(encoding) + 1 + len(errors) + 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             stdsize = basesize + len('ASCII') + 1 + len('strict') + 1 | 
					
						
							|  |  |  |             def check_unpickler(data, memo_size, marks_size): | 
					
						
							|  |  |  |                 dump = pickle.dumps(data) | 
					
						
							|  |  |  |                 u = unpickler(io.BytesIO(dump), | 
					
						
							|  |  |  |                               encoding='ASCII', errors='strict') | 
					
						
							|  |  |  |                 u.load() | 
					
						
							|  |  |  |                 check(u, stdsize + memo_size * P + marks_size * n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             check_unpickler(0, 32, 0) | 
					
						
							|  |  |  |             # 20 is minimal non-empty mark stack size. | 
					
						
							|  |  |  |             check_unpickler([0] * 100, 32, 20) | 
					
						
							|  |  |  |             # 128 is memo table size required to save references to 100 objects. | 
					
						
							|  |  |  |             check_unpickler([chr(i) for i in range(100)], 128, 20) | 
					
						
							|  |  |  |             def recurse(deep): | 
					
						
							|  |  |  |                 data = 0 | 
					
						
							|  |  |  |                 for i in range(deep): | 
					
						
							|  |  |  |                     data = [data, data] | 
					
						
							|  |  |  |                 return data | 
					
						
							|  |  |  |             check_unpickler(recurse(0), 32, 0) | 
					
						
							|  |  |  |             check_unpickler(recurse(1), 32, 20) | 
					
						
							| 
									
										
										
										
											2018-08-25 12:54:40 +05:00
										 |  |  |             check_unpickler(recurse(20), 32, 20) | 
					
						
							|  |  |  |             check_unpickler(recurse(50), 64, 60) | 
					
						
							|  |  |  |             check_unpickler(recurse(100), 128, 140) | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             u = unpickler(io.BytesIO(pickle.dumps('a', 0)), | 
					
						
							|  |  |  |                           encoding='ASCII', errors='strict') | 
					
						
							|  |  |  |             u.load() | 
					
						
							|  |  |  |             check(u, stdsize + 32 * P + 2 + 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  | ALT_IMPORT_MAPPING = { | 
					
						
							|  |  |  |     ('_elementtree', 'xml.etree.ElementTree'), | 
					
						
							|  |  |  |     ('cPickle', 'pickle'), | 
					
						
							| 
									
										
										
										
											2016-01-18 22:33:44 +02:00
										 |  |  |     ('StringIO', 'io'), | 
					
						
							|  |  |  |     ('cStringIO', 'io'), | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ALT_NAME_MAPPING = { | 
					
						
							|  |  |  |     ('__builtin__', 'basestring', 'builtins', 'str'), | 
					
						
							|  |  |  |     ('exceptions', 'StandardError', 'builtins', 'Exception'), | 
					
						
							|  |  |  |     ('UserDict', 'UserDict', 'collections', 'UserDict'), | 
					
						
							|  |  |  |     ('socket', '_socketobject', 'socket', 'SocketType'), | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def mapping(module, name): | 
					
						
							|  |  |  |     if (module, name) in NAME_MAPPING: | 
					
						
							|  |  |  |         module, name = NAME_MAPPING[(module, name)] | 
					
						
							|  |  |  |     elif module in IMPORT_MAPPING: | 
					
						
							|  |  |  |         module = IMPORT_MAPPING[module] | 
					
						
							|  |  |  |     return module, name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def reverse_mapping(module, name): | 
					
						
							|  |  |  |     if (module, name) in REVERSE_NAME_MAPPING: | 
					
						
							|  |  |  |         module, name = REVERSE_NAME_MAPPING[(module, name)] | 
					
						
							|  |  |  |     elif module in REVERSE_IMPORT_MAPPING: | 
					
						
							|  |  |  |         module = REVERSE_IMPORT_MAPPING[module] | 
					
						
							|  |  |  |     return module, name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getmodule(module): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         return sys.modules[module] | 
					
						
							|  |  |  |     except KeyError: | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             __import__(module) | 
					
						
							|  |  |  |         except AttributeError as exc: | 
					
						
							|  |  |  |             if support.verbose: | 
					
						
							|  |  |  |                 print("Can't import module %r: %s" % (module, exc)) | 
					
						
							|  |  |  |             raise ImportError | 
					
						
							|  |  |  |         except ImportError as exc: | 
					
						
							|  |  |  |             if support.verbose: | 
					
						
							|  |  |  |                 print(exc) | 
					
						
							|  |  |  |             raise | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |         return sys.modules[module] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getattribute(module, name): | 
					
						
							|  |  |  |     obj = getmodule(module) | 
					
						
							|  |  |  |     for n in name.split('.'): | 
					
						
							|  |  |  |         obj = getattr(obj, n) | 
					
						
							|  |  |  |     return obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_exceptions(mod): | 
					
						
							|  |  |  |     for name in dir(mod): | 
					
						
							|  |  |  |         attr = getattr(mod, name) | 
					
						
							|  |  |  |         if isinstance(attr, type) and issubclass(attr, BaseException): | 
					
						
							|  |  |  |             yield name, attr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CompatPickleTests(unittest.TestCase): | 
					
						
							|  |  |  |     def test_import(self): | 
					
						
							|  |  |  |         modules = set(IMPORT_MAPPING.values()) | 
					
						
							|  |  |  |         modules |= set(REVERSE_IMPORT_MAPPING) | 
					
						
							|  |  |  |         modules |= {module for module, name in REVERSE_NAME_MAPPING} | 
					
						
							|  |  |  |         modules |= {module for module, name in NAME_MAPPING.values()} | 
					
						
							|  |  |  |         for module in modules: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 getmodule(module) | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |             except ImportError: | 
					
						
							|  |  |  |                 pass | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_import_mapping(self): | 
					
						
							|  |  |  |         for module3, module2 in REVERSE_IMPORT_MAPPING.items(): | 
					
						
							|  |  |  |             with self.subTest((module3, module2)): | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     getmodule(module3) | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |                 except ImportError: | 
					
						
							|  |  |  |                     pass | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                 if module3[:1] != '_': | 
					
						
							|  |  |  |                     self.assertIn(module2, IMPORT_MAPPING) | 
					
						
							|  |  |  |                     self.assertEqual(IMPORT_MAPPING[module2], module3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_name_mapping(self): | 
					
						
							|  |  |  |         for (module3, name3), (module2, name2) in REVERSE_NAME_MAPPING.items(): | 
					
						
							|  |  |  |             with self.subTest(((module3, name3), (module2, name2))): | 
					
						
							|  |  |  |                 if (module2, name2) == ('exceptions', 'OSError'): | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |                     attr = getattribute(module3, name3) | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                     self.assertTrue(issubclass(attr, OSError)) | 
					
						
							| 
									
										
										
										
											2016-09-07 15:42:32 -07:00
										 |  |  |                 elif (module2, name2) == ('exceptions', 'ImportError'): | 
					
						
							|  |  |  |                     attr = getattribute(module3, name3) | 
					
						
							|  |  |  |                     self.assertTrue(issubclass(attr, ImportError)) | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     module, name = mapping(module2, name2) | 
					
						
							|  |  |  |                     if module3[:1] != '_': | 
					
						
							|  |  |  |                         self.assertEqual((module, name), (module3, name3)) | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |                     try: | 
					
						
							|  |  |  |                         attr = getattribute(module3, name3) | 
					
						
							|  |  |  |                     except ImportError: | 
					
						
							|  |  |  |                         pass | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         self.assertEqual(getattribute(module, name), attr) | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_reverse_import_mapping(self): | 
					
						
							|  |  |  |         for module2, module3 in IMPORT_MAPPING.items(): | 
					
						
							|  |  |  |             with self.subTest((module2, module3)): | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     getmodule(module3) | 
					
						
							|  |  |  |                 except ImportError as exc: | 
					
						
							|  |  |  |                     if support.verbose: | 
					
						
							|  |  |  |                         print(exc) | 
					
						
							|  |  |  |                 if ((module2, module3) not in ALT_IMPORT_MAPPING and | 
					
						
							|  |  |  |                     REVERSE_IMPORT_MAPPING.get(module3, None) != module2): | 
					
						
							|  |  |  |                     for (m3, n3), (m2, n2) in REVERSE_NAME_MAPPING.items(): | 
					
						
							|  |  |  |                         if (module3, module2) == (m3, m2): | 
					
						
							|  |  |  |                             break | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         self.fail('No reverse mapping from %r to %r' % | 
					
						
							|  |  |  |                                   (module3, module2)) | 
					
						
							|  |  |  |                 module = REVERSE_IMPORT_MAPPING.get(module3, module3) | 
					
						
							|  |  |  |                 module = IMPORT_MAPPING.get(module, module) | 
					
						
							|  |  |  |                 self.assertEqual(module, module3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_reverse_name_mapping(self): | 
					
						
							|  |  |  |         for (module2, name2), (module3, name3) in NAME_MAPPING.items(): | 
					
						
							|  |  |  |             with self.subTest(((module2, name2), (module3, name3))): | 
					
						
							| 
									
										
										
										
											2015-03-31 16:49:26 +03:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     attr = getattribute(module3, name3) | 
					
						
							|  |  |  |                 except ImportError: | 
					
						
							|  |  |  |                     pass | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                 module, name = reverse_mapping(module3, name3) | 
					
						
							|  |  |  |                 if (module2, name2, module3, name3) not in ALT_NAME_MAPPING: | 
					
						
							|  |  |  |                     self.assertEqual((module, name), (module2, name2)) | 
					
						
							|  |  |  |                 module, name = mapping(module, name) | 
					
						
							|  |  |  |                 self.assertEqual((module, name), (module3, name3)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_exceptions(self): | 
					
						
							|  |  |  |         self.assertEqual(mapping('exceptions', 'StandardError'), | 
					
						
							|  |  |  |                          ('builtins', 'Exception')) | 
					
						
							|  |  |  |         self.assertEqual(mapping('exceptions', 'Exception'), | 
					
						
							|  |  |  |                          ('builtins', 'Exception')) | 
					
						
							|  |  |  |         self.assertEqual(reverse_mapping('builtins', 'Exception'), | 
					
						
							|  |  |  |                          ('exceptions', 'Exception')) | 
					
						
							|  |  |  |         self.assertEqual(mapping('exceptions', 'OSError'), | 
					
						
							|  |  |  |                          ('builtins', 'OSError')) | 
					
						
							|  |  |  |         self.assertEqual(reverse_mapping('builtins', 'OSError'), | 
					
						
							|  |  |  |                          ('exceptions', 'OSError')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for name, exc in get_exceptions(builtins): | 
					
						
							|  |  |  |             with self.subTest(name): | 
					
						
							| 
									
										
										
										
											2015-05-11 22:57:16 -04:00
										 |  |  |                 if exc in (BlockingIOError, | 
					
						
							|  |  |  |                            ResourceWarning, | 
					
						
							| 
									
										
										
										
											2015-07-03 01:04:23 -04:00
										 |  |  |                            StopAsyncIteration, | 
					
						
							|  |  |  |                            RecursionError): | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                     continue | 
					
						
							|  |  |  |                 if exc is not OSError and issubclass(exc, OSError): | 
					
						
							|  |  |  |                     self.assertEqual(reverse_mapping('builtins', name), | 
					
						
							|  |  |  |                                      ('exceptions', 'OSError')) | 
					
						
							| 
									
										
										
										
											2016-09-07 15:42:32 -07:00
										 |  |  |                 elif exc is not ImportError and issubclass(exc, ImportError): | 
					
						
							|  |  |  |                     self.assertEqual(reverse_mapping('builtins', name), | 
					
						
							|  |  |  |                                      ('exceptions', 'ImportError')) | 
					
						
							|  |  |  |                     self.assertEqual(mapping('exceptions', name), | 
					
						
							|  |  |  |                                      ('exceptions', name)) | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     self.assertEqual(reverse_mapping('builtins', name), | 
					
						
							|  |  |  |                                      ('exceptions', name)) | 
					
						
							|  |  |  |                     self.assertEqual(mapping('exceptions', name), | 
					
						
							|  |  |  |                                      ('builtins', name)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-10 20:10:07 +03:00
										 |  |  |     def test_multiprocessing_exceptions(self): | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  |         module = import_helper.import_module('multiprocessing.context') | 
					
						
							| 
									
										
										
										
											2015-10-10 20:10:07 +03:00
										 |  |  |         for name, exc in get_exceptions(module): | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |             with self.subTest(name): | 
					
						
							|  |  |  |                 self.assertEqual(reverse_mapping('multiprocessing.context', name), | 
					
						
							|  |  |  |                                  ('multiprocessing', name)) | 
					
						
							|  |  |  |                 self.assertEqual(mapping('multiprocessing', name), | 
					
						
							|  |  |  |                                  ('multiprocessing.context', name)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-19 16:42:15 +00:00
										 |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2017-11-15 14:01:08 +02:00
										 |  |  |     tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests, | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  |              PyPersPicklerTests, PyIdPersPicklerTests, | 
					
						
							| 
									
										
										
										
											2015-03-31 13:12:37 +03:00
										 |  |  |              PyDispatchTableTests, PyChainDispatchTableTests, | 
					
						
							| 
									
										
										
										
											2019-05-08 23:08:25 +02:00
										 |  |  |              CompatPickleTests, PyPicklerHookTests] | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |     if has_c_implementation: | 
					
						
							| 
									
										
										
										
											2017-11-15 14:01:08 +02:00
										 |  |  |         tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests, | 
					
						
							| 
									
										
										
										
											2016-07-17 11:24:17 +03:00
										 |  |  |                       CPersPicklerTests, CIdPersPicklerTests, | 
					
						
							| 
									
										
										
										
											2009-04-16 03:18:06 +00:00
										 |  |  |                       CDumpPickle_LoadPickle, DumpPickle_CLoadPickle, | 
					
						
							|  |  |  |                       PyPicklerUnpicklerObjectTests, | 
					
						
							| 
									
										
										
										
											2010-09-09 18:33:21 +00:00
										 |  |  |                       CPicklerUnpicklerObjectTests, | 
					
						
							| 
									
										
										
										
											2012-03-04 18:31:48 +01:00
										 |  |  |                       CDispatchTableTests, CChainDispatchTableTests, | 
					
						
							| 
									
										
										
										
											2019-05-08 23:08:25 +02:00
										 |  |  |                       CPicklerHookTests, | 
					
						
							| 
									
										
										
										
											2014-12-16 19:39:08 +02:00
										 |  |  |                       InMemoryPickleTests, SizeofTests]) | 
					
						
							| 
									
										
										
										
											2008-06-12 18:26:05 +00:00
										 |  |  |     support.run_unittest(*tests) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |     support.run_doctest(pickle) | 
					
						
							| 
									
										
										
										
											2001-12-19 16:42:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-15 21:38:56 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2001-12-19 16:42:15 +00:00
										 |  |  |     test_main() |