X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/c1e49b796a61a19bc61e8c6349e90614690189a0..6a6084f8fd44dc65dce40536198ec5d282deb126:/test/runtest diff --git a/test/runtest b/test/runtest index 2a8dd160c..2eb714e8a 100755 --- a/test/runtest +++ b/test/runtest @@ -21,7 +21,7 @@ use Socket; # Start by initializing some global variables -$testversion = "4.72 (02-Jun-10)"; +$testversion = "4.78 (08-May-12)"; $cf = "bin/cf -exact"; $cr = "\r"; @@ -118,6 +118,12 @@ s?\bV6NET:?$parm_ipv6_test_net:?g; } +################################################## +# Any state to be preserved across tests # +################################################## + +my $TEST_STATE = {}; + ################################################## # Subroutine to tidy up and exit # @@ -140,6 +146,13 @@ my($spool); # than SIGTERM to stop it outputting "Terminated" to the terminal when not in # the background. +if (exists $TEST_STATE->{exim_pid}) + { + $pid = $TEST_STATE->{exim_pid}; + print "Tidyup: killing wait-mode daemon pid=$pid\n"; + system("sudo kill -SIGINT $pid"); + } + if (opendir(DIR, "spool")) { my(@spools) = sort readdir(DIR); @@ -560,9 +573,9 @@ RESET_AFTER_EXTRA_LINE_READ: 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 /; @@ -598,7 +611,9 @@ RESET_AFTER_EXTRA_LINE_READ: # 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. - s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/\1 /; + if (s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/$1$2/) { + s/ +/ /g; + } # ======== Message sizes ========= @@ -687,6 +702,12 @@ RESET_AFTER_EXTRA_LINE_READ: 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%(? re-compare) +# 1 comparison failed; files may have been updated (=> re-compare) # # Does not return if the user replies "Q" to a prompt. @@ -1090,9 +1111,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); } } @@ -1124,7 +1146,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; @@ -1351,17 +1373,21 @@ system("$cmd"); # reference to the subtest number, holding previous value # reference to the expected return code value # reference to where to put the command name (for messages) +# auxilliary information returned from a previous run # # Returns: 0 the commmand was executed inline, no subprocess was run # 1 a non-exim command was run and waited for # 2 an exim command was run and waited for # 3 a command was run and not waited for (daemon, server, exim_lock) # 4 EOF was encountered after an initial return code line +# Optionally alse a second parameter, a hash-ref, with auxilliary information: +# exim_pid: pid of a run process sub run_command{ my($testno) = $_[0]; my($subtestref) = $_[1]; my($commandnameref) = $_[3]; +my($aux_info) = $_[4]; my($yield) = 1; if (/^(\d+)\s*$/) # Handle unusual return code @@ -1532,11 +1558,19 @@ if (/^gnutls/) if (/^killdaemon/) { - $pid = `cat $parm_cwd/spool/exim-daemon.*`; + my $return_extra = {}; + if (exists $aux_info->{exim_pid}) + { + $pid = $aux_info->{exim_pid}; + $return_extra->{exim_pid} = undef; + print ">> killdaemon: recovered pid $pid\n" if $debug; + } else { + $pid = `cat $parm_cwd/spool/exim-daemon.*`; + } run_system("sudo /bin/kill -SIGINT $pid"); close DAEMONCMD; # Waits for process run_system("sudo /bin/rm -f spool/exim-daemon.*"); - return 1; + return (1, $return_extra); } @@ -1807,6 +1841,36 @@ elsif (/^([A-Z_]+=\S+\s+)?(\d+)?\s*(sudo\s+)?exim(_\S+)?\s+(.*)$/) select(undef, undef, undef, 0.3); # Let the daemon get going return 3; # Don't wait } + elsif ($cmd =~ /\s-DSERVER=wait:(\d+)\s/) + { + my $listen_port = $1; + if ($debug) { printf ">> wait-mode daemon: $cmd\n"; } + run_system("sudo mkdir spool/log 2>/dev/null"); + run_system("sudo chown $parm_eximuser:$parm_eximgroup spool/log"); + + my ($s_ip,$s_port) = ('127.0.0.1', $listen_port); + my $sin = sockaddr_in($s_port, inet_aton($s_ip)) + or die "** Failed packing $s_ip:$s_port\n"; + socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')) + or die "** Unable to open socket $s_ip:$s_port: $!\n"; + setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, 1) + or die "** Unable to setsockopt(SO_REUSEADDR): $!\n"; + bind(SOCK, $sin) + or die "** Unable to bind socket ($s_port): $!\n"; + listen(SOCK, 5); + my $pid = fork(); + if (not defined $pid) { die "** fork failed: $!\n" } + if (not $pid) { + close(STDIN); + open(STDIN, "<&", SOCK) or die "** dup sock to stdin failed: $!\n"; + print "[$$]>> ${cmd}-server\n" if ($debug); + exec "exec ${cmd}-server"; + exit(1); + } + while (