Skip to content

Commit 1be80be

Browse files
[3.13] gh-125346: Add more base64 tests (GH-141061) (GH-141130) (GH-141133)
(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 <storchaka@gmail.com>
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)