blob: f52d4bdee949e58b5245659cedf1e70c44ea0ad9 [file] [log] [blame]
Jeremy Hyltonbe467e52000-09-15 15:14:51 +00001import pickle
Guido van Rossumcfe5f202007-05-08 21:26:54 +00002import io
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003import collections
Tim Peters47a6b132003-01-28 22:34:11 +00004
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Jeremy Hylton66426532001-10-15 21:38:56 +00006
Tim Peters47a6b132003-01-28 22:34:11 +00007from test.pickletester import AbstractPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +00008from test.pickletester import AbstractPickleModuleTests
9from test.pickletester import AbstractPersistentPicklerTests
Collin Winter771d8342009-04-16 03:18:06 +000010from test.pickletester import AbstractPicklerUnpicklerObjectTests
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010011from test.pickletester import AbstractDispatchTableTests
Antoine Pitrou82be19f2011-08-29 23:09:33 +020012from test.pickletester import BigmemPickleTests
Tim Peters47a6b132003-01-28 22:34:11 +000013
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000014try:
15 import _pickle
16 has_c_implementation = True
17except ImportError:
18 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000019
Guido van Rossum98297ee2007-11-06 21:34:58 +000020
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000021class PickleTests(AbstractPickleModuleTests):
22 pass
Guido van Rossum5d9113d2003-01-29 17:58:45 +000023
Tim Peterse0c446b2001-10-18 21:57:37 +000024
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000025class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000026
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000027 pickler = pickle._Pickler
28 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000029
Guido van Rossumf4169812008-03-17 22:56:06 +000030 def dumps(self, arg, proto=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000031 f = io.BytesIO()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000032 p = self.pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000033 p.dump(arg)
34 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000035 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000036
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000037 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000038 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000039 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000040 return u.load()
41
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000042
Antoine Pitrou82be19f2011-08-29 23:09:33 +020043class InMemoryPickleTests(AbstractPickleTests, BigmemPickleTests):
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000044
45 pickler = pickle._Pickler
46 unpickler = pickle._Unpickler
47
Antoine Pitrou82be19f2011-08-29 23:09:33 +020048 def dumps(self, arg, protocol=None):
49 return pickle.dumps(arg, protocol)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000050
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000051 def loads(self, buf, **kwds):
52 return pickle.loads(buf, **kwds)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000053
54
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000055class PyPersPicklerTests(AbstractPersistentPicklerTests):
56
57 pickler = pickle._Pickler
58 unpickler = pickle._Unpickler
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000059
Guido van Rossumf4169812008-03-17 22:56:06 +000060 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000061 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000062 def persistent_id(subself, obj):
63 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000064 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000065 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000066 p.dump(arg)
67 f.seek(0)
68 return f.read()
69
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000070 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000071 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000072 def persistent_load(subself, obj):
73 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000074 f = io.BytesIO(buf)
Alexander Belopolskyec8f0df2011-02-24 20:34:38 +000075 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000076 return u.load()
77
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000078
Collin Winter771d8342009-04-16 03:18:06 +000079class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
80
81 pickler_class = pickle._Pickler
82 unpickler_class = pickle._Unpickler
83
84
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010085class PyDispatchTableTests(AbstractDispatchTableTests):
86 pickler_class = pickle._Pickler
87 def get_dispatch_table(self):
88 return pickle.dispatch_table.copy()
89
90
91class PyChainDispatchTableTests(AbstractDispatchTableTests):
92 pickler_class = pickle._Pickler
93 def get_dispatch_table(self):
94 return collections.ChainMap({}, pickle.dispatch_table)
95
96
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000097if has_c_implementation:
98 class CPicklerTests(PyPicklerTests):
99 pickler = _pickle.Pickler
100 unpickler = _pickle.Unpickler
101
102 class CPersPicklerTests(PyPersPicklerTests):
103 pickler = _pickle.Pickler
104 unpickler = _pickle.Unpickler
105
Collin Winter771d8342009-04-16 03:18:06 +0000106 class CDumpPickle_LoadPickle(PyPicklerTests):
107 pickler = _pickle.Pickler
108 unpickler = pickle._Unpickler
109
110 class DumpPickle_CLoadPickle(PyPicklerTests):
111 pickler = pickle._Pickler
112 unpickler = _pickle.Unpickler
113
114 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
115 pickler_class = _pickle.Pickler
116 unpickler_class = _pickle.Unpickler
117
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100118 class CDispatchTableTests(AbstractDispatchTableTests):
119 pickler_class = pickle.Pickler
120 def get_dispatch_table(self):
121 return pickle.dispatch_table.copy()
122
123 class CChainDispatchTableTests(AbstractDispatchTableTests):
124 pickler_class = pickle.Pickler
125 def get_dispatch_table(self):
126 return collections.ChainMap({}, pickle.dispatch_table)
127
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000128
Fred Drake694ed092001-12-19 16:42:15 +0000129def test_main():
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100130 tests = [PickleTests, PyPicklerTests, PyPersPicklerTests,
131 PyDispatchTableTests, PyChainDispatchTableTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000132 if has_c_implementation:
Collin Winter771d8342009-04-16 03:18:06 +0000133 tests.extend([CPicklerTests, CPersPicklerTests,
134 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
135 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000136 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100137 CDispatchTableTests, CChainDispatchTableTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000138 InMemoryPickleTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000139 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000140 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000141
Jeremy Hylton66426532001-10-15 21:38:56 +0000142if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000143 test_main()