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