Skip to content

Commit 1be80be

Browse files
(cherry picked from commit fd17ee0) Add more tests for the altchars argument of b64decode() and for the map01 argument of b32decode(). (cherry picked from commit 13360ef) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 89cb8aa commit 1be80be

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
@@ -200,18 +200,6 @@ def test_b64decode(self):
200200
self.check_other_types(base64.b64decode, b"YWJj", b"abc")
201201
self.check_decode_type_errors(base64.b64decode)
202202

203-
# Test with arbitrary alternative characters
204-
tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
205-
}
206-
for (data, altchars), res in tests_altchars.items():
207-
data_str = data.decode('ascii')
208-
altchars_str = altchars.decode('ascii')
209-
210-
eq(base64.b64decode(data, altchars=altchars), res)
211-
eq(base64.b64decode(data_str, altchars=altchars), res)
212-
eq(base64.b64decode(data, altchars=altchars_str), res)
213-
eq(base64.b64decode(data_str, altchars=altchars_str), res)
214-
215203
# Test standard alphabet
216204
for data, res in tests.items():
217205
eq(base64.standard_b64decode(data), res)
@@ -232,6 +220,20 @@ def test_b64decode(self):
232220
b'\xd3V\xbeo\xf7\x1d')
233221
self.check_decode_type_errors(base64.urlsafe_b64decode)
234222

223+
def test_b64decode_altchars(self):
224+
# Test with arbitrary alternative characters
225+
eq = self.assertEqual
226+
res = b'\xd3V\xbeo\xf7\x1d'
227+
for altchars in b'*$', b'+/', b'/+', b'+_', b'-+', b'-/', b'/_':
228+
data = b'01a%cb%ccd' % tuple(altchars)
229+
data_str = data.decode('ascii')
230+
altchars_str = altchars.decode('ascii')
231+
232+
eq(base64.b64decode(data, altchars=altchars), res)
233+
eq(base64.b64decode(data_str, altchars=altchars), res)
234+
eq(base64.b64decode(data, altchars=altchars_str), res)
235+
eq(base64.b64decode(data_str, altchars=altchars_str), res)
236+
235237
def test_b64decode_padding_error(self):
236238
self.assertRaises(binascii.Error, base64.b64decode, b'abc')
237239
self.assertRaises(binascii.Error, base64.b64decode, 'abc')
@@ -264,9 +266,12 @@ def test_b64decode_invalid_chars(self):
264266
base64.b64decode(bstr.decode('ascii'), validate=True)
265267

266268
# Normal alphabet characters not discarded when alternative given
267-
res = b'\xFB\xEF\xBE\xFF\xFF\xFF'
268-
self.assertEqual(base64.b64decode(b'++[[//]]', b'[]'), res)
269-
self.assertEqual(base64.urlsafe_b64decode(b'++--//__'), res)
269+
res = b'\xfb\xef\xff'
270+
self.assertEqual(base64.b64decode(b'++//', validate=True), res)
271+
self.assertEqual(base64.b64decode(b'++//', '-_', validate=True), res)
272+
self.assertEqual(base64.b64decode(b'--__', '-_', validate=True), res)
273+
self.assertEqual(base64.urlsafe_b64decode(b'++//'), res)
274+
self.assertEqual(base64.urlsafe_b64decode(b'--__'), res)
270275

271276
def test_b32encode(self):
272277
eq = self.assertEqual
@@ -321,23 +326,33 @@ def test_b32decode_casefold(self):
321326
self.assertRaises(binascii.Error, base64.b32decode, b'me======')
322327
self.assertRaises(binascii.Error, base64.b32decode, 'me======')
323328

329+
def test_b32decode_map01(self):
324330
# Mapping zero and one
325-
eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
326-
eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
327-
328-
map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
329-
(b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
330-
}
331-
for (data, map01), res in map_tests.items():
332-
data_str = data.decode('ascii')
331+
eq = self.assertEqual
332+
res_L = b'b\xdd\xad\xf3\xbe'
333+
res_I = b'b\x1d\xad\xf3\xbe'
334+
eq(base64.b32decode(b'MLO23456'), res_L)
335+
eq(base64.b32decode('MLO23456'), res_L)
336+
eq(base64.b32decode(b'MIO23456'), res_I)
337+
eq(base64.b32decode('MIO23456'), res_I)
338+
self.assertRaises(binascii.Error, base64.b32decode, b'M1023456')
339+
self.assertRaises(binascii.Error, base64.b32decode, b'M1O23456')
340+
self.assertRaises(binascii.Error, base64.b32decode, b'ML023456')
341+
self.assertRaises(binascii.Error, base64.b32decode, b'MI023456')
342+
343+
data = b'M1023456'
344+
data_str = data.decode('ascii')
345+
for map01, res in [(b'L', res_L), (b'I', res_I)]:
333346
map01_str = map01.decode('ascii')
334347

335348
eq(base64.b32decode(data, map01=map01), res)
336349
eq(base64.b32decode(data_str, map01=map01), res)
337350
eq(base64.b32decode(data, map01=map01_str), res)
338351
eq(base64.b32decode(data_str, map01=map01_str), res)
339-
self.assertRaises(binascii.Error, base64.b32decode, data)
340-
self.assertRaises(binascii.Error, base64.b32decode, data_str)
352+
353+
eq(base64.b32decode(b'M1O23456', map01=map01), res)
354+
eq(base64.b32decode(b'M%c023456' % map01, map01=map01), res)
355+
eq(base64.b32decode(b'M%cO23456' % map01, map01=map01), res)
341356

342357
def test_b32decode_error(self):
343358
tests = [b'abc', b'ABCDEF==', b'==ABCDEF']

0 commit comments

Comments
 (0)