@@ -102,44 +102,53 @@ def test_b64encode(self):
102102
103103 def test_b64decode (self ):
104104 eq = self .assertEqual
105- eq (base64 .b64decode (b"d3d3LnB5dGhvbi5vcmc=" ), b"www.python.org" )
106- eq (base64 .b64decode (b'AA==' ), b'\x00 ' )
107- eq (base64 .b64decode (b"YQ==" ), b"a" )
108- eq (base64 .b64decode (b"YWI=" ), b"ab" )
109- eq (base64 .b64decode (b"YWJj" ), b"abc" )
110- eq (base64 .b64decode (b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
111- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\n NT"
112- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==" ),
113- b"abcdefghijklmnopqrstuvwxyz"
114- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
115- b"0123456789!@#0^&*();:<>,. []{}" )
116- eq (base64 .b64decode (b'' ), b'' )
105+
106+ tests = {b"d3d3LnB5dGhvbi5vcmc=" : b"www.python.org" ,
107+ b'AA==' : b'\x00 ' ,
108+ b"YQ==" : b"a" ,
109+ b"YWI=" : b"ab" ,
110+ b"YWJj" : b"abc" ,
111+ b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
112+ b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\n NT"
113+ b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==" :
114+
115+ b"abcdefghijklmnopqrstuvwxyz"
116+ b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
117+ b"0123456789!@#0^&*();:<>,. []{}" ,
118+ b'' : b'' ,
119+ }
120+ for data , res in tests .items ():
121+ eq (base64 .b64decode (data ), res )
122+ eq (base64 .b64decode (data .decode ('ascii' )), res )
123+
117124 # Test with arbitrary alternative characters
118- eq (base64 .b64decode (b'01a*b$cd' , altchars = b'*$' ), b'\xd3 V\xbe o\xf7 \x1d ' )
119- # Check if passing a str object raises an error
120- self .assertRaises (TypeError , base64 .b64decode , "" )
121- self .assertRaises (TypeError , base64 .b64decode , b"" , altchars = "" )
125+ tests_altchars = {(b'01a*b$cd' , b'*$' ): b'\xd3 V\xbe o\xf7 \x1d ' ,
126+ }
127+ for (data , altchars ), res in tests_altchars .items ():
128+ data_str = data .decode ('ascii' )
129+ altchars_str = altchars .decode ('ascii' )
130+
131+ eq (base64 .b64decode (data , altchars = altchars ), res )
132+ eq (base64 .b64decode (data_str , altchars = altchars ), res )
133+ eq (base64 .b64decode (data , altchars = altchars_str ), res )
134+ eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
135+
122136 # Test standard alphabet
123- eq (base64 .standard_b64decode (b"d3d3LnB5dGhvbi5vcmc=" ), b"www.python.org" )
124- eq (base64 .standard_b64decode (b"YQ==" ), b"a" )
125- eq (base64 .standard_b64decode (b"YWI=" ), b"ab" )
126- eq (base64 .standard_b64decode (b"YWJj" ), b"abc" )
127- eq (base64 .standard_b64decode (b"" ), b"" )
128- eq (base64 .standard_b64decode (b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
129- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
130- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==" ),
131- b"abcdefghijklmnopqrstuvwxyz"
132- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
133- b"0123456789!@#0^&*();:<>,. []{}" )
134- # Check if passing a str object raises an error
135- self .assertRaises (TypeError , base64 .standard_b64decode , "" )
136- self .assertRaises (TypeError , base64 .standard_b64decode , b"" , altchars = "" )
137+ for data , res in tests .items ():
138+ eq (base64 .standard_b64decode (data ), res )
139+ eq (base64 .standard_b64decode (data .decode ('ascii' )), res )
140+
137141 # Test with 'URL safe' alternative characters
138- eq (base64 .urlsafe_b64decode (b'01a-b_cd' ), b'\xd3 V\xbe o\xf7 \x1d ' )
139- self .assertRaises (TypeError , base64 .urlsafe_b64decode , "" )
142+ tests_urlsafe = {b'01a-b_cd' : b'\xd3 V\xbe o\xf7 \x1d ' ,
143+ b'' : b'' ,
144+ }
145+ for data , res in tests_urlsafe .items ():
146+ eq (base64 .urlsafe_b64decode (data ), res )
147+ eq (base64 .urlsafe_b64decode (data .decode ('ascii' )), res )
140148
141149 def test_b64decode_padding_error (self ):
142150 self .assertRaises (binascii .Error , base64 .b64decode , b'abc' )
151+ self .assertRaises (binascii .Error , base64 .b64decode , 'abc' )
143152
144153 def test_b64decode_invalid_chars (self ):
145154 # issue 1466065: Test some invalid characters.
@@ -154,8 +163,10 @@ def test_b64decode_invalid_chars(self):
154163 (b'YWJj\n YWI=' , b'abcab' ))
155164 for bstr , res in tests :
156165 self .assertEqual (base64 .b64decode (bstr ), res )
166+ self .assertEqual (base64 .b64decode (bstr .decode ('ascii' )), res )
157167 with self .assertRaises (binascii .Error ):
158168 base64 .b64decode (bstr , validate = True )
169+ base64 .b64decode (bstr .decode ('ascii' ), validate = True )
159170
160171 def test_b32encode (self ):
161172 eq = self .assertEqual
@@ -170,40 +181,62 @@ def test_b32encode(self):
170181
171182 def test_b32decode (self ):
172183 eq = self .assertEqual
173- eq (base64 .b32decode (b'' ), b'' )
174- eq (base64 .b32decode (b'AA======' ), b'\x00 ' )
175- eq (base64 .b32decode (b'ME======' ), b'a' )
176- eq (base64 .b32decode (b'MFRA====' ), b'ab' )
177- eq (base64 .b32decode (b'MFRGG===' ), b'abc' )
178- eq (base64 .b32decode (b'MFRGGZA=' ), b'abcd' )
179- eq (base64 .b32decode (b'MFRGGZDF' ), b'abcde' )
180- self .assertRaises (TypeError , base64 .b32decode , "" )
184+ tests = {b'' : b'' ,
185+ b'AA======' : b'\x00 ' ,
186+ b'ME======' : b'a' ,
187+ b'MFRA====' : b'ab' ,
188+ b'MFRGG===' : b'abc' ,
189+ b'MFRGGZA=' : b'abcd' ,
190+ b'MFRGGZDF' : b'abcde' ,
191+ }
192+ for data , res in tests .items ():
193+ eq (base64 .b32decode (data ), res )
194+ eq (base64 .b32decode (data .decode ('ascii' )), res )
181195
182196 def test_b32decode_casefold (self ):
183197 eq = self .assertEqual
184- eq (base64 .b32decode (b'' , True ), b'' )
185- eq (base64 .b32decode (b'ME======' , True ), b'a' )
186- eq (base64 .b32decode (b'MFRA====' , True ), b'ab' )
187- eq (base64 .b32decode (b'MFRGG===' , True ), b'abc' )
188- eq (base64 .b32decode (b'MFRGGZA=' , True ), b'abcd' )
189- eq (base64 .b32decode (b'MFRGGZDF' , True ), b'abcde' )
190- # Lower cases
191- eq (base64 .b32decode (b'me======' , True ), b'a' )
192- eq (base64 .b32decode (b'mfra====' , True ), b'ab' )
193- eq (base64 .b32decode (b'mfrgg===' , True ), b'abc' )
194- eq (base64 .b32decode (b'mfrggza=' , True ), b'abcd' )
195- eq (base64 .b32decode (b'mfrggzdf' , True ), b'abcde' )
196- # Expected exceptions
198+ tests = {b'' : b'' ,
199+ b'ME======' : b'a' ,
200+ b'MFRA====' : b'ab' ,
201+ b'MFRGG===' : b'abc' ,
202+ b'MFRGGZA=' : b'abcd' ,
203+ b'MFRGGZDF' : b'abcde' ,
204+ # Lower cases
205+ b'me======' : b'a' ,
206+ b'mfra====' : b'ab' ,
207+ b'mfrgg===' : b'abc' ,
208+ b'mfrggza=' : b'abcd' ,
209+ b'mfrggzdf' : b'abcde' ,
210+ }
211+
212+ for data , res in tests .items ():
213+ eq (base64 .b32decode (data , True ), res )
214+ eq (base64 .b32decode (data .decode ('ascii' ), True ), res )
215+
197216 self .assertRaises (TypeError , base64 .b32decode , b'me======' )
217+ self .assertRaises (TypeError , base64 .b32decode , 'me======' )
218+
198219 # Mapping zero and one
199220 eq (base64 .b32decode (b'MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
200- eq (base64 .b32decode (b'M1023456' , map01 = b'L' ), b'b\xdd \xad \xf3 \xbe ' )
201- eq (base64 .b32decode (b'M1023456' , map01 = b'I' ), b'b\x1d \xad \xf3 \xbe ' )
202- self .assertRaises (TypeError , base64 .b32decode , b"" , map01 = "" )
221+ eq (base64 .b32decode ('MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
222+
223+ map_tests = {(b'M1023456' , b'L' ): b'b\xdd \xad \xf3 \xbe ' ,
224+ (b'M1023456' , b'I' ): b'b\x1d \xad \xf3 \xbe ' ,
225+ }
226+ for (data , map01 ), res in map_tests .items ():
227+ data_str = data .decode ('ascii' )
228+ map01_str = map01 .decode ('ascii' )
229+
230+ eq (base64 .b32decode (data , map01 = map01 ), res )
231+ eq (base64 .b32decode (data_str , map01 = map01 ), res )
232+ eq (base64 .b32decode (data , map01 = map01_str ), res )
233+ eq (base64 .b32decode (data_str , map01 = map01_str ), res )
203234
204235 def test_b32decode_error (self ):
205- self .assertRaises (binascii .Error , base64 .b32decode , b'abc' )
206- self .assertRaises (binascii .Error , base64 .b32decode , b'ABCDEF==' )
236+ for data in [b'abc' , b'ABCDEF==' ]:
237+ with self .assertRaises (binascii .Error ):
238+ base64 .b32decode (data )
239+ base64 .b32decode (data .decode ('ascii' ))
207240
208241 def test_b16encode (self ):
209242 eq = self .assertEqual
@@ -214,12 +247,24 @@ def test_b16encode(self):
214247 def test_b16decode (self ):
215248 eq = self .assertEqual
216249 eq (base64 .b16decode (b'0102ABCDEF' ), b'\x01 \x02 \xab \xcd \xef ' )
250+ eq (base64 .b16decode ('0102ABCDEF' ), b'\x01 \x02 \xab \xcd \xef ' )
217251 eq (base64 .b16decode (b'00' ), b'\x00 ' )
252+ eq (base64 .b16decode ('00' ), b'\x00 ' )
218253 # Lower case is not allowed without a flag
219254 self .assertRaises (binascii .Error , base64 .b16decode , b'0102abcdef' )
255+ self .assertRaises (binascii .Error , base64 .b16decode , '0102abcdef' )
220256 # Case fold
221257 eq (base64 .b16decode (b'0102abcdef' , True ), b'\x01 \x02 \xab \xcd \xef ' )
222- self .assertRaises (TypeError , base64 .b16decode , "" )
258+ eq (base64 .b16decode ('0102abcdef' , True ), b'\x01 \x02 \xab \xcd \xef ' )
259+
260+ def test_decode_nonascii_str (self ):
261+ decode_funcs = (base64 .b64decode ,
262+ base64 .standard_b64decode ,
263+ base64 .urlsafe_b64decode ,
264+ base64 .b32decode ,
265+ base64 .b16decode )
266+ for f in decode_funcs :
267+ self .assertRaises (ValueError , f , 'with non-ascii \xcb ' )
223268
224269 def test_ErrorHeritage (self ):
225270 self .assertTrue (issubclass (binascii .Error , ValueError ))
0 commit comments