bpo-32032: Test both implementations of module-level pickle API. (GH-4401) (#4403)

(cherry picked from commit 6545256df9)
This commit is contained in:
Miss Islington (bot) 2017-11-15 04:32:04 -08:00 committed by Serhiy Storchaka
parent 42336def77
commit eb38367f20
3 changed files with 25 additions and 18 deletions

View file

@ -2534,7 +2534,7 @@ class AbstractPickleModuleTests(unittest.TestCase):
f = open(TESTFN, "wb") f = open(TESTFN, "wb")
try: try:
f.close() f.close()
self.assertRaises(ValueError, pickle.dump, 123, f) self.assertRaises(ValueError, self.dump, 123, f)
finally: finally:
os.remove(TESTFN) os.remove(TESTFN)
@ -2543,16 +2543,16 @@ class AbstractPickleModuleTests(unittest.TestCase):
f = open(TESTFN, "wb") f = open(TESTFN, "wb")
try: try:
f.close() f.close()
self.assertRaises(ValueError, pickle.dump, 123, f) self.assertRaises(ValueError, self.dump, 123, f)
finally: finally:
os.remove(TESTFN) os.remove(TESTFN)
def test_load_from_and_dump_to_file(self): def test_load_from_and_dump_to_file(self):
stream = io.BytesIO() stream = io.BytesIO()
data = [123, {}, 124] data = [123, {}, 124]
pickle.dump(data, stream) self.dump(data, stream)
stream.seek(0) stream.seek(0)
unpickled = pickle.load(stream) unpickled = self.load(stream)
self.assertEqual(unpickled, data) self.assertEqual(unpickled, data)
def test_highest_protocol(self): def test_highest_protocol(self):
@ -2562,20 +2562,20 @@ class AbstractPickleModuleTests(unittest.TestCase):
def test_callapi(self): def test_callapi(self):
f = io.BytesIO() f = io.BytesIO()
# With and without keyword arguments # With and without keyword arguments
pickle.dump(123, f, -1) self.dump(123, f, -1)
pickle.dump(123, file=f, protocol=-1) self.dump(123, file=f, protocol=-1)
pickle.dumps(123, -1) self.dumps(123, -1)
pickle.dumps(123, protocol=-1) self.dumps(123, protocol=-1)
pickle.Pickler(f, -1) self.Pickler(f, -1)
pickle.Pickler(f, protocol=-1) self.Pickler(f, protocol=-1)
def test_bad_init(self): def test_bad_init(self):
# Test issue3664 (pickle can segfault from a badly initialized Pickler). # Test issue3664 (pickle can segfault from a badly initialized Pickler).
# Override initialization without calling __init__() of the superclass. # Override initialization without calling __init__() of the superclass.
class BadPickler(pickle.Pickler): class BadPickler(self.Pickler):
def __init__(self): pass def __init__(self): pass
class BadUnpickler(pickle.Unpickler): class BadUnpickler(self.Unpickler):
def __init__(self): pass def __init__(self): pass
self.assertRaises(pickle.PicklingError, BadPickler().dump, 0) self.assertRaises(pickle.PicklingError, BadPickler().dump, 0)

View file

@ -26,8 +26,13 @@ except ImportError:
has_c_implementation = False has_c_implementation = False
class PickleTests(AbstractPickleModuleTests): class PyPickleTests(AbstractPickleModuleTests):
pass 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): class PyUnpicklerTests(AbstractUnpickleTests):
@ -136,6 +141,9 @@ class PyChainDispatchTableTests(AbstractDispatchTableTests):
if has_c_implementation: if has_c_implementation:
class CPickleTests(AbstractPickleModuleTests):
from _pickle import dump, dumps, load, loads, Pickler, Unpickler
class CUnpicklerTests(PyUnpicklerTests): class CUnpicklerTests(PyUnpicklerTests):
unpickler = _pickle.Unpickler unpickler = _pickle.Unpickler
bad_stack_errors = (pickle.UnpicklingError,) bad_stack_errors = (pickle.UnpicklingError,)
@ -426,12 +434,12 @@ class CompatPickleTests(unittest.TestCase):
def test_main(): def test_main():
tests = [PickleTests, PyUnpicklerTests, PyPicklerTests, tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests,
PyPersPicklerTests, PyIdPersPicklerTests, PyPersPicklerTests, PyIdPersPicklerTests,
PyDispatchTableTests, PyChainDispatchTableTests, PyDispatchTableTests, PyChainDispatchTableTests,
CompatPickleTests] CompatPickleTests]
if has_c_implementation: if has_c_implementation:
tests.extend([CUnpicklerTests, CPicklerTests, tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests,
CPersPicklerTests, CIdPersPicklerTests, CPersPicklerTests, CIdPersPicklerTests,
CDumpPickle_LoadPickle, DumpPickle_CLoadPickle, CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
PyPicklerUnpicklerObjectTests, PyPicklerUnpicklerObjectTests,

View file

@ -2,10 +2,9 @@ import pickle
import pickletools import pickletools
from test import support from test import support
from test.pickletester import AbstractPickleTests from test.pickletester import AbstractPickleTests
from test.pickletester import AbstractPickleModuleTests
import unittest import unittest
class OptimizedPickleTests(AbstractPickleTests, AbstractPickleModuleTests): class OptimizedPickleTests(AbstractPickleTests):
def dumps(self, arg, proto=None): def dumps(self, arg, proto=None):
return pickletools.optimize(pickle.dumps(arg, proto)) return pickletools.optimize(pickle.dumps(arg, proto))