4 # Copyright (C) 2006-2009 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 (my $program_name = $0) =~ s
|.*/||;
23 # Turn off localization of executable's output.
24 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x
3;
26 # Return the encoding of a string of N 'a's.
30 my %remainder = ( 0 => '', 1 => 'YQ==', 2 => 'YWE=' );
31 return 'YWFh' x
($n / 3) . $remainder{$n % 3};
34 # Construct an encoded string of length 4KB, using 3K "a"s.
37 # A few copies, each with different number of newlines at the start.
40 (my $t = $a3k) =~ s/^/"\n"x $k/e;
44 # Return a copy of S, with newlines inserted every WIDTH bytes.
45 # Ensure that the result (if not the empty string) is newline-terminated.
49 $s =~ s/(.{$width})/$1\n/g;
50 substr ($s, -1, 1) ne "\n"
57 ['empty', {IN
=>''}, {OUT
=>""}],
58 ['inout', {IN
=>'a'}, {OUT
=>"YQ==\n"}],
59 ['wrap', '--wrap 0', {IN
=>'foo'}, {OUT
=>'Zm9v'}],
60 ['wrap5-39', '--wrap=5', {IN
=>'a' x
39}, {OUT
=>wrap enc
(39),5}],
61 ['wrap5-40', '--wrap=5', {IN
=>'a' x
40}, {OUT
=>wrap enc
(40),5}],
62 ['wrap5-41', '--wrap=5', {IN
=>'a' x
41}, {OUT
=>wrap enc
(41),5}],
63 ['wrap5-42', '--wrap=5', {IN
=>'a' x
42}, {OUT
=>wrap enc
(42),5}],
64 ['wrap5-43', '--wrap=5', {IN
=>'a' x
43}, {OUT
=>wrap enc
(43),5}],
65 ['wrap5-44', '--wrap=5', {IN
=>'a' x
44}, {OUT
=>wrap enc
(44),5}],
66 ['wrap5-45', '--wrap=5', {IN
=>'a' x
45}, {OUT
=>wrap enc
(45),5}],
67 ['wrap5-46', '--wrap=5', {IN
=>'a' x
46}, {OUT
=>wrap enc
(46),5}],
69 ['buf-1', '--decode', {IN
=>enc
1}, {OUT
=>'a' x
1}],
70 ['buf-2', '--decode', {IN
=>enc
2}, {OUT
=>'a' x
2}],
71 ['buf-3', '--decode', {IN
=>enc
3}, {OUT
=>'a' x
3}],
72 ['buf-4', '--decode', {IN
=>enc
4}, {OUT
=>'a' x
4}],
74 ['buf-4k0', '--decode', {IN
=>enc
3072+0}, {OUT
=>'a' x
(3072+0)}],
75 ['buf-4k1', '--decode', {IN
=>enc
3072+1}, {OUT
=>'a' x
(3072+1)}],
76 ['buf-4k2', '--decode', {IN
=>enc
3072+2}, {OUT
=>'a' x
(3072+2)}],
77 ['buf-4k3', '--decode', {IN
=>enc
3072+3}, {OUT
=>'a' x
(3072+3)}],
78 ['buf-4km1','--decode', {IN
=>enc
3072-1}, {OUT
=>'a' x
(3072-1)}],
79 ['buf-4km2','--decode', {IN
=>enc
3072-2}, {OUT
=>'a' x
(3072-2)}],
80 ['buf-4km3','--decode', {IN
=>enc
3072-3}, {OUT
=>'a' x
(3072-3)}],
81 ['buf-4km4','--decode', {IN
=>enc
3072-4}, {OUT
=>'a' x
(3072-4)}],
83 # Exercise the case in which the final base-64 byte is
84 # in a buffer all by itself.
85 ['b4k-1', '--decode', {IN
=>$a3k_nl[1]}, {OUT
=>'a' x
(3072+0)}],
86 ['b4k-2', '--decode', {IN
=>$a3k_nl[2]}, {OUT
=>'a' x
(3072+0)}],
87 ['b4k-3', '--decode', {IN
=>$a3k_nl[3]}, {OUT
=>'a' x
(3072+0)}],
89 ['baddecode', '--decode', {IN
=>'a'}, {OUT
=>""},
90 {ERR_SUBST
=> 's/.*: invalid input//'}, {ERR
=> "\n"}, {EXIT
=> 1}],
91 ['baddecode2', '--decode', {IN
=>'ab'}, {OUT
=>"i"},
92 {ERR_SUBST
=> 's/.*: invalid input//'}, {ERR
=> "\n"}, {EXIT
=> 1}],
93 ['baddecode3', '--decode', {IN
=>'Zzz'}, {OUT
=>"g<"},
94 {ERR_SUBST
=> 's/.*: invalid input//'}, {ERR
=> "\n"}, {EXIT
=> 1}],
95 ['baddecode4', '--decode', {IN
=>'Zz='}, {OUT
=>"g"},
96 {ERR_SUBST
=> 's/.*: invalid input//'}, {ERR
=> "\n"}, {EXIT
=> 1}],
97 ['baddecode5', '--decode', {IN
=>'Z==='}, {OUT
=>""},
98 {ERR_SUBST
=> 's/.*: invalid input//'}, {ERR
=> "\n"}, {EXIT
=> 1}]
101 # For each non-failing test, create a --decode test using the
102 # expected output as input. Also, add tests inserting newlines.
104 foreach my $t (@Tests)
110 # If the test has a single option of "--decode", then skip it.
111 !ref $t->[1] && $t->[1] eq '--decode'
116 ref $e && ref $e eq 'HASH'
119 and $exit_val = $e->{EXIT
};
122 if (defined $e->{OUT
})
127 foreach my $i (0..$len)
130 substr ($u, $i, 0) = "\n";
143 push @new, ["d$i-$t->[0]", '--decode', {IN
=> $o}, {OUT
=> $in}];
149 my $save_temps = $ENV{DEBUG
};
150 my $verbose = $ENV{VERBOSE
};
153 my $fail = run_tests
($program_name, $prog, \
@Tests, $save_temps, $verbose);