blob: 0b2fe1ef2aa365d0e9e6ea3ad2afac83746b9774 [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):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -080086
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010087 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -080088
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010089 def get_dispatch_table(self):
90 return pickle.dispatch_table.copy()
91
92
93class PyChainDispatchTableTests(AbstractDispatchTableTests):
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -080094
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010095 pickler_class = pickle._Pickler
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -080096
Antoine Pitrou8d3c2902012-03-04 18:31:48 +010097 def get_dispatch_table(self):
98 return collections.ChainMap({}, pickle.dispatch_table)
99
100
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000101if has_c_implementation:
102 class CPicklerTests(PyPicklerTests):
103 pickler = _pickle.Pickler
104 unpickler = _pickle.Unpickler
105
106 class CPersPicklerTests(PyPersPicklerTests):
107 pickler = _pickle.Pickler
108 unpickler = _pickle.Unpickler
109
Collin Winter771d8342009-04-16 03:18:06 +0000110 class CDumpPickle_LoadPickle(PyPicklerTests):
111 pickler = _pickle.Pickler
112 unpickler = pickle._Unpickler
113
114 class DumpPickle_CLoadPickle(PyPicklerTests):
115 pickler = pickle._Pickler
116 unpickler = _pickle.Unpickler
117
118 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
119 pickler_class = _pickle.Pickler
120 unpickler_class = _pickle.Unpickler
121
Christian Heimesa24b4d22013-07-01 15:17:45 +0200122 def test_issue18339(self):
123 unpickler = self.unpickler_class(io.BytesIO())
Christian Heimes21782482013-07-01 23:00:13 +0200124 with self.assertRaises(TypeError):
125 unpickler.memo = object
Christian Heimesa24b4d22013-07-01 15:17:45 +0200126 # used to cause a segfault
Christian Heimes21782482013-07-01 23:00:13 +0200127 with self.assertRaises(ValueError):
128 unpickler.memo = {-1: None}
Christian Heimesa24b4d22013-07-01 15:17:45 +0200129 unpickler.memo = {1: None}
130
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100131 class CDispatchTableTests(AbstractDispatchTableTests):
132 pickler_class = pickle.Pickler
133 def get_dispatch_table(self):
134 return pickle.dispatch_table.copy()
135
136 class CChainDispatchTableTests(AbstractDispatchTableTests):
137 pickler_class = pickle.Pickler
138 def get_dispatch_table(self):
139 return collections.ChainMap({}, pickle.dispatch_table)
140
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000141
Fred Drake694ed092001-12-19 16:42:15 +0000142def test_main():
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100143 tests = [PickleTests, PyPicklerTests, PyPersPicklerTests,
144 PyDispatchTableTests, PyChainDispatchTableTests]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000145 if has_c_implementation:
Collin Winter771d8342009-04-16 03:18:06 +0000146 tests.extend([CPicklerTests, CPersPicklerTests,
147 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
148 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000149 CPicklerUnpicklerObjectTests,
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100150 CDispatchTableTests, CChainDispatchTableTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000151 InMemoryPickleTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000152 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000153 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000154
Jeremy Hylton66426532001-10-15 21:38:56 +0000155if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000156 test_main()