1#! /usr/bin/perl -w
2# Test the errors that should be captured.
3
4# Copyright (c) 2007 imacat
5#
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.
10#
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.
15#
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/>.
18
19use 5.005;
20use strict;
21use warnings;
22use diagnostics;
23use Test;
24
25BEGIN { plan tests => 23 }
26
27use File::Basename qw(basename);
28use File::Path qw(mkpath rmtree);
29use File::Spec::Functions qw(catdir catfile updir);
30use FindBin;
31use lib $FindBin::Bin;
32use _helper;
33use vars qw($WORKDIR $arclog $tno);
34
35$WORKDIR = catdir($FindBin::Bin, "logs");
36$arclog = catfile($FindBin::Bin, updir, "blib", "script", "arclog");
37$tno = 0;
38
39# 1: STDIN alone
40$_ = eval {
41    my ($title, $cmd, $retno, $out, $err, $vardump, $logfile);
42    my ($fr, $frb, @fle, $fle, $flr, %cef, %crf, %tef, %trf);
43    my ($fs, $cs, %cem);
44    rmtree $WORKDIR;
45    mkpath $WORKDIR;
46    $title = "STDIN alone";
47    $logfile = randword;
48    $fs = catfile($WORKDIR, $logfile);
49    ($cs, $vardump, %cem) = mkrndlog_apache $fs;
50    frwrite(catfile($WORKDIR, "$logfile.vardump"), $vardump);
51    @fle = qw();
52    push @fle, basename($fs);
53    push @fle, "$logfile.vardump";
54    prsrvsrc $WORKDIR;
55    @_ = ($arclog, qw(-d -d -d -c n), "-");
56    $cmd = join(" ", @_) . " < " . $fs;
57    ($retno, $out, $err) = runcmd frread $fs, @_;
58    ($fle, $flr) = (join(" ", sort @fle), flist $WORKDIR);
59    %cef = qw();    # Expected content by file
60    %tef = qw();    # Expected file type by file
61    %crf = qw();    # Resulted content by file
62    %trf = qw();    # Resulted file type by file
63    $fr = $fs;
64    $frb = basename($fr);
65    ($cef{$frb}, $tef{$frb}) = ($cs, TYPE_PLAIN);
66    ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
67    $frb = "$logfile.vardump";
68    $fr = catfile($WORKDIR, $frb);
69    ($cef{$frb}, $tef{$frb}) = ($vardump, TYPE_PLAIN);
70    ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
71    die "$title\n$cmd\n$out$err" unless $retno != 0;
72    die "$title\n$cmd\nresult files incorrect.\nGot: $flr\nExpected: $fle\nOutput:\n$out$err"
73        unless $flr eq $fle;
74    foreach $fr (@fle) {
75        die "$title\n$cmd\n$fr: result type incorrect.\nGot: $trf{$fr}\nExpected: $tef{$fr}\nOutput:\n$out$err"
76            unless nofile || $trf{$fr} eq $tef{$fr};
77        die "$title\n$cmd\n$fr: result incorrect.\nGot:\n$crf{$fr}\nExpected:\n$cef{$fr}\nOutput:\n$out$err"
78            unless $crf{$fr} eq $cef{$fr};
79    }
80    1;
81};
82ok($_, 1, $@);
83cleanup $_, $WORKDIR, ++$tno;
84
85# 2: STDOUT as output prefix
86$_ = eval {
87    my ($title, $cmd, $retno, $out, $err, $vardump, $logfile);
88    my ($fr, $frb, @fle, $fle, $flr, %cef, %crf, %tef, %trf);
89    my ($fs, $cs, %cem);
90    rmtree $WORKDIR;
91    mkpath $WORKDIR;
92    $title = "STDOUT as output prefix";
93    $logfile = randword;
94    $fs = catfile($WORKDIR, $logfile);
95    ($cs, $vardump, %cem) = mkrndlog_apache $fs;
96    frwrite(catfile($WORKDIR, "$logfile.vardump"), $vardump);
97    @fle = qw();
98    push @fle, basename($fs);
99    push @fle, "$logfile.vardump";
100    prsrvsrc $WORKDIR;
101    @_ = ($arclog, qw(-d -d -d -c n), $logfile, "-");
102    $cmd = join " ", @_;
103    ($retno, $out, $err) = runcmd "", @_;
104    ($fle, $flr) = (join(" ", sort @fle), flist $WORKDIR);
105    %cef = qw();    # Expected content by file
106    %tef = qw();    # Expected file type by file
107    %crf = qw();    # Resulted content by file
108    %trf = qw();    # Resulted file type by file
109    $fr = $fs;
110    $frb = basename($fr);
111    ($cef{$frb}, $tef{$frb}) = ($cs, TYPE_PLAIN);
112    ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
113    $frb = "$logfile.vardump";
114    $fr = catfile($WORKDIR, $frb);
115    ($cef{$frb}, $tef{$frb}) = ($vardump, TYPE_PLAIN);
116    ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
117    die "$title\n$cmd\n$out$err" unless $retno != 0;
118    die "$title\n$cmd\nresult files incorrect.\nGot: $flr\nExpected: $fle\nOutput:\n$out$err"
119        unless $flr eq $fle;
120    foreach $fr (@fle) {
121        die "$title\n$cmd\n$fr: result type incorrect.\nGot: $trf{$fr}\nExpected: $tef{$fr}\nOutput:\n$out$err"
122            unless nofile || $trf{$fr} eq $tef{$fr};
123        die "$title\n$cmd\n$fr: result incorrect.\nGot:\n$crf{$fr}\nExpected:\n$cef{$fr}\nOutput:\n$out$err"
124            unless $crf{$fr} eq $cef{$fr};
125    }
126    1;
127};
128ok($_, 1, $@);
129cleanup $_, $WORKDIR, ++$tno;
130
131# 3: A same log file is specified more than once
132$_ = eval {
133    my ($title, $cmd, $retno, $out, $err, @vardump, %logfiles);
134    my ($fr, $frb, @fle, $fle, $flr, %cef, %crf, %tef, %trf);
135    my ($num, @fs, @cs, @cem, @mle, %cof, $opref, $oprfb, $mt);
136    my (@st, $fmt, $rt, $dup);
137    rmtree $WORKDIR;
138    mkpath $WORKDIR;
139    $fmt = $LOGFMTS[int rand @LOGFMTS];
140    $rt = $RESTYPES[int rand @RESTYPES];
141    $title = join ",", "A same log file is specified more than once",
142        $$fmt{"title"}, $$rt{"title"};
143    # (2-4 times available compression) log files
144    $_ = 2 + (nogzip? 0: 2) + (nobzip2? 0: 2);
145    $num = $_ + int rand $_;
146    %_ = qw();
147    # At least 2 files for each available compression
148    foreach my $st (@SRCTYPES) {
149        next if ($$st{"type"} eq TYPE_GZIP && nogzip)
150                || ($$st{"type"} eq TYPE_BZIP2 && nobzip2);
151        @_ = grep !exists $_{$_}, (0...$num-1);
152        $_{$_[int rand @_]} = $st;
153        @_ = grep !exists $_{$_}, (0...$num-1);
154        $_{$_[int rand @_]} = $st;
155    }
156    # Set random compression on the rest files
157    foreach (grep !exists $_{$_}, (0...$num-1)) {
158        do {
159            $_{$_} = $SRCTYPES[int rand @SRCTYPES];
160        } until !(${$_{$_}}{"type"} eq TYPE_GZIP && nogzip)
161                && !(${$_{$_}}{"type"} eq TYPE_BZIP2 && nobzip2);
162    }
163    @st = map $_{$_}, (0...$num-1);
164    @fs = qw();
165    @cs = qw();
166    @cem = qw();
167    @vardump = qw();
168    @fle = qw();
169    %logfiles = qw();
170    for (my $k = 0; $k < $num; $k++) {
171        my ($logfile, $cs, $vardump);
172        do { $logfile = randword } until !exists $logfiles{$logfile};
173        $logfiles{$logfile} = 1;
174        $logfile .= ${$st[$k]}{"suf"};
175        push @fs, catfile($WORKDIR, $logfile);
176        ($cs, $vardump, %_) = &{$$fmt{"sub"}}($fs[$k]);
177        push @cs, $cs;
178        push @cem, {%_};
179        push @fle, $logfile;
180        push @vardump, $vardump;
181        frwrite(catfile($WORKDIR, "$logfile.vardump"), $vardump);
182        push @fle, "$logfile.vardump";
183    }
184    %_ = qw();
185    %_ = (%_, map { $_ => 1 } keys %$_) foreach @cem;
186    @mle = sort keys %_;
187    $mt = pop @mle;
188    do { $oprfb = randword } until !exists $logfiles{$oprfb};
189    $opref = catfile($WORKDIR, $oprfb);
190    %cof = mkrndlog_existing $$fmt{"sub"},
191        $WORKDIR, "$oprfb.%s" . $$rt{"suf"}, @mle;
192    push @fle, map basename($_), grep $cof{$_} ne "", keys %cof;
193    prsrvsrc $WORKDIR;
194    $dup = $fs[int rand @fs];
195    $_ = int rand(@fs + 1);
196    @_ = (@fs[0...$_-1], $dup, @fs[$_...$#fs]);
197    @_ = ($arclog, qw(-d -d -d -o a), @{$$rt{"opts"}}, @_, $opref);
198    $cmd = join(" ", @_);
199    ($retno, $out, $err) = runcmd "", @_;
200    ($fle, $flr) = (join(" ", sort @fle), flist $WORKDIR);
201    %cef = qw();    # Expected content by file
202    %tef = qw();    # Expected file type by file
203    %crf = qw();    # Resulted content by file
204    %trf = qw();    # Resulted file type by file
205    for (my $k = 0; $k < $num; $k++) {
206        $fr = $fs[$k];
207        $frb = basename($fr);
208        ($cef{$frb}, $tef{$frb}) = ($cs[$k], ${$st[$k]}{"type"});
209        ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
210        $fr = $fs[$k] . ".vardump";
211        $frb = basename($fr);
212        ($cef{$frb}, $tef{$frb}) = ($vardump[$k], TYPE_PLAIN);
213        ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
214    }
215    foreach my $m (@mle) {
216        $fr = "$opref.$m" . $$rt{"suf"};
217        $frb = basename($fr);
218        next if $cof{$frb} eq "";
219        ($cef{$frb}, $tef{$frb}) = ($cof{$frb}, $$rt{"type"});
220        ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
221    }
222    die "$title\n$cmd\n$out$err" unless $retno != 0;
223    die "$title\n$cmd\nresult files incorrect.\nGot: $flr\nExpected: $fle\nOutput:\n$out$err"
224        unless $flr eq $fle;
225    foreach $fr (@fle) {
226        die "$title\n$cmd\n$fr: result type incorrect.\nGot: $trf{$fr}\nExpected: $tef{$fr}\nOutput:\n$out$err"
227            unless nofile || $trf{$fr} eq $tef{$fr};
228        die "$title\n$cmd\n$fr: result incorrect.\nGot:\n$crf{$fr}\nExpected:\n$cef{$fr}\nOutput:\n$out$err"
229            unless $crf{$fr} eq $cef{$fr};
230    }
231    1;
232};
233ok($_, 1, $@);
234cleanup $_, $WORKDIR, ++$tno;
235
236# 4-23: Mixing different formats
237for (my $i = 0; $i < @LOGFMTS; $i++) {
238    for (my $j = 0; $j < @LOGFMTS; $j++) {
239        next if $i == $j;
240        $_ = eval {
241            my ($title, $cmd, $retno, $out, $err, @vardump, %logfiles);
242            my ($fr, $frb, @fle, $fle, $flr, %cef, %crf, %tef, %trf);
243            my ($num, $swan, @fs, @cs, $opref, $oprfb);
244            rmtree $WORKDIR;
245            mkpath $WORKDIR;
246            $title = join ",", "Mixing formats", ${$LOGFMTS[$i]}{"title"},
247                ${$LOGFMTS[$j]}{"title"};
248            # 3-5 log files
249            $num = 3 + int rand 3;
250            $swan = 1 + int rand($num - 1);
251            @fs = qw();
252            @cs = qw();
253            @vardump = qw();
254            @fle = qw();
255            %logfiles = qw();
256            for (my $k = 0; $k < $num; $k++) {
257                my ($logfile, $cs, $vardump);
258                do { $logfile = randword } until !exists $logfiles{$logfile};
259                $logfiles{$logfile} = 1;
260                push @fs, catfile($WORKDIR, $logfile);
261                if ($k != $swan) {
262                    ($cs, $vardump, %_) = &{${$LOGFMTS[$i]}{"sub"}}($fs[$k]);
263                } else {
264                    ($cs, $vardump, %_) = &{${$LOGFMTS[$j]}{"sub"}}($fs[$k]);
265                }
266                push @cs, $cs;
267                push @fle, $logfile;
268                push @vardump, $vardump;
269                frwrite(catfile($WORKDIR, "$logfile.vardump"), $vardump);
270                push @fle, "$logfile.vardump";
271            }
272            prsrvsrc $WORKDIR;
273            do { $oprfb = randword } until !exists $logfiles{$oprfb};
274            $opref = catfile($WORKDIR, $oprfb);
275            @_ = ($arclog, qw(-d -d -d -c n), @fs, $opref);
276            $cmd = join " ", @_;
277            ($retno, $out, $err) = runcmd "", @_;
278            ($fle, $flr) = (join(" ", sort @fle), flist $WORKDIR);
279            %cef = qw();    # Expected content by file
280            %tef = qw();    # Expected file type by file
281            %crf = qw();    # Resulted content by file
282            %trf = qw();    # Resulted file type by file
283            for (my $k = 0; $k < $num; $k++) {
284                $fr = $fs[$k];
285                $frb = basename($fr);
286                ($cef{$frb}, $tef{$frb}) = ($cs[$k], TYPE_PLAIN);
287                ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
288                $frb = "$frb.vardump";
289                $fr = catfile($WORKDIR, $frb);
290                ($cef{$frb}, $tef{$frb}) = ($vardump[$k], TYPE_PLAIN);
291                ($crf{$frb}, $trf{$frb}) = (fread $fr, ftype $fr);
292            }
293            die "$title\n$cmd\n$out$err" unless $retno != 0;
294            die "$title\n$cmd\nresult files incorrect.\nGot: $flr\nExpected: $fle\nOutput:\n$out$err"
295                unless $flr eq $fle;
296            foreach $fr (@fle) {
297                die "$title\n$cmd\n$fr: result type incorrect.\nGot: $trf{$fr}\nExpected: $tef{$fr}\nOutput:\n$out$err"
298                    unless nofile || $trf{$fr} eq $tef{$fr};
299                die "$title\n$cmd\n$fr: result incorrect.\nGot:\n$crf{$fr}\nExpected:\n$cef{$fr}\nOutput:\n$out$err"
300                    unless $crf{$fr} eq $cef{$fr};
301            }
302            1;
303        };
304        ok($_, 1, $@);
305        cleanup $_, $WORKDIR, ++$tno;
306        die unless $_;
307    }
308}
309