blob: bb681bfb1403079f2ad5b5bacf46cefa297e9668 [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
34 def loads(self, buf):
Guido van Rossumcfe5f202007-05-08 21:26:54 +000035 f = io.BytesIO(buf)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000036 u = self.unpickler(f)
Jeremy Hylton66426532001-10-15 21:38:56 +000037 return u.load()
38
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000039
40class PyPersPicklerTests(AbstractPersistentPicklerTests):
41
42 pickler = pickle._Pickler
43 unpickler = pickle._Unpickler
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000044
Guido van Rossumf4169812008-03-17 22:56:06 +000045 def dumps(self, arg, proto=None):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000046 class PersPickler(self.pickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000047 def persistent_id(subself, obj):
48 return self.persistent_id(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000049 f = io.BytesIO()
Guido van Rossum9d32bb12003-01-28 03:51:53 +000050 p = PersPickler(f, proto)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000051 p.dump(arg)
52 f.seek(0)
53 return f.read()
54
55 def loads(self, buf):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000056 class PersUnpickler(self.unpickler):
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000057 def persistent_load(subself, obj):
58 return self.persistent_load(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +000059 f = io.BytesIO(buf)
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +000060 u = PersUnpickler(f)
61 return u.load()
62
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000063
Collin Winter771d8342009-04-16 03:18:06 +000064class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
65
66 pickler_class = pickle._Pickler
67 unpickler_class = pickle._Unpickler
68
69
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000070if has_c_implementation:
71 class CPicklerTests(PyPicklerTests):
72 pickler = _pickle.Pickler
73 unpickler = _pickle.Unpickler
74
75 class CPersPicklerTests(PyPersPicklerTests):
76 pickler = _pickle.Pickler
77 unpickler = _pickle.Unpickler
78
Collin Winter771d8342009-04-16 03:18:06 +000079 class CDumpPickle_LoadPickle(PyPicklerTests):
80 pickler = _pickle.Pickler
81 unpickler = pickle._Unpickler
82
83 class DumpPickle_CLoadPickle(PyPicklerTests):
84 pickler = pickle._Pickler
85 unpickler = _pickle.Unpickler
86
87 class CPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
88 pickler_class = _pickle.Pickler
89 unpickler_class = _pickle.Unpickler
90
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000091
Fred Drake694ed092001-12-19 16:42:15 +000092def test_main():
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000093 tests = [PickleTests, PyPicklerTests, PyPersPicklerTests]
94 if has_c_implementation:
Collin Winter771d8342009-04-16 03:18:06 +000095 tests.extend([CPicklerTests, CPersPicklerTests,
96 CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
97 PyPicklerUnpicklerObjectTests,
98 CPicklerUnpicklerObjectTests])
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000099 support.run_unittest(*tests)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000100 support.run_doctest(pickle)
Fred Drake694ed092001-12-19 16:42:15 +0000101
Jeremy Hylton66426532001-10-15 21:38:56 +0000102if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000103 test_main()