blob: 9da2cae86b8f25e3e327e69b280c1f294fc3e5f8 [file] [log] [blame]
Jeremy Hyltonbe467e52000-09-15 15:14:51 +00001import pickle
Guido van Rossumcfe5f202007-05-08 21:26:54 +00002import io
Tim Peters47a6b132003-01-28 22:34:11 +00003
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Jeremy Hylton66426532001-10-15 21:38:56 +00005
Tim Peters47a6b132003-01-28 22:34:11 +00006from test.pickletester import AbstractPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +00007from test.pickletester import AbstractPickleModuleTests
8from test.pickletester import AbstractPersistentPicklerTests
Collin Winter771d8342009-04-16 03:18:06 +00009from test.pickletester import AbstractPicklerUnpicklerObjectTests
Antoine Pitrou82be19f2011-08-29 23:09:33 +020010from test.pickletester import BigmemPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000011
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000012try:
13 import _pickle
14 has_c_implementation = True
15except ImportError:
16 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000017
Guido van Rossum98297ee2007-11-06 21:34:58 +000018
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000019class PickleTests(AbstractPickleModuleTests):
20 pass
Guido van Rossum5d9113d2003-01-29 17:58:45 +000021
Tim Peterse0c446b2001-10-18 21:57:37 +000022
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000023class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000024
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000025 pickler = pickle._Pickler
26 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000027
Guido van Rossumf4169812008-03-17 22:56:06 +000028 def dumps(self, arg, proto=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000029 f = io.BytesIO()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000030 p = self.pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000031 p.dump(arg)
32 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000033 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000034
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000035 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000036 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000037 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000038 return u.load()
39
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000040
Antoine Pitrou82be19f2011-08-29 23:09:33 +020041class InMemoryPickleTests(AbstractPickleTests, BigmemPickleTests):
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000042
43 pickler = pickle._Pickler
44 unpickler = pickle._Unpickler
45
Antoine Pitrou82be19f2011-08-29 23:09:33 +020046 def dumps(self, arg, protocol=None):
47 return pickle.dumps(arg, protocol)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000048
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000049 def loads(self, buf, **kwds):
50 return pickle.loads(buf, **kwds)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000051
52
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000053class PyPersPicklerTests(AbstractPersistentPicklerTests):
54
55 pickler = pickle._Pickler
56 unpickler = pickle._Unpickler
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000057
Guido van Rossumf4169812008-03-17 22:56:06 +000058 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000059 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000060 def persistent_id(subself, obj):
61 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000062 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000063 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000064 p.dump(arg)
65 f.seek(0)
66 return f.read()
67
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000068 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000069 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000070 def persistent_load(subself, obj):
71 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000072 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000073 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000074 return u.load()
75
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000076
Collin Winter771d8342009-04-16 03:18:06 +000077class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
78
79 pickler_class = pickle._Pickler
80 unpickler_class = pickle._Unpickler
81
82
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000083if has_c_implementation:
84 class CPicklerTests(PyPicklerTests):
85 pickler = _pickle.Pickler
86 unpickler = _pickle.Unpickler
87
88 class CPersPicklerTests(PyPersPicklerTests):
89 pickler = _pickle.Pickler
90 unpickler = _pickle.Unpickler
91
Collin Winter771d8342009-04-16 03:18:06 +000092 class CDumpPickle_LoadPickle(PyPicklerTests):
93 pickler = _pickle.Pickler
94 unpickler = pickle._Unpickler
95
96 class DumpPickle_CLoadPickle(PyPicklerTests):
97 pickler = pickle._Pickler
98 unpickler = _pickle.Unpickler
99
100 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
101 pickler_class = _pickle.Pickler
102 unpickler_class = _pickle.Unpickler
103
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000104
Fred Drake694ed092001-12-19 16:42:15 +0000105def test_main():
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000106 tests = [PickleTests, PyPicklerTests, PyPersPicklerTests]
107 if has_c_implementation:
Collin Winter771d8342009-04-16 03:18:06 +0000108 tests.extend([CPicklerTests, CPersPicklerTests,
109 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
110 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000111 CPicklerUnpicklerObjectTests,
112 InMemoryPickleTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000113 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000115
Jeremy Hylton66426532001-10-15 21:38:56 +0000116if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000117 test_main()