From cd9fa3d14c3f06e6534ca1d8ac43fc792b25836a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 15 Nov 2017 14:01:08 +0200 Subject: [PATCH] bpo-32032: Test both implementations of module-level pickle API. (GH-4401) (cherry picked from commit 6545256df93ba54f811206107274cfa5a6d76b86) --- Lib/test/pickletester.py | 24 ++++++++++++------------ Lib/test/test_pickle.py | 16 ++++++++++++---- Lib/test/test_pickletools.py | 3 +-- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 5c83361027bdb2..a1c0bd726fe2bb 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2534,7 +2534,7 @@ def test_dump_closed_file(self): f = open(TESTFN, "wb") try: f.close() - self.assertRaises(ValueError, pickle.dump, 123, f) + self.assertRaises(ValueError, self.dump, 123, f) finally: os.remove(TESTFN) @@ -2543,16 +2543,16 @@ def test_load_closed_file(self): f = open(TESTFN, "wb") try: f.close() - self.assertRaises(ValueError, pickle.dump, 123, f) + self.assertRaises(ValueError, self.dump, 123, f) finally: os.remove(TESTFN) def test_load_from_and_dump_to_file(self): stream = io.BytesIO() data = [123, {}, 124] - pickle.dump(data, stream) + self.dump(data, stream) stream.seek(0) - unpickled = pickle.load(stream) + unpickled = self.load(stream) self.assertEqual(unpickled, data) def test_highest_protocol(self): @@ -2562,20 +2562,20 @@ def test_highest_protocol(self): def test_callapi(self): f = io.BytesIO() # With and without keyword arguments - pickle.dump(123, f, -1) - pickle.dump(123, file=f, protocol=-1) - pickle.dumps(123, -1) - pickle.dumps(123, protocol=-1) - pickle.Pickler(f, -1) - pickle.Pickler(f, protocol=-1) + self.dump(123, f, -1) + self.dump(123, file=f, protocol=-1) + self.dumps(123, -1) + self.dumps(123, protocol=-1) + self.Pickler(f, -1) + self.Pickler(f, protocol=-1) def test_bad_init(self): # Test issue3664 (pickle can segfault from a badly initialized Pickler). # Override initialization without calling __init__() of the superclass. - class BadPickler(pickle.Pickler): + class BadPickler(self.Pickler): def __init__(self): pass - class BadUnpickler(pickle.Unpickler): + class BadUnpickler(self.Unpickler): def __init__(self): pass self.assertRaises(pickle.PicklingError, BadPickler().dump, 0) diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index e6c5d08522aa8e..ee71c632733563 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -26,8 +26,13 @@ has_c_implementation = False -class PickleTests(AbstractPickleModuleTests): - pass +class PyPickleTests(AbstractPickleModuleTests): + dump = staticmethod(pickle._dump) + dumps = staticmethod(pickle._dumps) + load = staticmethod(pickle._load) + loads = staticmethod(pickle._loads) + Pickler = pickle._Pickler + Unpickler = pickle._Unpickler class PyUnpicklerTests(AbstractUnpickleTests): @@ -136,6 +141,9 @@ def get_dispatch_table(self): if has_c_implementation: + class CPickleTests(AbstractPickleModuleTests): + from _pickle import dump, dumps, load, loads, Pickler, Unpickler + class CUnpicklerTests(PyUnpicklerTests): unpickler = _pickle.Unpickler bad_stack_errors = (pickle.UnpicklingError,) @@ -426,12 +434,12 @@ def test_multiprocessing_exceptions(self): def test_main(): - tests = [PickleTests, PyUnpicklerTests, PyPicklerTests, + tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests, PyPersPicklerTests, PyIdPersPicklerTests, PyDispatchTableTests, PyChainDispatchTableTests, CompatPickleTests] if has_c_implementation: - tests.extend([CUnpicklerTests, CPicklerTests, + tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests, CPersPicklerTests, CIdPersPicklerTests, CDumpPickle_LoadPickle, DumpPickle_CLoadPickle, PyPicklerUnpicklerObjectTests, diff --git a/Lib/test/test_pickletools.py b/Lib/test/test_pickletools.py index 86bebfa0266862..b3cab0e4fb338a 100644 --- a/Lib/test/test_pickletools.py +++ b/Lib/test/test_pickletools.py @@ -2,10 +2,9 @@ import pickletools from test import support from test.pickletester import AbstractPickleTests -from test.pickletester import AbstractPickleModuleTests import unittest -class OptimizedPickleTests(AbstractPickleTests, AbstractPickleModuleTests): +class OptimizedPickleTests(AbstractPickleTests): def dumps(self, arg, proto=None): return pickletools.optimize(pickle.dumps(arg, proto))