| 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() |