Skip to content

Commit 41fa2db

Browse files
authored
gh-137829: Fix shelve tests for backend compatibility (#137879)
1 parent 9768085 commit 41fa2db

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

Lib/test/test_shelve.py

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pickle
66
import os
77

8-
from test.support import import_helper, os_helper
8+
from test.support import import_helper, os_helper, subTests
99
from collections.abc import MutableMapping
1010
from test.test_dbm import dbm_iterator
1111

@@ -173,6 +173,8 @@ def test_custom_serializer_and_deserializer(self):
173173
def serializer(obj, protocol):
174174
if isinstance(obj, (bytes, bytearray, str)):
175175
if protocol == 5:
176+
if isinstance(obj, bytearray):
177+
return bytes(obj) # DBM backends expect bytes
176178
return obj
177179
return type(obj).__name__
178180
elif isinstance(obj, array.array):
@@ -222,22 +224,31 @@ def deserializer(data):
222224
s["array_data"], array_data.tobytes().decode()
223225
)
224226

225-
def test_custom_incomplete_serializer_and_deserializer(self):
226-
dbm_sqlite3 = import_helper.import_module("dbm.sqlite3")
227-
os.mkdir(self.dirname)
228-
self.addCleanup(os_helper.rmtree, self.dirname)
227+
@subTests("serialized", [None, ["invalid type"]])
228+
def test_custom_invalid_serializer(self, serialized):
229+
test_dir = f"{self.dirname}_{id(serialized)}"
230+
os.mkdir(test_dir)
231+
self.addCleanup(os_helper.rmtree, test_dir)
232+
test_fn = os.path.join(test_dir, "shelftemp.db")
229233

230-
with self.assertRaises(dbm_sqlite3.error):
231-
def serializer(obj, protocol=None):
232-
pass
234+
def serializer(obj, protocol=None):
235+
return serialized
233236

234-
def deserializer(data):
235-
return data.decode("utf-8")
237+
def deserializer(data):
238+
return data.decode("utf-8")
236239

237-
with shelve.open(self.fn, serializer=serializer,
240+
# Since the serializer returns an invalid type or None,
241+
# dbm.error is raised by dbm.sqlite3 and TypeError is raised
242+
# by other backends.
243+
with self.assertRaises((TypeError, dbm.error)):
244+
with shelve.open(test_fn, serializer=serializer,
238245
deserializer=deserializer) as s:
239246
s["foo"] = "bar"
240247

248+
def test_custom_incomplete_deserializer(self):
249+
os.mkdir(self.dirname)
250+
self.addCleanup(os_helper.rmtree, self.dirname)
251+
241252
def serializer(obj, protocol=None):
242253
return type(obj).__name__.encode("utf-8")
243254

@@ -352,7 +363,7 @@ def type_name_len(obj):
352363
self.assertEqual(s["bytearray_data"], "bytearray")
353364
self.assertEqual(s["array_data"], "array")
354365

355-
def test_custom_incomplete_serializer_and_deserializer_bsd_db_shelf(self):
366+
def test_custom_incomplete_deserializer_bsd_db_shelf(self):
356367
berkeleydb = import_helper.import_module("berkeleydb")
357368
os.mkdir(self.dirname)
358369
self.addCleanup(os_helper.rmtree, self.dirname)
@@ -370,6 +381,11 @@ def deserializer(data):
370381
self.assertIsNone(s["foo"])
371382
self.assertNotEqual(s["foo"], "bar")
372383

384+
def test_custom_incomplete_serializer_bsd_db_shelf(self):
385+
berkeleydb = import_helper.import_module("berkeleydb")
386+
os.mkdir(self.dirname)
387+
self.addCleanup(os_helper.rmtree, self.dirname)
388+
373389
def serializer(obj, protocol=None):
374390
pass
375391

0 commit comments

Comments
 (0)