@@ -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\t e\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