55import pickle
66import os
77
8- from test .support import import_helper , os_helper
8+ from test .support import import_helper , os_helper , subTests
99from collections .abc import MutableMapping
1010from 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