X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=build%2Ftester;h=da4fab3b7587a5cbcedb8b7186fabc78929a1e09;hb=b8667492cf36a609939ee35ac42900ff0b0cc80f;hp=f66713e18c45bd4c0f3d12faaa4bc806d6f71696;hpb=ca1d58bec2ba0740e7f67a533833b4c9f838853d;p=libucw.git diff --git a/build/tester b/build/tester index f66713e1..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"; } @@ -87,6 +111,13 @@ TEST: foreach $tt (@tests) { } 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"}) { @@ -125,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++;