1N/ABEGIN {
1N/A if ($ENV{'PERL_CORE'}){
1N/A chdir 't' if -d 't';
1N/A @INC = '../lib';
1N/A }
1N/A}
1N/A
1N/Ause strict;
1N/Ause MIME::Base64;
1N/A
1N/Aprint "1..283\n";
1N/A
1N/Aprint "# Testing MIME::Base64-", $MIME::Base64::VERSION, "\n";
1N/A
1N/ABEGIN {
1N/A if (ord('A') == 0x41) {
1N/A *ASCII = sub { return $_[0] };
1N/A }
1N/A else {
1N/A require Encode;
1N/A *ASCII = sub { Encode::encode('ascii',$_[0]) };
1N/A }
1N/A}
1N/A
1N/Amy $testno = 1;
1N/A# instead of "for my $test (...)" , which is my preference.
1N/A# Not sure which perl version has started supporting. MIME::Base64
1N/A# was supposed to work with very old perl5, right?
1N/Amy $test;
1N/A
1N/AencodeTest();
1N/AdecodeTest();
1N/A
1N/A# This used to generate a warning
1N/Aprint "not " unless decode_base64(encode_base64("foo")) eq "foo";
1N/Aprint "ok ", $testno++, "\n";
1N/A
1N/Asub encodeTest
1N/A{
1N/A print "# encode test\n";
1N/A
1N/A my @encode_tests = (
1N/A # All values
1N/A ["\000" => "AA=="],
1N/A ["\001" => "AQ=="],
1N/A ["\002" => "Ag=="],
1N/A ["\003" => "Aw=="],
1N/A ["\004" => "BA=="],
1N/A ["\005" => "BQ=="],
1N/A ["\006" => "Bg=="],
1N/A ["\007" => "Bw=="],
1N/A ["\010" => "CA=="],
1N/A ["\011" => "CQ=="],
1N/A ["\012" => "Cg=="],
1N/A ["\013" => "Cw=="],
1N/A ["\014" => "DA=="],
1N/A ["\015" => "DQ=="],
1N/A ["\016" => "Dg=="],
1N/A ["\017" => "Dw=="],
1N/A ["\020" => "EA=="],
1N/A ["\021" => "EQ=="],
1N/A ["\022" => "Eg=="],
1N/A ["\023" => "Ew=="],
1N/A ["\024" => "FA=="],
1N/A ["\025" => "FQ=="],
1N/A ["\026" => "Fg=="],
1N/A ["\027" => "Fw=="],
1N/A ["\030" => "GA=="],
1N/A ["\031" => "GQ=="],
1N/A ["\032" => "Gg=="],
1N/A ["\033" => "Gw=="],
1N/A ["\034" => "HA=="],
1N/A ["\035" => "HQ=="],
1N/A ["\036" => "Hg=="],
1N/A ["\037" => "Hw=="],
1N/A ["\040" => "IA=="],
1N/A ["\041" => "IQ=="],
1N/A ["\042" => "Ig=="],
1N/A ["\043" => "Iw=="],
1N/A ["\044" => "JA=="],
1N/A ["\045" => "JQ=="],
1N/A ["\046" => "Jg=="],
1N/A ["\047" => "Jw=="],
1N/A ["\050" => "KA=="],
1N/A ["\051" => "KQ=="],
1N/A ["\052" => "Kg=="],
1N/A ["\053" => "Kw=="],
1N/A ["\054" => "LA=="],
1N/A ["\055" => "LQ=="],
1N/A ["\056" => "Lg=="],
1N/A ["\057" => "Lw=="],
1N/A ["\060" => "MA=="],
1N/A ["\061" => "MQ=="],
1N/A ["\062" => "Mg=="],
1N/A ["\063" => "Mw=="],
1N/A ["\064" => "NA=="],
1N/A ["\065" => "NQ=="],
1N/A ["\066" => "Ng=="],
1N/A ["\067" => "Nw=="],
1N/A ["\070" => "OA=="],
1N/A ["\071" => "OQ=="],
1N/A ["\072" => "Og=="],
1N/A ["\073" => "Ow=="],
1N/A ["\074" => "PA=="],
1N/A ["\075" => "PQ=="],
1N/A ["\076" => "Pg=="],
1N/A ["\077" => "Pw=="],
1N/A ["\100" => "QA=="],
1N/A ["\101" => "QQ=="],
1N/A ["\102" => "Qg=="],
1N/A ["\103" => "Qw=="],
1N/A ["\104" => "RA=="],
1N/A ["\105" => "RQ=="],
1N/A ["\106" => "Rg=="],
1N/A ["\107" => "Rw=="],
1N/A ["\110" => "SA=="],
1N/A ["\111" => "SQ=="],
1N/A ["\112" => "Sg=="],
1N/A ["\113" => "Sw=="],
1N/A ["\114" => "TA=="],
1N/A ["\115" => "TQ=="],
1N/A ["\116" => "Tg=="],
1N/A ["\117" => "Tw=="],
1N/A ["\120" => "UA=="],
1N/A ["\121" => "UQ=="],
1N/A ["\122" => "Ug=="],
1N/A ["\123" => "Uw=="],
1N/A ["\124" => "VA=="],
1N/A ["\125" => "VQ=="],
1N/A ["\126" => "Vg=="],
1N/A ["\127" => "Vw=="],
1N/A ["\130" => "WA=="],
1N/A ["\131" => "WQ=="],
1N/A ["\132" => "Wg=="],
1N/A ["\133" => "Ww=="],
1N/A ["\134" => "XA=="],
1N/A ["\135" => "XQ=="],
1N/A ["\136" => "Xg=="],
1N/A ["\137" => "Xw=="],
1N/A ["\140" => "YA=="],
1N/A ["\141" => "YQ=="],
1N/A ["\142" => "Yg=="],
1N/A ["\143" => "Yw=="],
1N/A ["\144" => "ZA=="],
1N/A ["\145" => "ZQ=="],
1N/A ["\146" => "Zg=="],
1N/A ["\147" => "Zw=="],
1N/A ["\150" => "aA=="],
1N/A ["\151" => "aQ=="],
1N/A ["\152" => "ag=="],
1N/A ["\153" => "aw=="],
1N/A ["\154" => "bA=="],
1N/A ["\155" => "bQ=="],
1N/A ["\156" => "bg=="],
1N/A ["\157" => "bw=="],
1N/A ["\160" => "cA=="],
1N/A ["\161" => "cQ=="],
1N/A ["\162" => "cg=="],
1N/A ["\163" => "cw=="],
1N/A ["\164" => "dA=="],
1N/A ["\165" => "dQ=="],
1N/A ["\166" => "dg=="],
1N/A ["\167" => "dw=="],
1N/A ["\170" => "eA=="],
1N/A ["\171" => "eQ=="],
1N/A ["\172" => "eg=="],
1N/A ["\173" => "ew=="],
1N/A ["\174" => "fA=="],
1N/A ["\175" => "fQ=="],
1N/A ["\176" => "fg=="],
1N/A ["\177" => "fw=="],
1N/A ["\200" => "gA=="],
1N/A ["\201" => "gQ=="],
1N/A ["\202" => "gg=="],
1N/A ["\203" => "gw=="],
1N/A ["\204" => "hA=="],
1N/A ["\205" => "hQ=="],
1N/A ["\206" => "hg=="],
1N/A ["\207" => "hw=="],
1N/A ["\210" => "iA=="],
1N/A ["\211" => "iQ=="],
1N/A ["\212" => "ig=="],
1N/A ["\213" => "iw=="],
1N/A ["\214" => "jA=="],
1N/A ["\215" => "jQ=="],
1N/A ["\216" => "jg=="],
1N/A ["\217" => "jw=="],
1N/A ["\220" => "kA=="],
1N/A ["\221" => "kQ=="],
1N/A ["\222" => "kg=="],
1N/A ["\223" => "kw=="],
1N/A ["\224" => "lA=="],
1N/A ["\225" => "lQ=="],
1N/A ["\226" => "lg=="],
1N/A ["\227" => "lw=="],
1N/A ["\230" => "mA=="],
1N/A ["\231" => "mQ=="],
1N/A ["\232" => "mg=="],
1N/A ["\233" => "mw=="],
1N/A ["\234" => "nA=="],
1N/A ["\235" => "nQ=="],
1N/A ["\236" => "ng=="],
1N/A ["\237" => "nw=="],
1N/A ["\240" => "oA=="],
1N/A ["\241" => "oQ=="],
1N/A ["\242" => "og=="],
1N/A ["\243" => "ow=="],
1N/A ["\244" => "pA=="],
1N/A ["\245" => "pQ=="],
1N/A ["\246" => "pg=="],
1N/A ["\247" => "pw=="],
1N/A ["\250" => "qA=="],
1N/A ["\251" => "qQ=="],
1N/A ["\252" => "qg=="],
1N/A ["\253" => "qw=="],
1N/A ["\254" => "rA=="],
1N/A ["\255" => "rQ=="],
1N/A ["\256" => "rg=="],
1N/A ["\257" => "rw=="],
1N/A ["\260" => "sA=="],
1N/A ["\261" => "sQ=="],
1N/A ["\262" => "sg=="],
1N/A ["\263" => "sw=="],
1N/A ["\264" => "tA=="],
1N/A ["\265" => "tQ=="],
1N/A ["\266" => "tg=="],
1N/A ["\267" => "tw=="],
1N/A ["\270" => "uA=="],
1N/A ["\271" => "uQ=="],
1N/A ["\272" => "ug=="],
1N/A ["\273" => "uw=="],
1N/A ["\274" => "vA=="],
1N/A ["\275" => "vQ=="],
1N/A ["\276" => "vg=="],
1N/A ["\277" => "vw=="],
1N/A ["\300" => "wA=="],
1N/A ["\301" => "wQ=="],
1N/A ["\302" => "wg=="],
1N/A ["\303" => "ww=="],
1N/A ["\304" => "xA=="],
1N/A ["\305" => "xQ=="],
1N/A ["\306" => "xg=="],
1N/A ["\307" => "xw=="],
1N/A ["\310" => "yA=="],
1N/A ["\311" => "yQ=="],
1N/A ["\312" => "yg=="],
1N/A ["\313" => "yw=="],
1N/A ["\314" => "zA=="],
1N/A ["\315" => "zQ=="],
1N/A ["\316" => "zg=="],
1N/A ["\317" => "zw=="],
1N/A ["\320" => "0A=="],
1N/A ["\321" => "0Q=="],
1N/A ["\322" => "0g=="],
1N/A ["\323" => "0w=="],
1N/A ["\324" => "1A=="],
1N/A ["\325" => "1Q=="],
1N/A ["\326" => "1g=="],
1N/A ["\327" => "1w=="],
1N/A ["\330" => "2A=="],
1N/A ["\331" => "2Q=="],
1N/A ["\332" => "2g=="],
1N/A ["\333" => "2w=="],
1N/A ["\334" => "3A=="],
1N/A ["\335" => "3Q=="],
1N/A ["\336" => "3g=="],
1N/A ["\337" => "3w=="],
1N/A ["\340" => "4A=="],
1N/A ["\341" => "4Q=="],
1N/A ["\342" => "4g=="],
1N/A ["\343" => "4w=="],
1N/A ["\344" => "5A=="],
1N/A ["\345" => "5Q=="],
1N/A ["\346" => "5g=="],
1N/A ["\347" => "5w=="],
1N/A ["\350" => "6A=="],
1N/A ["\351" => "6Q=="],
1N/A ["\352" => "6g=="],
1N/A ["\353" => "6w=="],
1N/A ["\354" => "7A=="],
1N/A ["\355" => "7Q=="],
1N/A ["\356" => "7g=="],
1N/A ["\357" => "7w=="],
1N/A ["\360" => "8A=="],
1N/A ["\361" => "8Q=="],
1N/A ["\362" => "8g=="],
1N/A ["\363" => "8w=="],
1N/A ["\364" => "9A=="],
1N/A ["\365" => "9Q=="],
1N/A ["\366" => "9g=="],
1N/A ["\367" => "9w=="],
1N/A ["\370" => "+A=="],
1N/A ["\371" => "+Q=="],
1N/A ["\372" => "+g=="],
1N/A ["\373" => "+w=="],
1N/A ["\374" => "/A=="],
1N/A ["\375" => "/Q=="],
1N/A ["\376" => "/g=="],
1N/A ["\377" => "/w=="],
1N/A
1N/A ["\000\377" => "AP8="],
1N/A ["\377\000" => "/wA="],
1N/A ["\000\000\000" => "AAAA"],
1N/A
1N/A ['' => ''],
1N/A [ASCII('a') => 'YQ=='],
1N/A [ASCII('aa') => 'YWE='],
1N/A [ASCII('aaa') => 'YWFh'],
1N/A
1N/A [ASCII('aaa') => 'YWFh'],
1N/A [ASCII('aaa') => 'YWFh'],
1N/A [ASCII('aaa') => 'YWFh'],
1N/A
1N/A
1N/A # from HTTP spec
1N/A [ASCII('Aladdin:open sesame') => 'QWxhZGRpbjpvcGVuIHNlc2FtZQ=='],
1N/A
1N/A [ASCII('a') x 100 => 'YWFh' x 33 . 'YQ=='],
1N/A
1N/A [ASCII('Multipurpose Internet Mail Extensions: The Base64 Content-Transfer-Encoding is designed to represent sequences of octets in a form that is not humanly readable. ')
1N/A => "TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9uczogVGhlIEJhc2U2NCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCBzZXF1ZW5jZXMgb2Ygb2N0ZXRzIGluIGEgZm9ybSB0aGF0IGlzIG5vdCBodW1hbmx5IHJlYWRhYmxlLiA="],
1N/A
1N/A );
1N/A
1N/A for $test (@encode_tests) {
1N/A my($plain, $expected) = ($$test[0], $$test[1]);
1N/A
1N/A my $encoded = encode_base64($plain, '');
1N/A if ($encoded ne $expected) {
1N/A print "test $testno ($plain): expected $expected, got $encoded\n";
1N/A print "not ";
1N/A }
1N/A my $decoded = decode_base64($encoded);
1N/A if ($decoded ne $plain) {
1N/A print "test $testno ($encoded): expected $plain, got $decoded\n";
1N/A print "not ";
1N/A }
1N/A
1N/A print "ok $testno\n";
1N/A $testno++;
1N/A }
1N/A}
1N/A
1N/Asub decodeTest
1N/A{
1N/A print "# decode test\n";
1N/A
1N/A local $SIG{__WARN__} = sub { print $_[0] }; # avoid warnings on stderr
1N/A
1N/A my @decode_tests = (
1N/A ['YWE=' => ASCII('aa')],
1N/A [' YWE=' => ASCII('aa')],
1N/A ['Y WE=' => ASCII('aa')],
1N/A ['YWE= ' => ASCII('aa')],
1N/A ["Y\nW\r\nE=" => ASCII('aa')],
1N/A
1N/A # These will generate some warnings
1N/A ['YWE=====' => ASCII('aa')], # extra padding
1N/A ['YWE' => ASCII('aa')], # missing padding
1N/A ['YWFh====' => ASCII('aaa')],
1N/A ['YQ' => ASCII('a')],
1N/A ['Y' => ''],
1N/A ['x==' => ''],
1N/A ['' => ''],
1N/A [undef() => ''],
1N/A );
1N/A
1N/A for $test (@decode_tests) {
1N/A my($encoded, $expected) = ($$test[0], $$test[1]);
1N/A
1N/A my $decoded = decode_base64($encoded);
1N/A if ($decoded ne $expected) {
1N/A die "test $testno ($encoded): expected $expected, got $decoded\n";
1N/A }
1N/A print "ok $testno\n";
1N/A $testno++;
1N/A }
1N/A}