mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 18:07:37 +00:00 
			
		
		
		
	 d05c9ff845
			
		
	
	
		d05c9ff845
		
	
	
	
	
		
			
			Initial patch by Merlijn van Deen. I've added a few unrelated docstring fixes in the patch while I was at it, which makes the documentation for pickle a bit more consistent.
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import pickle
 | |
| import io
 | |
| import collections
 | |
| 
 | |
| from test import support
 | |
| 
 | |
| from test.pickletester import AbstractPickleTests
 | |
| from test.pickletester import AbstractPickleModuleTests
 | |
| from test.pickletester import AbstractPersistentPicklerTests
 | |
| from test.pickletester import AbstractPicklerUnpicklerObjectTests
 | |
| from test.pickletester import AbstractDispatchTableTests
 | |
| from test.pickletester import BigmemPickleTests
 | |
| 
 | |
| try:
 | |
|     import _pickle
 | |
|     has_c_implementation = True
 | |
| except ImportError:
 | |
|     has_c_implementation = False
 | |
| 
 | |
| 
 | |
| class PickleTests(AbstractPickleModuleTests):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class PyPicklerTests(AbstractPickleTests):
 | |
| 
 | |
|     pickler = pickle._Pickler
 | |
|     unpickler = pickle._Unpickler
 | |
| 
 | |
|     def dumps(self, arg, proto=None):
 | |
|         f = io.BytesIO()
 | |
|         p = self.pickler(f, proto)
 | |
|         p.dump(arg)
 | |
|         f.seek(0)
 | |
|         return bytes(f.read())
 | |
| 
 | |
|     def loads(self, buf, **kwds):
 | |
|         f = io.BytesIO(buf)
 | |
|         u = self.unpickler(f, **kwds)
 | |
|         return u.load()
 | |
| 
 | |
| 
 | |
| class InMemoryPickleTests(AbstractPickleTests, BigmemPickleTests):
 | |
| 
 | |
|     pickler = pickle._Pickler
 | |
|     unpickler = pickle._Unpickler
 | |
| 
 | |
|     def dumps(self, arg, protocol=None):
 | |
|         return pickle.dumps(arg, protocol)
 | |
| 
 | |
|     def loads(self, buf, **kwds):
 | |
|         return pickle.loads(buf, **kwds)
 | |
| 
 | |
| 
 | |
| class PyPersPicklerTests(AbstractPersistentPicklerTests):
 | |
| 
 | |
|     pickler = pickle._Pickler
 | |
|     unpickler = pickle._Unpickler
 | |
| 
 | |
|     def dumps(self, arg, proto=None):
 | |
|         class PersPickler(self.pickler):
 | |
|             def persistent_id(subself, obj):
 | |
|                 return self.persistent_id(obj)
 | |
|         f = io.BytesIO()
 | |
|         p = PersPickler(f, proto)
 | |
|         p.dump(arg)
 | |
|         f.seek(0)
 | |
|         return f.read()
 | |
| 
 | |
|     def loads(self, buf, **kwds):
 | |
|         class PersUnpickler(self.unpickler):
 | |
|             def persistent_load(subself, obj):
 | |
|                 return self.persistent_load(obj)
 | |
|         f = io.BytesIO(buf)
 | |
|         u = PersUnpickler(f, **kwds)
 | |
|         return u.load()
 | |
| 
 | |
| 
 | |
| class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
 | |
| 
 | |
|     pickler_class = pickle._Pickler
 | |
|     unpickler_class = pickle._Unpickler
 | |
| 
 | |
| 
 | |
| class PyDispatchTableTests(AbstractDispatchTableTests):
 | |
| 
 | |
|     pickler_class = pickle._Pickler
 | |
| 
 | |
|     def get_dispatch_table(self):
 | |
|         return pickle.dispatch_table.copy()
 | |
| 
 | |
| 
 | |
| class PyChainDispatchTableTests(AbstractDispatchTableTests):
 | |
| 
 | |
|     pickler_class = pickle._Pickler
 | |
| 
 | |
|     def get_dispatch_table(self):
 | |
|         return collections.ChainMap({}, pickle.dispatch_table)
 | |
| 
 | |
| 
 | |
| if has_c_implementation:
 | |
|     class CPicklerTests(PyPicklerTests):
 | |
|         pickler = _pickle.Pickler
 | |
|         unpickler = _pickle.Unpickler
 | |
| 
 | |
|     class CPersPicklerTests(PyPersPicklerTests):
 | |
|         pickler = _pickle.Pickler
 | |
|         unpickler = _pickle.Unpickler
 | |
| 
 | |
|     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
 | |
| 
 | |
|         def test_issue18339(self):
 | |
|             unpickler = self.unpickler_class(io.BytesIO())
 | |
|             with self.assertRaises(TypeError):
 | |
|                 unpickler.memo = object
 | |
|             # used to cause a segfault
 | |
|             with self.assertRaises(ValueError):
 | |
|                 unpickler.memo = {-1: None}
 | |
|             unpickler.memo = {1: None}
 | |
| 
 | |
|     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)
 | |
| 
 | |
| 
 | |
| def test_main():
 | |
|     tests = [PickleTests, PyPicklerTests, PyPersPicklerTests,
 | |
|              PyDispatchTableTests, PyChainDispatchTableTests]
 | |
|     if has_c_implementation:
 | |
|         tests.extend([CPicklerTests, CPersPicklerTests,
 | |
|                       CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
 | |
|                       PyPicklerUnpicklerObjectTests,
 | |
|                       CPicklerUnpicklerObjectTests,
 | |
|                       CDispatchTableTests, CChainDispatchTableTests,
 | |
|                       InMemoryPickleTests])
 | |
|     support.run_unittest(*tests)
 | |
|     support.run_doctest(pickle)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     test_main()
 |