Skip to content

Commit 13360ef

Browse files
gh-125346: Add more base64 tests (GH-141061)
Add more tests for the altchars argument of b64decode() and for the map01 argument of b32decode().
1 parent 4e6e208 commit 13360ef

File tree

1 file changed

+41
-23
lines changed

1 file changed

+41
-23
lines changed

Lib/test/test_base64.py

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -231,18 +231,6 @@ def test_b64decode(self):
231231
self.check_other_types(base64.b64decode, b"YWJj", b"abc")
232232
self.check_decode_type_errors(base64.b64decode)
233233

234-
# Test with arbitrary alternative characters
235-
tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
236-
}
237-
for (data, altchars), res in tests_altchars.items():
238-
data_str = data.decode('ascii')
239-
altchars_str = altchars.decode('ascii')
240-
241-
eq(base64.b64decode(data, altchars=altchars), res)
242-
eq(base64.b64decode(data_str, altchars=altchars), res)
243-
eq(base64.b64decode(data, altchars=altchars_str), res)
244-
eq(base64.b64decode(data_str, altchars=altchars_str), res)
245-
246234
# Test standard alphabet
247235
for data, res in tests.items():
248236
eq(base64.standard_b64decode(data), res)
@@ -263,6 +251,20 @@ def test_b64decode(self):
263251
b'\xd3V\xbeo\xf7\x1d')
264252
self.check_decode_type_errors(base64.urlsafe_b64decode)
265253

254+
def test_b64decode_altchars(self):
255+
# Test with arbitrary alternative characters
256+
eq = self.assertEqual
257+
res = b'\xd3V\xbeo\xf7\x1d'
258+
for altchars in b'*$', b'+/', b'/+', b'+_', b'-+', b'-/', b'/_':
259+
data = b'01a%cb%ccd' % tuple(altchars)
260+
data_str = data.decode('ascii')
261+
altchars_str = altchars.decode('ascii')
262+
263+
eq(base64.b64decode(data, altchars=altchars), res)
264+
eq(base64.b64decode(data_str, altchars=altchars), res)
265+
eq(base64.b64decode(data, altchars=altchars_str), res)
266+
eq(base64.b64decode(data_str, altchars=altchars_str), res)
267+
266268
def test_b64decode_padding_error(self):
267269
self.assertRaises(binascii.Error, base64.b64decode, b'abc')
268270
self.assertRaises(binascii.Error, base64.b64decode, 'abc')
@@ -295,10 +297,12 @@ def test_b64decode_invalid_chars(self):
295297
base64.b64decode(bstr.decode('ascii'), validate=True)
296298

297299
# Normal alphabet characters not discarded when alternative given
298-
res = b'\xFB\xEF\xBE\xFF\xFF\xFF'
299-
self.assertEqual(base64.b64decode(b'++[[//]]', b'[]'), res)
300-
self.assertEqual(base64.urlsafe_b64decode(b'++--//__'), res)
301-
300+
res = b'\xfb\xef\xff'
301+
self.assertEqual(base64.b64decode(b'++//', validate=True), res)
302+
self.assertEqual(base64.b64decode(b'++//', '-_', validate=True), res)
303+
self.assertEqual(base64.b64decode(b'--__', '-_', validate=True), res)
304+
self.assertEqual(base64.urlsafe_b64decode(b'++//'), res)
305+
self.assertEqual(base64.urlsafe_b64decode(b'--__'), res)
302306

303307
def _altchars_strategy():
304308
"""Generate 'altchars' for base64 encoding."""
@@ -394,19 +398,33 @@ def test_b32decode_casefold(self):
394398
eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
395399
eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
396400

397-
map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
398-
(b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
399-
}
400-
for (data, map01), res in map_tests.items():
401-
data_str = data.decode('ascii')
401+
def test_b32decode_map01(self):
402+
# Mapping zero and one
403+
eq = self.assertEqual
404+
res_L = b'b\xdd\xad\xf3\xbe'
405+
res_I = b'b\x1d\xad\xf3\xbe'
406+
eq(base64.b32decode(b'MLO23456'), res_L)
407+
eq(base64.b32decode('MLO23456'), res_L)
408+
eq(base64.b32decode(b'MIO23456'), res_I)
409+
eq(base64.b32decode('MIO23456'), res_I)
410+
self.assertRaises(binascii.Error, base64.b32decode, b'M1023456')
411+
self.assertRaises(binascii.Error, base64.b32decode, b'M1O23456')
412+
self.assertRaises(binascii.Error, base64.b32decode, b'ML023456')
413+
self.assertRaises(binascii.Error, base64.b32decode, b'MI023456')
414+
415+
data = b'M1023456'
416+
data_str = data.decode('ascii')
417+
for map01, res in [(b'L', res_L), (b'I', res_I)]:
402418
map01_str = map01.decode('ascii')
403419

404420
eq(base64.b32decode(data, map01=map01), res)
405421
eq(base64.b32decode(data_str, map01=map01), res)
406422
eq(base64.b32decode(data, map01=map01_str), res)
407423
eq(base64.b32decode(data_str, map01=map01_str), res)
408-
self.assertRaises(binascii.Error, base64.b32decode, data)
409-
self.assertRaises(binascii.Error, base64.b32decode, data_str)
424+
425+
eq(base64.b32decode(b'M1O23456', map01=map01), res)
426+
eq(base64.b32decode(b'M%c023456' % map01, map01=map01), res)
427+
eq(base64.b32decode(b'M%cO23456' % map01, map01=map01), res)
410428

411429
def test_b32decode_error(self):
412430
tests = [b'abc', b'ABCDEF==', b'==ABCDEF']

0 commit comments

Comments
 (0)