mirror of
https://github.com/python/cpython.git
synced 2025-10-16 19:57:59 +00:00
Issue #19800: make the pickle framing tests more precise.
This commit is contained in:
parent
069a5e1057
commit
6e8bc50317
1 changed files with 22 additions and 0 deletions
|
@ -1416,6 +1416,26 @@ class AbstractPickleTests(unittest.TestCase):
|
||||||
|
|
||||||
FRAME_SIZE_TARGET = 64 * 1024
|
FRAME_SIZE_TARGET = 64 * 1024
|
||||||
|
|
||||||
|
def check_frame_opcodes(self, pickled):
|
||||||
|
"""
|
||||||
|
Check the arguments of FRAME opcodes in a protocol 4+ pickle.
|
||||||
|
"""
|
||||||
|
frame_opcode_size = 9
|
||||||
|
last_arg = last_pos = None
|
||||||
|
for op, arg, pos in pickletools.genops(pickled):
|
||||||
|
if op.name != 'FRAME':
|
||||||
|
continue
|
||||||
|
if last_pos is not None:
|
||||||
|
# The previous frame's size should be equal to the number
|
||||||
|
# of bytes up to the current frame.
|
||||||
|
frame_size = pos - last_pos - frame_opcode_size
|
||||||
|
self.assertEqual(frame_size, last_arg)
|
||||||
|
last_arg, last_pos = arg, pos
|
||||||
|
# The last frame's size should be equal to the number of bytes up
|
||||||
|
# to the pickle's end.
|
||||||
|
frame_size = len(pickled) - last_pos - frame_opcode_size
|
||||||
|
self.assertEqual(frame_size, last_arg)
|
||||||
|
|
||||||
def test_framing_many_objects(self):
|
def test_framing_many_objects(self):
|
||||||
obj = list(range(10**5))
|
obj = list(range(10**5))
|
||||||
for proto in range(4, pickle.HIGHEST_PROTOCOL + 1):
|
for proto in range(4, pickle.HIGHEST_PROTOCOL + 1):
|
||||||
|
@ -1429,6 +1449,7 @@ class AbstractPickleTests(unittest.TestCase):
|
||||||
self.FRAME_SIZE_TARGET / 2)
|
self.FRAME_SIZE_TARGET / 2)
|
||||||
self.assertLessEqual(bytes_per_frame,
|
self.assertLessEqual(bytes_per_frame,
|
||||||
self.FRAME_SIZE_TARGET * 1)
|
self.FRAME_SIZE_TARGET * 1)
|
||||||
|
self.check_frame_opcodes(pickled)
|
||||||
|
|
||||||
def test_framing_large_objects(self):
|
def test_framing_large_objects(self):
|
||||||
N = 1024 * 1024
|
N = 1024 * 1024
|
||||||
|
@ -1440,6 +1461,7 @@ class AbstractPickleTests(unittest.TestCase):
|
||||||
self.assertEqual(obj, unpickled)
|
self.assertEqual(obj, unpickled)
|
||||||
n_frames = count_opcode(pickle.FRAME, pickled)
|
n_frames = count_opcode(pickle.FRAME, pickled)
|
||||||
self.assertGreaterEqual(n_frames, len(obj))
|
self.assertGreaterEqual(n_frames, len(obj))
|
||||||
|
self.check_frame_opcodes(pickled)
|
||||||
|
|
||||||
def test_optional_frames(self):
|
def test_optional_frames(self):
|
||||||
if pickle.HIGHEST_PROTOCOL < 4:
|
if pickle.HIGHEST_PROTOCOL < 4:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue