@@ -61,8 +61,9 @@ def check_decode(b: bytes, encoded: bool = False) -> None:
6161 else:
6262 enc = b64encode(b)
6363 assert b64decode(enc) == getattr(base64, "b64decode")(enc)
64- enc_str = enc.decode("ascii")
65- assert b64decode(enc_str) == getattr(base64, "b64decode")(enc_str)
64+ if getattr(enc, "isascii")(): # Test stub has no "isascii"
65+ enc_str = enc.decode("ascii")
66+ assert b64decode(enc_str) == getattr(base64, "b64decode")(enc_str)
6667
6768def test_decode_different_strings() -> None:
6869 for i in range(256):
@@ -83,6 +84,10 @@ def test_decode_different_strings() -> None:
8384 for b in b"", b"ab", b"bac", b"1234", b"xyz88", b"abc" * 200:
8485 check_decode(b)
8586
87+ def is_base64_char(x: int) -> bool:
88+ c = chr(x)
89+ return ('a' <= c <= 'z') or ('A' <= c <= 'Z') or ('0' <= c <= '9') or c in '+/='
90+
8691def test_decode_with_non_base64_chars() -> None:
8792 # For stdlib compatibility, non-base64 characters should be ignored.
8893
@@ -98,6 +103,14 @@ def test_decode_with_non_base64_chars() -> None:
98103 check_decode(b"eAa=", encoded=True)
99104 check_decode(b"eAY=", encoded=True)
100105
106+ for x in range(256):
107+ if not is_base64_char(x):
108+ b = bytes([x])
109+ check_decode(b, encoded=True)
110+ check_decode(b"eA==" + b, encoded=True)
111+ check_decode(b"e" + b + b"A==", encoded=True)
112+ check_decode(b"eA=" + b + b"=", encoded=True)
113+
101114def check_decode_error(b: bytes, ignore_stdlib: bool = False) -> None:
102115 if not ignore_stdlib:
103116 with assertRaises(binascii.Error):
0 commit comments