Skip to content

Commit fd17ee0

Browse files
[3.14] gh-125346: Add more base64 tests (GH-141061) (GH-141130)
Add more tests for the altchars argument of b64decode() and for the map01 argument of b32decode(). (cherry picked from commit 13360ef)
1 parent 6d5636c commit fd17ee0

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

Lib/test/test_base64.py

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,6 @@ def test_b64decode(self):
208208
self.check_other_types(base64.b64decode, b"YWJj", b"abc")
209209
self.check_decode_type_errors(base64.b64decode)
210210

211-
# Test with arbitrary alternative characters
212-
tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
213-
}
214-
for (data, altchars), res in tests_altchars.items():
215-
data_str = data.decode('ascii')
216-
altchars_str = altchars.decode('ascii')
217-
218-
eq(base64.b64decode(data, altchars=altchars), res)
219-
eq(base64.b64decode(data_str, altchars=altchars), res)
220-
eq(base64.b64decode(data, altchars=altchars_str), res)
221-
eq(base64.b64decode(data_str, altchars=altchars_str), res)
222-
223211
# Test standard alphabet
224212
for data, res in tests.items():
225213
eq(base64.standard_b64decode(data), res)
@@ -240,6 +228,20 @@ def test_b64decode(self):
240228
b'\xd3V\xbeo\xf7\x1d')
241229
self.check_decode_type_errors(base64.urlsafe_b64decode)
242230

231+
def test_b64decode_altchars(self):
232+
# Test with arbitrary alternative characters
233+
eq = self.assertEqual
234+
res = b'\xd3V\xbeo\xf7\x1d'
235+
for altchars in b'*$', b'+/', b'/+', b'+_', b'-+', b'-/', b'/_':
236+
data = b'01a%cb%ccd' % tuple(altchars)
237+
data_str = data.decode('ascii')
238+
altchars_str = altchars.decode('ascii')
239+
240+
eq(base64.b64decode(data, altchars=altchars), res)
241+
eq(base64.b64decode(data_str, altchars=altchars), res)
242+
eq(base64.b64decode(data, altchars=altchars_str), res)
243+
eq(base64.b64decode(data_str, altchars=altchars_str), res)
244+
243245
def test_b64decode_padding_error(self):
244246
self.assertRaises(binascii.Error, base64.b64decode, b'abc')
245247
self.assertRaises(binascii.Error, base64.b64decode, 'abc')
@@ -272,9 +274,12 @@ def test_b64decode_invalid_chars(self):
272274
base64.b64decode(bstr.decode('ascii'), validate=True)
273275

274276
# Normal alphabet characters not discarded when alternative given
275-
res = b'\xFB\xEF\xBE\xFF\xFF\xFF'
276-
self.assertEqual(base64.b64decode(b'++[[//]]', b'[]'), res)
277-
self.assertEqual(base64.urlsafe_b64decode(b'++--//__'), res)
277+
res = b'\xfb\xef\xff'
278+
self.assertEqual(base64.b64decode(b'++//', validate=True), res)
279+
self.assertEqual(base64.b64decode(b'++//', '-_', validate=True), res)
280+
self.assertEqual(base64.b64decode(b'--__', '-_', validate=True), res)
281+
self.assertEqual(base64.urlsafe_b64decode(b'++//'), res)
282+
self.assertEqual(base64.urlsafe_b64decode(b'--__'), res)
278283

279284
def test_b32encode(self):
280285
eq = self.assertEqual
@@ -329,23 +334,33 @@ def test_b32decode_casefold(self):
329334
self.assertRaises(binascii.Error, base64.b32decode, b'me======')
330335
self.assertRaises(binascii.Error, base64.b32decode, 'me======')
331336

337+
def test_b32decode_map01(self):
332338
# Mapping zero and one
333-
eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
334-
eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
335-
336-
map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
337-
(b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
338-
}
339-
for (data, map01), res in map_tests.items():
340-
data_str = data.decode('ascii')
339+
eq = self.assertEqual
340+
res_L = b'b\xdd\xad\xf3\xbe'
341+
res_I = b'b\x1d\xad\xf3\xbe'
342+
eq(base64.b32decode(b'MLO23456'), res_L)
343+
eq(base64.b32decode('MLO23456'), res_L)
344+
eq(base64.b32decode(b'MIO23456'), res_I)
345+
eq(base64.b32decode('MIO23456'), res_I)
346+
self.assertRaises(binascii.Error, base64.b32decode, b'M1023456')
347+
self.assertRaises(binascii.Error, base64.b32decode, b'M1O23456')
348+
self.assertRaises(binascii.Error, base64.b32decode, b'ML023456')
349+
self.assertRaises(binascii.Error, base64.b32decode, b'MI023456')
350+
351+
data = b'M1023456'
352+
data_str = data.decode('ascii')
353+
for map01, res in [(b'L', res_L), (b'I', res_I)]:
341354
map01_str = map01.decode('ascii')
342355

343356
eq(base64.b32decode(data, map01=map01), res)
344357
eq(base64.b32decode(data_str, map01=map01), res)
345358
eq(base64.b32decode(data, map01=map01_str), res)
346359
eq(base64.b32decode(data_str, map01=map01_str), res)
347-
self.assertRaises(binascii.Error, base64.b32decode, data)
348-
self.assertRaises(binascii.Error, base64.b32decode, data_str)
360+
361+
eq(base64.b32decode(b'M1O23456', map01=map01), res)
362+
eq(base64.b32decode(b'M%c023456' % map01, map01=map01), res)
363+
eq(base64.b32decode(b'M%cO23456' % map01, map01=map01), res)
349364

350365
def test_b32decode_error(self):
351366
tests = [b'abc', b'ABCDEF==', b'==ABCDEF']

0 commit comments

Comments
 (0)