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