Skip to content

Commit 4c502e0

Browse files
Extend tests.
1 parent a61e16a commit 4c502e0

File tree

1 file changed

+79
-10
lines changed

1 file changed

+79
-10
lines changed

Lib/test/test_base64.py

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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\nc", ignorechars=b" \n"),
1025+
b'\xc9\x89')
1026+
with self.assertRaises(ValueError):
1027+
base64.a85decode(b"a b\nc", ignorechars=b"")
1028+
with self.assertRaises(ValueError):
1029+
base64.a85decode(b"a b\nc", ignorechars=b" ")
1030+
with self.assertRaises(ValueError):
1031+
base64.a85decode(b"a b\nc", ignorechars=b"\n")
1032+
with self.assertRaises(TypeError):
1033+
base64.a85decode(b"a b\nc", ignorechars=" \n")
1034+
with self.assertRaises(TypeError):
1035+
base64.a85decode(b"a b\nc", ignorechars=None)
1036+
9681037
def test_b85decode_errors(self):
9691038
illegal = list(range(33)) + \
9701039
list(b'"\',./:[\\]') + \

0 commit comments

Comments
 (0)