mirror of
https://github.com/python/cpython.git
synced 2025-09-30 12:21:51 +00:00
bpo-32032: Test both implementations of module-level pickle API. (GH-4401) (#4403)
(cherry picked from commit 6545256df9
)
This commit is contained in:
parent
42336def77
commit
eb38367f20
3 changed files with 25 additions and 18 deletions
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue