8000 Adds subTest for each pickle protocol · python/cpython@301df7e · GitHub
[go: up one dir, main page]

Skip to content

Commit 301df7e

Browse files
committed
Adds subTest for each pickle protocol
1 parent d4756a7 commit 301df7e

File tree

1 file changed

+49
-41
lines changed

1 file changed

+49
-41
lines changed

Lib/test/_test_multiprocessing.py

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3927,26 +3927,31 @@ def test_invalid_shared_memory_cration(self):
39273927 sms_invalid = shared_memory.SharedMemory(create=True)
39283928

39293929
def test_shared_memory_pickle_unpickle(self):
3930-
sms = shared_memory.SharedMemory(create=True, size=512)
3931-
self.addCleanup(sms.unlink)
3932-
sms.buf[0:6] = b'pickle'
3933-
3934-
# Test pickling
3935-
pickled_sms = pickle.dumps(sms)
3936-
self.assertNotIn(b'pickle', pickled_sms)
3937-
3938-
# Test unpickling
3939-
sms2 = pickle.loads(pickled_sms)
3940-
self.assertIsInstance(sms2, sms.__class__)
3941-
self.assertEqual(sms.name, sms2.name)
3942-
self.assertEqual(bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'pickle')
3943-
3944-
# Test that unpickled version is still the same SharedMemory
3945-
sms.buf[0:6] = b'newval'
3946-
self.assertEqual(bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'newval')
3947-
3948-
sms2.buf[0:6] = b'oldval'
3949-
self.assertEqual(bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'oldval')
3930+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3931+
with self.subTest(proto=proto):
3932+
sms = shared_memory.SharedMemory(create=True, size=512)
3933+
self.addCleanup(sms.unlink)
3934+
sms.buf[0:6] = b'pickle'
3935+
3936+
# Test pickling
3937+
pickled_sms = pickle.dumps(sms, protocol=proto)
3938+
self.assertNotIn(b'pickle', pickled_sms)
3939+
3940+
# Test unpickling
3941+
sms2 = pickle.loads(pickled_sms)
3942+
self.assertIsInstance(sms2, sms.__class__)
3943+
self.assertEqual(sms.name, sms2.name)
3944+
self.assertEqual(
3945+
bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'pickle')
3946+
3947+
# Test that unpickled version is still the same SharedMemory
3948+
sms.buf[0:6] = b'newval'
3949+
self.assertEqual(
3950+
bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'newval')
3951+
3952+
sms2.buf[0:6] = b'oldval'
3953+
self.assertEqual(
3954+
bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'oldval')
39503955

39513956
def test_shared_memory_pickle_unpickle_dead_object(self):
39523957
sms = shared_memory.SharedMemory(create=True, size=512)
@@ -4178,27 +4183,30 @@ def test_shared_memory_ShareableList_basics(self):
41784183
empty_sl.shm.unlink()
41794184

41804185
def test_shared_memory_ShareableList_pickling(self):
4181-
sl = shared_memory.ShareableList(range(10))
4182-
self.addCleanup(sl.shm.unlink)
4183-
4184-
serialized_sl = pickle.dumps(sl)
4185-
deserialized_sl = pickle.loads(serialized_sl)
4186-
self.assertIsInstance(deserialized_sl, shared_memory.ShareableList)
4187-
self.assertEqual(deserialized_sl[-1], 9)
4188-
self.assertIsNot(sl, deserialized_sl)
4189-
deserialized_sl[4] = "changed"
4190-
self.assertEqual(sl[4], "changed")
4191-
4192-
# Verify data is not being put into the pickled representation.
4193-
name = 'a' * len(sl.shm.name)
4194-
larger_sl = shared_memory.ShareableList(range(400))
4195-
self.addCleanup(larger_sl.shm.unlink)
4196-
serialized_larger_sl = pickle.dumps(larger_sl)
4197-
self.assertEqual(len(serialized_sl), len(serialized_larger_sl))
4198-
larger_sl.shm.close()
4199-
4200-
deserialized_sl.shm.close()
4201-
sl.shm.close()
4186+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
4187+
with self.subTest(proto=proto):
4188+
sl = shared_memory.ShareableList(range(10))
4189+
self.addCleanup(sl.shm.unlink)
4190+
4191+
serialized_sl = pickle.dumps(sl, protocol=proto)
4192+
deserialized_sl = pickle.loads(serialized_sl)
4193+
self.assertIsInstance(
4194+
deserialized_sl, shared_memory.ShareableList)
4195+
self.assertEqual(deserialized_sl[-1], 9)
4196+
self.assertIsNot(sl, deserialized_sl)
4197+
deserialized_sl[4] = "changed"
4198+
self.assertEqual(sl[4], "changed")
4199+
4200+
# Verify data is not being put into the pickled representation.
4201+
name = 'a' * len(sl.shm.name)
4202+
larger_sl = shared_memory.ShareableList(range(400))
4203+
self.addCleanup(larger_sl.shm.unlink)
4204+
serialized_larger_sl = pickle.dumps(larger_sl, protocol=proto)
4205+
self.assertEqual(len(serialized_sl), len(serialized_larger_sl))
4206+
larger_sl.shm.close()
4207+
4208+
deserialized_sl.shm.close()
4209+
sl.shm.close()
42024210

42034211
def test_shared_memory_ShareableList_pickling_dead_object(self):
42044212
sl = shared_memory.ShareableList(range(10))

0 commit comments

Comments
 (0)
0