blob: a3878fd62a62d2f771170555e7bd0463db96946b [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
Tim Peters47a6b132003-01-28 22:34:11 +000010
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000011try:
12 import _pickle
13 has_c_implementation = True
14except ImportError:
15 has_c_implementation = False
Jeremy Hylton66426532001-10-15 21:38:56 +000016
Guido van Rossum98297ee2007-11-06 21:34:58 +000017
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000018class PickleTests(AbstractPickleModuleTests):
19 pass
Guido van Rossum5d9113d2003-01-29 17:58:45 +000020
Tim Peterse0c446b2001-10-18 21:57:37 +000021
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000022class PyPicklerTests(AbstractPickleTests):
Jeremy Hylton66426532001-10-15 21:38:56 +000023
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000024 pickler = pickle._Pickler
25 unpickler = pickle._Unpickler
Jeremy Hylton66426532001-10-15 21:38:56 +000026
Guido van Rossumf4169812008-03-17 22:56:06 +000027 def dumps(self, arg, proto=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000028 f = io.BytesIO()
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000029 p = self.pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000030 p.dump(arg)
31 f.seek(0)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000032 return bytes(f.read())
Jeremy Hylton66426532001-10-15 21:38:56 +000033
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000034 def loads(self, buf, **kwds):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000035 f = io.BytesIO(buf)
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000036 u = self.unpickler(f, **kwds)
Jeremy Hylton66426532001-10-15 21:38:56 +000037 return u.load()
38
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000039
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000040class InMemoryPickleTests(AbstractPickleTests):
41
42 pickler = pickle._Pickler
43 unpickler = pickle._Unpickler
44
45 def dumps(self, arg, proto=None):
46 return pickle.dumps(arg, proto)
47
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000048 def loads(self, buf, **kwds):
49 return pickle.loads(buf, **kwds)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +000050
51
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000052class PyPersPicklerTests(AbstractPersistentPicklerTests):
53
54 pickler = pickle._Pickler
55 unpickler = pickle._Unpickler
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000056
Guido van Rossumf4169812008-03-17 22:56:06 +000057 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000058 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000059 def persistent_id(subself, obj):
60 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000061 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000062 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000063 p.dump(arg)
64 f.seek(0)
65 return f.read()
66
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000067 def loads(self, buf, **kwds):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000068 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000069 def persistent_load(subself, obj):
70 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000071 f = io.BytesIO(buf)
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000072 u = PersUnpickler(f, **kwds)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000073 return u.load()
74
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000075
Collin Winter771d8342009-04-16 03:18:06 +000076class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
77
78 pickler_class = pickle._Pickler
79 unpickler_class = pickle._Unpickler
80
81
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000082if has_c_implementation:
83 class CPicklerTests(PyPicklerTests):
84 pickler = _pickle.Pickler
85 unpickler = _pickle.Unpickler
86
87 class CPersPicklerTests(PyPersPicklerTests):
88 pickler = _pickle.Pickler
89 unpickler = _pickle.Unpickler
90
Collin Winter771d8342009-04-16 03:18:06 +000091 class CDumpPickle_LoadPickle(PyPicklerTests):
92 pickler = _pickle.Pickler
93 unpickler = pickle._Unpickler
94
95 class DumpPickle_CLoadPickle(PyPicklerTests):
96 pickler = pickle._Pickler
97 unpickler = _pickle.Unpickler
98
99 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
100 pickler_class = _pickle.Pickler
101 unpickler_class = _pickle.Unpickler
102
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000103
Fred Drake694ed092001-12-19 16:42:15 +0000104def test_main():
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000105 tests = [PickleTests, PyPicklerTests, PyPersPicklerTests]
106 if has_c_implementation:
Collin Winter771d8342009-04-16 03:18:06 +0000107 tests.extend([CPicklerTests, CPersPicklerTests,
108 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
109 PyPicklerUnpicklerObjectTests,
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000110 CPicklerUnpicklerObjectTests,
111 InMemoryPickleTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000112 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000113 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000114
Jeremy Hylton66426532001-10-15 21:38:56 +0000115if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000116 test_main()