X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/8dfac75958fa63fcc463075742f99ec6b1297b64..9d38e6c3845871c8774cd6494163b1625235080a:/test/runtest diff --git a/test/runtest b/test/runtest index 69c6931b0..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); @@ -598,7 +611,7 @@ 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. - if (s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/\1\2/) { + if (s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/$1$2/) { s/ +/ /g; } @@ -1360,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 @@ -1541,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); } @@ -1816,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 (