Skip to content

Commit 4072e3b

Browse files
committed
Add Z85 tests to binascii
1 parent ce4773c commit 4072e3b

File tree

1 file changed

+101
-4
lines changed

1 file changed

+101
-4
lines changed

Lib/test/test_binascii.py

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -531,12 +531,109 @@ def test_base85_newline(self):
531531
self.assertEqual(binascii.b2a_base85(b, newline=True), b"bTe}aAO\n")
532532
self.assertEqual(binascii.b2a_base85(b, newline=False), b"bTe}aAO")
533533

534-
def test_base85_z85(self):
535-
# Test base85 z85 parameter
534+
def test_base85_z85_valid(self):
535+
# Test base85 (Z85 alphabet) with valid data
536+
lines, i = [], 0
537+
for k in range(1, len(self.rawdata) + 1):
538+
b = self.type2test(self.rawdata[i:i + k])
539+
a = binascii.b2a_base85(b, z85=True)
540+
lines.append(a)
541+
i += k
542+
if i >= len(self.rawdata):
543+
break
544+
res = bytes()
545+
for line in lines:
546+
a = self.type2test(line)
547+
b = binascii.a2b_base85(a, z85=True)
548+
res += b
549+
self.assertEqual(res, self.rawdata)
550+
551+
# Test decoding inputs with length 1 mod 5
552+
self.assertEqual(binascii.a2b_base85(self.type2test(b"a"), z85=True), b"")
553+
self.assertEqual(binascii.a2b_base85(self.type2test(b" b "), z85=True), b"")
554+
self.assertEqual(binascii.a2b_base85(self.type2test(b"B y,/;J_n\\c"), z85=True), b"test")
555+
556+
def test_base85_z85_invalid(self):
557+
# Test base85 (Z85 alphabet) with invalid characters interleaved
558+
lines, i = [], 0
559+
for k in range(1, len(self.rawdata) + 1):
560+
b = self.type2test(self.rawdata[i:i + k])
561+
a = binascii.b2a_base85(b, z85=True)
562+
lines.append(a)
563+
i += k
564+
if i >= len(self.rawdata):
565+
break
566+
567+
fillers = bytearray()
568+
valid = b"0123456789abcdefghijklmnopqrstuvwxyz" \
569+
b"ABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"
570+
for i in range(256):
571+
if i not in valid:
572+
fillers.append(i)
573+
def addnoise(line):
574+
res = bytearray()
575+
for i in range(len(line)):
576+
res.append(line[i])
577+
for j in range(i, len(fillers), len(line)):
578+
res.append(fillers[j])
579+
return res
580+
res = bytearray()
581+
for line in map(addnoise, lines):
582+
a = self.type2test(line)
583+
b = binascii.a2b_base85(a, z85=True)
584+
res += b
585+
self.assertEqual(res, self.rawdata)
586+
587+
def test_base85_z85_errors(self):
588+
def _assertRegexTemplate(assert_regex, data, **kwargs):
589+
with self.assertRaisesRegex(binascii.Error, assert_regex):
590+
binascii.a2b_base85(self.type2test(data), z85=True, **kwargs)
591+
592+
def assertOverflow(data):
593+
_assertRegexTemplate(r"(?i)z85 overflow", data)
594+
595+
# Test base85 (Z85 alphabet) with out-of-range encoded value
596+
assertOverflow(b"%")
597+
assertOverflow(b"%n")
598+
assertOverflow(b"%nS")
599+
assertOverflow(b"%nSc")
600+
assertOverflow(b"%nSc1")
601+
assertOverflow(b"%nSc0$")
602+
assertOverflow(b"%nSc0%nSc0%nSD0")
603+
604+
def test_base85_z85_pad(self):
605+
# Test base85 (Z85 alphabet) with encode padding
606+
rawdata = b"n1n3Tee\n ch@rAc\te\r$"
607+
for i in range(1, len(rawdata) + 1):
608+
padding = -i % 4
609+
b = rawdata[:i]
610+
a_pad = binascii.b2a_base85(self.type2test(b), pad=True, z85=True)
611+
b_pad = binascii.a2b_base85(self.type2test(a_pad), z85=True)
612+
b_pad_expected = b + b"\0" * padding
613+
self.assertEqual(b_pad, b_pad_expected)
614+
615+
def test_base85_z85_strict_mode(self):
616+
# Test base85 (Z85 alphabet) with strict mode on
617+
def assertNonZ85Data(data, expected):
618+
data = self.type2test(data)
619+
with self.assertRaisesRegex(binascii.Error, r"(?i)bad z85 character"):
620+
binascii.a2b_base85(data, strict_mode=True, z85=True)
621+
default_res = binascii.a2b_base85(data, z85=True)
622+
non_strict_res = binascii.a2b_base85(data, strict_mode=False, z85=True)
623+
self.assertEqual(default_res, non_strict_res)
624+
self.assertEqual(non_strict_res, expected)
625+
626+
assertNonZ85Data(b"\xda", b"")
627+
assertNonZ85Data(b"00\0\0", b"\0")
628+
assertNonZ85Data(b"z !/", b"ok")
629+
assertNonZ85Data(b"By/JnB0hYQ\n", b"tests!!~")
630+
631+
def test_base85_z85_newline(self):
632+
# Test base85 (Z85 alphabet) newline parameter
536633
b = self.type2test(b"t3s\t ")
537-
a = self.type2test(b"BtE$Aao\n")
538634
self.assertEqual(binascii.b2a_base85(b, z85=True), b"BtE$Aao\n")
539-
self.assertEqual(binascii.a2b_base85(a, z85=True), b"t3s\t ")
635+
self.assertEqual(binascii.b2a_base85(b, newline=True, z85=True), b"BtE$Aao\n")
636+
self.assertEqual(binascii.b2a_base85(b, newline=False, z85=True), b"BtE$Aao")
540637

541638
def test_uu(self):
542639
MAX_UU = 45

0 commit comments

Comments
 (0)