X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=build%2Ftester;h=da4fab3b7587a5cbcedb8b7186fabc78929a1e09;hb=97c0f0673d3bf8f426afb784e8b419c8931977cb;hp=fd6cce3fcd620b886260d7178828793b921c1bd8;hpb=354ad36447e1ab498e42fdabfd3f2d9179f187e2;p=libucw.git diff --git a/build/tester b/build/tester index fd6cce3f..da4fab3b 100755 --- a/build/tester +++ b/build/tester @@ -1,6 +1,6 @@ #!/usr/bin/perl # A simple unit testing script -# (c) 2004--2007 Martin Mares +# (c) 2004--2013 Martin Mares # (c) 2007 Pavel Charvat # Tests in the test file have a syntax similar to mail headers, @@ -13,11 +13,20 @@ # replaced by file names of In or Out files (see below). # In: lines to pass to the program as standard input # Out: lines to expect at the program's standard output +# Err: lines to expect at the program's standard error output # In: lines to pass to the program as input file # Out: lines to expect from the program in output file # Both In and Out can be specified simultaneously if we # are testing a program which modifies some of its input files. # Exit: expected exit code of the program (default: 0) +# +# A value of a field can be optionally given as a shell-style here-document: +# +# In <) { ($tt->{$n}) && die "$n already defined"; $tt->{$n} = $v; $append_to = \($tt->{$n}); + } elsif (my ($n,$sep) = /^(\w+)\s*<<(\w+)\s*$/) { + if (!$tt) { + $tt = {}; + push @tests, $tt; + } + ($tt->{$n}) && die "$n already defined"; + $tt->{$n} = ""; + $sep .= "\n"; + while (1) { + my $line = <>; + defined $line or die "Here-document not terminated"; + last if $line eq $sep; + $tt->{$n} .= $line; + } + chomp $tt->{$n}; } else { die "Test script syntax error"; } } +if (! -d "$rundir/tmp") { + mkdir "$rundir/tmp" or die "Unable to create $rundir/tmp: $!"; +} + my $i = 0; my $errors = 0; my $prev_run = undef; @@ -63,7 +91,6 @@ TEST: foreach $tt (@tests) { my @out_files = (); my @out_checks = (); - my @temps = (); my $redirs = ""; if (defined $tt->{'In'}) { @@ -72,7 +99,6 @@ TEST: foreach $tt (@tests) { print X $tt->{'In'}, "\n"; close X; $redirs .= " <$ifi"; - push @temps, $ifi; } else { $redirs .= " {'Out'}; } else { $redirs .= " >/dev/null"; } + if (defined $tt->{'Err'}) { + my $efi = "tmp/test$i.err"; + unlink "$rundir/$efi"; + $redirs .= " 2>$efi"; + push @out_files, $efi; + push @out_checks, $tt->{'Err'}; + } foreach my $arg (0..9) { my $f = "tmp/test$i.$arg"; if (defined $tt->{"Out$arg"}) { unlink "$rundir/$f"; - push @temps, $f; push @out_files, $f; push @out_checks, $tt->{"Out$arg"}; } @@ -98,7 +129,6 @@ TEST: foreach $tt (@tests) { open X, ">$rundir/$f" or die "Unable to create $f"; print X $tt->{"In$arg"}, "\n"; close X; - push @temps, $f; } } $run =~ s/\$(\d)/tmp\/test$i.$1/g; @@ -126,6 +156,7 @@ TEST: foreach $tt (@tests) { $out = ; } close X; + $out =~ /\n$/s or $out .= "\n"; if ($out ne $out_checks[$i] . "\n") { print "FAILED (see $ofi)\n"; $errors++; @@ -133,9 +164,7 @@ TEST: foreach $tt (@tests) { } } - foreach my $f (@temps) { - unlink "$rundir/$f"; - } + system "rm -f $rundir/tmp/test$i.*"; print "OK\n"; }