X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/e1b3d58d3359cdbb67d37cd4222ff9dcb7b7da0e..4be52428d30e22d6559876650d614473b4bc8e78:/test/runtest diff --git a/test/runtest b/test/runtest index 43b35904e..8f5d9b60c 100755 --- a/test/runtest +++ b/test/runtest @@ -1,7 +1,5 @@ #! /usr/bin/perl -w -# $Cambridge: exim/test/runtest,v 1.37 2010/06/14 20:30:12 jetmore Exp $ - ############################################################################### # This is the controlling script for the "new" test suite for Exim. It should # # be possible to export this suite for running on a wide variety of hosts, in # @@ -299,6 +297,7 @@ $spid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; while() { +RESET_AFTER_EXTRA_LINE_READ: # Check for "*** truncated ***" $yield = 1 if /\*\*\* truncated \*\*\*/; @@ -312,7 +311,8 @@ while() s?\Q$parm_cwd\E?TESTSUITE?g; # Replace the Exim version number (may appear in various places) - s/Exim \d+\.\d+[\w-]*/Exim x.yz/i; + # patchexim should have fixed this for us + #s/(Exim) \d+\.\d+[\w_-]*/$1 x.yz/i; # Replace Exim message ids by a unique series s/((?:[^\W_]{6}-){2}[^\W_]{2}) @@ -560,9 +560,9 @@ while() s/host\s\Q$parm_ipv4\E\s\[\Q$parm_ipv4\E\]/host ipv4.ipv4.ipv4.ipv4 [ipv4.ipv4.ipv4.ipv4]/; s/host\s\Q$parm_ipv6\E\s\[\Q$parm_ipv6\E\]/host ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6 [ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6]/; s/\b\Q$parm_ipv4\E\b/ip4.ip4.ip4.ip4/g; - s/\b\Q$parm_ipv6\E\b/ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6/g; + s/(^|\W)\K\Q$parm_ipv6\E/ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6/g; s/\b\Q$parm_ipv4r\E\b/ip4-reverse/g; - s/\b\Q$parm_ipv6r\E\b/ip6-reverse/g; + s/(^|\W)\K\Q$parm_ipv6r\E/ip6-reverse/g; s/^(\s+host\s\S+\s+\[\S+\]) +$/$1 /; @@ -593,7 +593,14 @@ while() # ======== Output from ls ======== # Different operating systems use different spacing on long output - s/ +/ /g if /^[-rwd]{10} /; + #s/ +/ /g if /^[-rwd]{10} /; + # (Bug 1226) SUSv3 allows a trailing printable char for modified access method control. + # Handle only the Gnu and MacOS space, dot, plus and at-sign. A full [[:graph:]] + # unfortunately matches a non-ls linefull of dashes. + # Allow the case where we've already picked out the file protection bits. + if (s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/$1$2/) { + s/ +/ /g; + } # ======== Message sizes ========= @@ -682,6 +689,12 @@ while() s/^\d\d\d(?=[PFS*])/ddd/; + # ========= Exim lookups ================== + # Lookups have a char which depends on the number of lookup types compiled in, + # in stderr output. Replace with a "0". Recognising this while avoiding + # other output is fragile; perhaps the debug output should be revised instead. + s%(?) next if /OpenSSL compile-time version: OpenSSL \d+[\.\da-z]+/; next if /OpenSSL runtime version: OpenSSL \d+[\.\da-z]+/; + # drop lookups + next if /^Lookups \(built-in\):/; + next if /^Loading lookup modules from/; + next if /^Loaded \d+ lookup modules/; + next if /^Total \d+ lookups/; + + # drop compiler information + next if /^Compiler:/; + + # and the ugly bit + # different libraries will have different numbers (possibly 0) of follow-up + # lines, indenting with more data + if (/^Library version:/) { + while (1) { + $_ = ; + next if /^\s/; + goto RESET_AFTER_EXTRA_LINE_READ; + } + } + + # drop other build-time controls emitted for debugging + next if /^WHITELIST_D_MACROS:/; + next if /^TRUSTED_CONFIG_LIST:/; + + # As of Exim 4.74, we log when a setgid fails; because we invoke Exim + # with -be, privileges will have been dropped, so this will always + # be the case + next if /^changing group to \d+ failed: Operation not permitted/; + + # We invoke Exim with -D, so we hit this new messag as of Exim 4.73: + next if /^macros_trusted overridden to true by whitelisting/; + # We have to omit the localhost ::1 address so that all is well in # the IPv4-only case. @@ -895,7 +940,7 @@ if ($_[1]) { $_ = "u"; print "... update forced\n"; } # [4] TRUE if this is a log file whose deliveries must be sorted # # Returns: 0 comparison succeeded or differences to be ignored -# 1 comparison failed; files were updated (=> re-compare) +# 1 comparison failed; files may have been updated (=> re-compare) # # Does not return if the user replies "Q" to a prompt. @@ -1053,9 +1098,10 @@ if (-e $sf) print "\n"; for (;;) { - interact("Continue, Update & retry, Quit? [Q] ", $force_update); + interact("Continue, Retry, Update & retry, Quit? [Q] ", $force_update); tests_exit(1) if /^q?$/i; return 0 if /^c$/i; + return 1 if /^r$/i; last if (/^u$/i); } } @@ -1087,7 +1133,7 @@ return 1; # # Arguments: none # Returns: 0 if the output compared equal -# 1 if files were updated and the test must be re-run +# 1 if re-run needed (files may have been updated) sub check_output{ my($yield) = 0; @@ -1832,6 +1878,13 @@ autoflush STDOUT 1; print "Exim tester $testversion\n"; +################################################## +# Some tests check created file modes # +################################################## + +umask 022; + + ################################################## # Check for the "less" command # ################################################## @@ -2003,7 +2056,13 @@ if ($parm_exim eq "") # Find what is in the binary # ################################################## -open(EXIMINFO, "$parm_exim -C confs/0000 -DDIR=$parm_cwd " . +# deal with TRUSTED_CONFIG_LIST restrictions +unlink("$parm_cwd/test-config") if -e "$parm_cwd/test-config"; +symlink("$parm_cwd/confs/0000", "$parm_cwd/test-config") + or die "Unable to link initial config into place: $!\n"; + +print("Probing with config file: $parm_cwd/test-config\n"); +open(EXIMINFO, "$parm_exim -d -C $parm_cwd/test-config -DDIR=$parm_cwd " . "-bP exim_user exim_group|") || die "** Cannot run $parm_exim: $!\n"; while() @@ -2018,6 +2077,13 @@ if (defined $parm_eximuser) if ($parm_eximuser =~ /^\d+$/) { $parm_exim_uid = $parm_eximuser; } else { $parm_exim_uid = getpwnam($parm_eximuser); } } +else + { + print "Unable to extract exim_user from binary.\n"; + print "Check if Exim refused to run; if so, consider:\n"; + print " TRUSTED_CONFIG_LIST ALT_CONFIG_PREFIX WHITELIST_D_MACROS\n"; + die "Failing to get information from binary.\n"; + } if (defined $parm_eximgroup) { @@ -2025,7 +2091,7 @@ if (defined $parm_eximgroup) else { $parm_exim_gid = getgrnam($parm_eximgroup); } } -open(EXIMINFO, "$parm_exim -bV -C confs/0000 -DDIR=$parm_cwd |") || +open(EXIMINFO, "$parm_exim -bV -C $parm_cwd/test-config -DDIR=$parm_cwd |") || die "** Cannot run $parm_exim: $!\n"; print "-" x 78, "\n"; @@ -2052,7 +2118,7 @@ while () %parm_support = @temp; } - elsif (/^Lookups: (.*)/) + elsif (/^Lookups \(built-in\): (.*)/) { print; @temp = split /(\s+)/, $1; @@ -2102,6 +2168,7 @@ while () close(EXIMINFO); print "-" x 78, "\n"; +unlink("$parm_cwd/test-config"); ################################################## # Check for SpamAssassin and ClamAV # @@ -2383,6 +2450,12 @@ $parm_caller_group = getgrgid($parm_caller_gid); print "Program caller is $parm_caller, whose group is $parm_caller_group\n"; print "Home directory is $parm_caller_home\n"; +unless (defined $parm_eximgroup) + { + print "Unable to derive \$parm_eximgroup.\n"; + die "** ABANDONING.\n"; + } + print "You need to be in the Exim group to run these tests. Checking ..."; if (`groups` =~ /\b\Q$parm_eximgroup\E\b/) @@ -2621,6 +2694,12 @@ if (system("cp $parm_exim_dir/eximstats eximdir") != 0) print "Exim user is $parm_eximuser ($parm_exim_uid)\n"; print "Exim group is $parm_eximgroup ($parm_exim_gid)\n"; + +if ($parm_caller_uid eq $parm_exim_uid) { + tests_exit(-1, "Exim user ($parm_eximuser,$parm_exim_uid) cannot be " + ."the same as caller ($parm_caller,$parm_caller_uid)"); +} + print "The Exim user needs access to the test suite directory. Checking ..."; if (($rc = system("sudo bin/checkaccess $parm_cwd/eximdir/exim $parm_eximuser $parm_eximgroup")) != 0) @@ -2868,7 +2947,16 @@ if ($have_ipv4 && $parm_ipv4 ne "127.0.0.1") if ($have_ipv6 && $parm_ipv6 ne "::1") { - my(@components) = split /:/, $parm_ipv6; + my($exp_v6) = $parm_ipv6; + $exp_v6 =~ s/[^:]//g; + if ( $parm_ipv6 =~ /^([^:].+)::$/ ) { + $exp_v6 = $1 . ':0' x (9-length($exp_v6)); + } elsif ( $parm_ipv6 =~ /^(.+)::(.+)$/ ) { + $exp_v6 = $1 . ':0' x (8-length($exp_v6)) . ':' . $2; + } elsif ( $parm_ipv6 =~ /^::(.+[^:])$/ ) { + $exp_v6 = '0:' x (9-length($exp_v6)) . $1; + } + my(@components) = split /:/, $exp_v6; my(@nibbles) = reverse (split /\s*/, shift @components); my($sep) = ""; @@ -3112,10 +3200,10 @@ foreach $test (@test_list) for (;;) { - print "\nshow stdErr, show stdOut, Continue (without file comparison), or Quit? [Q] "; + print "\nshow stdErr, show stdOut, Retry, Continue (without file comparison), or Quit? [Q] "; $_ = ; tests_exit(1) if /^q?$/i; - last if /^c$/i; + last if /^[rc]$/i; if (/^e$/i) { system("$more test-stderr"); @@ -3126,6 +3214,7 @@ foreach $test (@test_list) } } + $retry = 1 if /^r$/i; $docheck = 0; } @@ -3148,10 +3237,10 @@ foreach $test (@test_list) for (;;) { - print "\nShow server stdout, Continue, or Quit? [Q] "; + print "\nShow server stdout, Retry, Continue, or Quit? [Q] "; $_ = ; tests_exit(1) if /^q?$/i; - last if /^c$/i; + last if /^[rc]$/i; if (/^s$/i) { @@ -3161,6 +3250,7 @@ foreach $test (@test_list) close(S); } } + $retry = 1 if /^r$/i; } } } @@ -3171,6 +3261,13 @@ foreach $test (@test_list) # function returns 0 if all is well, 1 if we should rerun the test (the files # have been updated). It does not return if the user responds Q to a prompt. + if ($retry) + { + $retry = '0'; + print (("#" x 79) . "\n"); + redo; + } + if ($docheck) { if (check_output() != 0) @@ -3194,4 +3291,4 @@ tests_exit(-1, "No runnable tests selected") if @test_list == 0; tests_exit(0); # End of runtest script - +# vim: set sw=2 :