@@ -292,6 +292,11 @@ def test_b64decode_altchars(self):
292292 eq (base64 .b64decode (data , altchars = altchars_str ), res )
293293 eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
294294
295+ self .assertRaises (ValueError , base64 .b64decode , b'' , altchars = b'+' )
296+ self .assertRaises (ValueError , base64 .b64decode , b'' , altchars = b'+/-' )
297+ self .assertRaises (ValueError , base64 .b64decode , '' , altchars = '+' )
298+ self .assertRaises (ValueError , base64 .b64decode , '' , altchars = '+/-' )
299+
295300 def test_b64decode_padding_error (self ):
296301 self .assertRaises (binascii .Error , base64 .b64decode , b'abc' )
297302 self .assertRaises (binascii .Error , base64 .b64decode , 'abc' )
@@ -327,11 +332,11 @@ def test_b64decode_invalid_chars(self):
327332 with self .assertRaises (binascii .Error ):
328333 base64 .b64decode (bstr .decode ('ascii' ), validate = True )
329334 with self .assertRaises (binascii .Error ):
335+ # Even empty ignorechars enables the strict mode.
330336 base64 .b64decode (bstr , ignorechars = b'' )
331337 if ignorechars is not None :
332- self .assertEqual (
333- base64 .b64decode (bstr , ignorechars = ignorechars ),
334- res )
338+ r = base64 .b64decode (bstr , ignorechars = ignorechars )
339+ self .assertEqual (r , res )
335340
336341 with self .assertRaises (TypeError ):
337342 base64 .b64decode (b'' , ignorechars = '' )
@@ -340,13 +345,64 @@ def test_b64decode_invalid_chars(self):
340345 with self .assertRaises (TypeError ):
341346 base64 .b64decode (b'' , ignorechars = None )
342347
343- # Normal alphabet characters not discarded when alternative given
344- res = b'\xfb \xef \xff '
345- self .assertEqual (base64 .b64decode (b'++//' , validate = True ), res )
346- self .assertEqual (base64 .b64decode (b'++//' , '-_' , validate = True ), res )
347- self .assertEqual (base64 .b64decode (b'--__' , '-_' , validate = True ), res )
348- self .assertEqual (base64 .urlsafe_b64decode (b'++//' ), res )
349- self .assertEqual (base64 .urlsafe_b64decode (b'--__' ), res )
348+ # Normal alphabet characters will be discarded when alternative given
349+ discarded = ("invalid character %a in Base64 data with %s "
350+ "will be discarded in future Python versions" )
351+ error = ("invalid character %a in Base64 data with %s "
352+ "will be an error in future Python versions" )
353+ with self .assertWarns (FutureWarning ) as cm :
354+ r = base64 .b64decode (b'++++' , altchars = b'-_' )
355+ self .assertEqual (r , b'\xfb \xef \xbe ' )
356+ self .assertEqual (str (cm .warning ),
357+ discarded % ('+' , "altchars=b'-_' and validate=False" ))
358+ with self .assertWarns (FutureWarning ) as cm :
359+ r = base64 .b64decode (b'////' , altchars = b'-_' )
360+ self .assertEqual (r , b'\xff \xff \xff ' )
361+ self .assertEqual (str (cm .warning ),
362+ discarded % ('/' , "altchars=b'-_' and validate=False" ))
363+ with self .assertWarns (DeprecationWarning ) as cm :
364+ r = base64 .b64decode (b'++++' , altchars = b'-_' , validate = True )
365+ self .assertEqual (r , b'\xfb \xef \xbe ' )
366+ self .assertEqual (str (cm .warning ),
367+ error % ('+' , "altchars=b'-_' and validate=True" ))
368+ with self .assertWarns (DeprecationWarning ) as cm :
369+ r = base64 .b64decode (b'////' , altchars = b'-_' , validate = True )
370+ self .assertEqual (r , b'\xff \xff \xff ' )
371+ self .assertEqual (str (cm .warning ),
372+ error % ('/' , "altchars=b'-_' and validate=True" ))
373+ with self .assertWarns (FutureWarning ) as cm :
374+ r = base64 .b64decode (b'++++' , altchars = b'-_' , ignorechars = b'+' )
375+ self .assertEqual (r , b'\xfb \xef \xbe ' )
376+ self .assertEqual (str (cm .warning ),
377+ discarded % ('+' , "altchars=b'-_' and ignorechars=b'+'" ))
378+ with self .assertWarns (FutureWarning ) as cm :
379+ r = base64 .b64decode (b'////' , altchars = b'-_' , ignorechars = b'/' )
380+ self .assertEqual (r , b'\xff \xff \xff ' )
381+ self .assertEqual (str (cm .warning ),
382+ discarded % ('/' , "altchars=b'-_' and ignorechars=b'/'" ))
383+ with self .assertWarns (DeprecationWarning ) as cm :
384+ r = base64 .b64decode (b'++++////' , altchars = b'-_' , ignorechars = b'+' )
385+ self .assertEqual (r , b'\xfb \xef \xbe \xff \xff \xff ' )
386+ self .assertEqual (str (cm .warning ),
387+ error % ('/' , "altchars=b'-_' and validate=True" ))
388+ with self .assertWarns (DeprecationWarning ) as cm :
389+ r = base64 .b64decode (b'++++////' , altchars = b'-_' , ignorechars = b'/' )
390+ self .assertEqual (r , b'\xfb \xef \xbe \xff \xff \xff ' )
391+ self .assertEqual (str (cm .warning ),
392+ error % ('+' , "altchars=b'-_' and validate=True" ))
393+
394+ with self .assertWarns (FutureWarning ) as cm :
395+ self .assertEqual (base64 .urlsafe_b64decode (b'++++' ), b'\xfb \xef \xbe ' )
396+ self .assertEqual (str (cm .warning ),
397+ "invalid character '+' in URL-safe Base64 data "
398+ "will be discarded in future Python versions" )
399+ with self .assertWarns (FutureWarning ) as cm :
400+ self .assertEqual (base64 .urlsafe_b64decode (b'////' ), b'\xff \xff \xff ' )
401+ self .assertEqual (str (cm .warning ),
402+ "invalid character '/' in URL-safe Base64 data "
403+ "will be discarded in future Python versions" )
404+ with self .assertRaises (binascii .Error ):
405+ base64 .b64decode (b'+/!' , altchars = b'-_' )
350406
351407 def _altchars_strategy ():
352408 """Generate 'altchars' for base64 encoding."""
@@ -965,6 +1021,19 @@ def test_a85decode_errors(self):
9651021 self .assertRaises (ValueError , base64 .a85decode , b'aaaay' ,
9661022 foldspaces = True )
9671023
1024+ self .assertEqual (base64 .a85decode (b"a b\n c" , ignorechars = b" \n " ),
1025+ b'\xc9 \x89 ' )
1026+ with self .assertRaises (ValueError ):
1027+ base64 .a85decode (b"a b\n c" , ignorechars = b"" )
1028+ with self .assertRaises (ValueError ):
1029+ base64 .a85decode (b"a b\n c" , ignorechars = b" " )
1030+ with self .assertRaises (ValueError ):
1031+ base64 .a85decode (b"a b\n c" , ignorechars = b"\n " )
1032+ with self .assertRaises (TypeError ):
1033+ base64 .a85decode (b"a b\n c" , ignorechars = " \n " )
1034+ with self .assertRaises (TypeError ):
1035+ base64 .a85decode (b"a b\n c" , ignorechars = None )
1036+
9681037 def test_b85decode_errors (self ):
9691038 illegal = list (range (33 )) + \
9701039 list (b'"\' ,./:[\\ ]' ) + \
0 commit comments