X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/109b7eb1b04aaaea7fd6c75108f99c7fcac15874..31323b30449a59713ed7a99f86e356:/test/runtest diff --git a/test/runtest b/test/runtest index b2178497d..f68b3c057 100755 --- a/test/runtest +++ b/test/runtest @@ -16,9 +16,9 @@ ############################################################################### #use strict; -use 5.010; -use feature 'state'; # included in 5.010 +use v5.10.1; use warnings; +use if $^V >= v5.19.11, experimental => 'smartmatch'; use Errno; use FileHandle; @@ -26,12 +26,16 @@ use Socket; use Time::Local; use Cwd; use File::Basename; +use Pod::Usage; +use Getopt::Long; use FindBin qw'$RealBin'; use lib "$RealBin/lib"; use Exim::Runtest; +use Exim::Utils qw(uniq numerically); -use if $ENV{DEBUG} && $ENV{DEBUG} =~ /\bruntest\b/ => ('Smart::Comments' => '####'); +use if $ENV{DEBUG} && scalar($ENV{DEBUG} =~ /\bruntest\b/) => 'Smart::Comments' => '####'; +use if $ENV{DEBUG} && scalar($ENV{DEBUG} =~ /\bruntest\b/) => 'Data::Dumper'; use constant TEST_TOP => 8999; use constant TEST_SPECIAL_TOP => 9999; @@ -71,9 +75,6 @@ my $have_ipv4 = 1; my $have_ipv6 = 1; my $have_largefiles = 0; -my $test_start = 1; -my $test_end = TEST_TOP; - my @test_list = (); @@ -1087,6 +1088,9 @@ RESET_AFTER_EXTRA_LINE_READ: # Not all platforms build with DKIM enabled next if /^PDKIM >> Body data for hash, canonicalized/; + # Not all platforms have sendfile support + next if /^cannot use sendfile for body: no support$/; + # Parts of DKIM-specific debug output depend on the time/date next if /^date:\w+,\{SP\}/; next if /^PDKIM \[[^[]+\] (Header hash|b) computed:/; @@ -1153,6 +1157,9 @@ RESET_AFTER_EXTRA_LINE_READ: { # Berkeley DB version differences next if / Berkeley DB error: /; + + # CHUNKING: exact sizes depend on hostnames in headers + s/(=>.* K C="250- \d)\d+ (byte chunk, total \d)\d+/$1nn $2nn/; } # ======== All files other than stderr ======== @@ -2502,22 +2509,6 @@ $more = 'more' if system('which less >/dev/null 2>&1') != 0; -################################################## -# Check for sudo access to root # -################################################## - -print "You need to have sudo access to root to run these tests. Checking ...\n"; -if (system('sudo true >/dev/null') != 0) - { - die "** Test for sudo failed: testing abandoned.\n"; - } -else - { - print "Test for sudo OK\n"; - } - - - ################################################## # See if an Exim binary has been given # ################################################## @@ -2526,10 +2517,6 @@ else # as the path to the binary. If the first argument does not start with a # '/' but exists in the file system, it's assumed to be the Exim binary. -($parm_exim, @ARGV) = Exim::Runtest::exim_binary(@ARGV); -print "Exim binary is $parm_exim\n" if $parm_exim ne ''; - - ################################################## # Sort out options and which tests are to be run # @@ -2539,38 +2526,58 @@ print "Exim binary is $parm_exim\n" if $parm_exim ne ''; # options are passed on to Exim calls within the tests. Typically, this is used # to turn on Exim debugging while setting up a test. -while (@ARGV > 0 && $ARGV[0] =~ /^-/) - { - my($arg) = shift @ARGV; - if ($optargs eq '') - { - if ($arg eq "-DEBUG") { $debug = 1; $cr = "\n"; next; } - if ($arg eq "-DIFF") { $cf = "diff -u"; next; } - if ($arg eq "-CONTINUE"){$force_continue = 1; - $more = "cat"; - next; } - if ($arg eq "-UPDATE") { $force_update = 1; next; } - if ($arg eq "-NOIPV4") { $have_ipv4 = 0; next; } - if ($arg eq "-NOIPV6") { $have_ipv6 = 0; next; } - if ($arg eq "-KEEP") { $save_output = 1; next; } - if ($arg eq "-SLOW") { $slow = 1; next; } - if ($arg eq "-VALGRIND") { $valgrind = 1; next; } - if ($arg =~ /^-FLAVOU?R$/) { $flavour = shift; next; } - } - $optargs .= " $arg"; - } +Getopt::Long::Configure qw(no_getopt_compat); +GetOptions( + 'debug' => sub { $debug = 1; $cr = "\n" }, + 'diff' => sub { $cf = 'diff -u' }, + 'continue' => sub { $force_continue = 1; $more = 'cat' }, + 'update' => \$force_update, + 'ipv4!' => \$have_ipv4, + 'ipv6!' => \$have_ipv6, + 'keep' => \$save_output, + 'slow' => \$slow, + 'valgrind' => \$valgrind, + 'range=s{2}' => \my @range_wanted, + 'test=i@' => \my @tests_wanted, + 'flavor|flavour=s' => $flavour, + 'help' => sub { pod2usage(-exit => 0) }, + 'man' => sub { + pod2usage( + -exit => 0, + -verbose => 2, + -noperldoc => system('perldoc -V 2>/dev/null 1>&2') + ); + }, +) or pod2usage; + +($parm_exim, @ARGV) = Exim::Runtest::exim_binary(@ARGV); +print "Exim binary is `$parm_exim'\n" if defined $parm_exim; + + +my @wanted = sort numerically uniq + @tests_wanted ? @tests_wanted : (), + @range_wanted ? $range_wanted[0] .. $range_wanted[1] : (), + @ARGV ? @ARGV == 1 ? $ARGV[0] : + $ARGV[1] eq '+' ? $ARGV[0]..($ARGV[0] >= 9000 ? TEST_SPECIAL_TOP : TEST_TOP) : + 0+$ARGV[0]..0+$ARGV[1] # add 0 to cope with test numbers starting with zero + : (); +@wanted = 1..TEST_TOP if not @wanted; -# Any subsequent arguments are a range of test numbers. +################################################## +# Check for sudo access to root # +################################################## -if (@ARGV) +print "You need to have sudo access to root to run these tests. Checking ...\n"; +if (system('sudo true >/dev/null') != 0) { - $test_end = $test_start = shift; - $test_end = shift if @ARGV; - $test_end = ($test_start >= 9000)? TEST_SPECIAL_TOP : TEST_TOP - if $test_end eq '+'; - die "** Test numbers out of order\n" if ($test_end < $test_start); + die "** Test for sudo failed: testing abandoned.\n"; + } +else + { + print "Test for sudo OK\n"; } -my @test_range = $test_start..$test_end; + + ################################################## @@ -2597,7 +2604,7 @@ $parm_cwd = Cwd::getcwd(); # If $parm_exim is still empty, ask the caller -if ($parm_exim eq '') +if (not $parm_exim) { print "** Did not find an Exim binary to test\n"; for ($i = 0; $i < 5; $i++) @@ -3390,7 +3397,9 @@ tests_exit(-1, "Failed to unlink $log_summary_filename: $!") # because the current binary does not support the right facilities, and also # those that are outside the numerical range selected. -print "\nTest range is $test_start to $test_end (flavour $flavour)\n"; +printf "\nWill run %d tests between %d and %d for flavour %s\n", + scalar(@wanted), $wanted[0], $wanted[-1], $flavour; + print "Omitting \${dlfunc expansion tests (loadable module not present)\n" if $dlfunc_deleted; print "Omitting dbm tests (unable to copy exim_dbmbuild)\n" @@ -3401,8 +3410,8 @@ my @test_dirs = grep { not /^CVS$/ } map { basename $_ } glob 'scripts/*' or die tests_exit(-1, "Failed to find test scripts in 'scripts/*`: $!"); # Scan for relevant tests - -DIR: for ($i = 0; $i < @test_dirs; $i++) +# HS12: Needs to be reworked. +DIR: for (my $i = 0; $i < @test_dirs; $i++) { my($testdir) = $test_dirs[$i]; my($wantthis) = 1; @@ -3413,12 +3422,12 @@ DIR: for ($i = 0; $i < @test_dirs; $i++) # test in the next directory. next DIR if ($i < @test_dirs - 1) && - ($test_start >= substr($test_dirs[$i+1], 0, 4)); + ($wanted[0] >= substr($test_dirs[$i+1], 0, 4)); # No need to carry on if the end test is less than the first test in this # subdirectory. - last DIR if $test_end < substr($testdir, 0, 4); + last DIR if $wanted[-1] < substr($testdir, 0, 4); # Check requirements, if any. @@ -3475,14 +3484,13 @@ DIR: for ($i = 0; $i < @test_dirs; $i++) # We want the tests from this subdirectory, provided they are in the # range that was selected. - @testlist = map { basename $_ } glob "scripts/$testdir/*"; + @testlist = grep { $_ ~~ @wanted } grep { /^\d+(?:\.\d+)?$/ } map { basename $_ } glob "scripts/$testdir/*"; tests_exit(-1, "Failed to read test scripts from `scripts/$testdir/*': $!") if not @testlist; foreach $test (@testlist) { - next if ($test !~ /^\d{4}(?:\.\d+)?$/); - if (!$wantthis || $test < $test_start || $test > $test_end) + if (!$wantthis) { log_test($log_summary_filename, $test, '.'); } @@ -3493,7 +3501,7 @@ DIR: for ($i = 0; $i < @test_dirs; $i++) } } -print ">>Test List: @test_list\n", if $debug; +print ">>Test List:\n", join "\n", @test_list, '' if $debug; ################################################## @@ -4012,4 +4020,81 @@ foreach $test (@test_list) tests_exit(-1, "No runnable tests selected") if not @test_list; tests_exit(0); +__END__ + +=head1 NAME + + runtest - run the exim testsuite + +=head1 SYNOPSIS + + runtest [exim-path] [options] [test0 [test1]] + +=head1 DESCRIPTION + +B runs the Exim testsuite. + +=head1 OPTIONS + +For legacy reasons the options are not case sensitive. + +=over + +=item B<--continue> + +Do not stop for user interaction or on errors. (default: off) + +=item B<--debug> + +This option enables the output of debug information when running the +various test commands. (default: off) + +=item B<--diff> + +Use C for comparing the expected output with the produced +output. (default: use a built-in routine) + +=item B<--flavor>|B<--flavour> I + +Override the expected results for results for a specific (OS) flavour. +(default: unused) + +=item B<--[no]ipv4> + +Skip IPv4 related setup and tests (default: use ipv4) + +=item B<--[no]ipv6> + +Skip IPv6 related setup and tests (default: use ipv6) + +=item B<--keep> + +Keep the various output files produced during a test run. (default: don't keep) + +=item B<--range> I I + +Run tests between (including) I and I. A "+" may be used to specify the "last +test available". + +=item B<--slow> + +Insert some delays to compensate for a slow host system. (default: off) + +=item B<--test> I + +Run the specified test. This option may used multiple times. + +=item B<--update> + +Automatically update the recorded (expected) data on mismatch. (default: off) + +=item B<--valgrind> + +Start Exim wrapped by I. (default: don't use valgrind) + +=back + +=cut + + # End of runtest script