summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Pennock <pdp@exim.org>2012-05-11 06:21:17 -0400
committerPhil Pennock <pdp@exim.org>2012-05-11 06:21:17 -0400
commit1ca9f5074196f7fa459367956bcf6d4239b47634 (patch)
tree56b8d0b06db461f83166e59e09e7cae9bca98502
parent964551ca40d4f7355bde171e801249405e6c580e (diff)
Testing for -bw mode
-rw-r--r--test/confs/056418
-rw-r--r--test/log/05642
-rw-r--r--test/msglog/0564.10HmaX-0005vi-001
-rwxr-xr-xtest/runtest91
-rw-r--r--test/scripts/0000-Basic/056425
-rw-r--r--test/stdout/056429
6 files changed, 158 insertions, 8 deletions
diff --git a/test/confs/0564 b/test/confs/0564
new file mode 100644
index 000000000..e10445be7
--- /dev/null
+++ b/test/confs/0564
@@ -0,0 +1,18 @@
+# Exim test configuration 0564
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+acl_smtp_rcpt = accept
+acl_smtp_data = accept
+
+queue_only
+
+# End
diff --git a/test/log/0564 b/test/log/0564
new file mode 100644
index 000000000..dbaac4b92
--- /dev/null
+++ b/test/log/0564
@@ -0,0 +1,2 @@
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, launched with listening socket, with no wait timeout
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= userx@test.ex H=(abcd) [127.0.0.1] P=esmtp S=sss
diff --git a/test/msglog/0564.10HmaX-0005vi-00 b/test/msglog/0564.10HmaX-0005vi-00
new file mode 100644
index 000000000..3b44e8802
--- /dev/null
+++ b/test/msglog/0564.10HmaX-0005vi-00
@@ -0,0 +1 @@
+1999-03-02 09:44:33 Received from userx@test.ex H=(abcd) [127.0.0.1] P=esmtp S=sss
diff --git a/test/runtest b/test/runtest
index 8f5d9b60c..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);
@@ -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 (<SCRIPT>) { $lineno++; last if /^\*{4}\s*$/; } # Ignore any input
+ select(undef, undef, undef, 0.3); # Let the daemon get going
+ return (3, { exim_pid => $pid }); # Don't wait
+ }
}
@@ -1916,7 +1971,7 @@ else
# If the first character of the first argument is '/', the argument is taken
# as the path to the binary.
-$parm_exim = (@ARGV > 0 && $ARGV[0] =~ ?^/?)? shift @ARGV : "";
+$parm_exim = (@ARGV > 0 && $ARGV[0] =~ m?^/?)? shift @ARGV : "";
print "Exim binary is $parm_exim\n" if $parm_exim ne "";
@@ -2649,7 +2704,7 @@ system("sudo cp eximdir/exim eximdir/exim_exim;" .
# Certain of the tests make use of some of Exim's utilities. We do not need
# to be root to copy these.
-($parm_exim_dir) = $parm_exim =~ ?^(.*)/exim?;
+($parm_exim_dir) = $parm_exim =~ m?^(.*)/exim?;
$dbm_build_deleted = 0;
if (defined $parm_lookups{'dbm'} &&
@@ -3168,10 +3223,30 @@ foreach $test (@test_list)
my($commandname) = "";
my($expectrc) = 0;
- my($rc) = run_command($testno, \$subtestno, \$expectrc, \$commandname);
+ my($rc, $run_extra) = run_command($testno, \$subtestno, \$expectrc, \$commandname, $TEST_STATE);
my($cmdrc) = $?;
- print ">> rc=$rc cmdrc=$cmdrc\n" if $debug;
+ if ($debug) {
+ print ">> rc=$rc cmdrc=$cmdrc\n";
+ if (defined $run_extra) {
+ foreach my $k (keys %$run_extra) {
+ my $v = defined $run_extra->{$k} ? qq!"$run_extra->{$k}"! : '<undef>';
+ print ">> $k -> $v\n";
+ }
+ }
+ }
+ $run_extra = {} unless defined $run_extra;
+ foreach my $k (keys %$run_extra) {
+ if (exists $TEST_STATE->{$k}) {
+ my $nv = defined $run_extra->{$k} ? qq!"$run_extra->{$k}"! : 'removed';
+ print ">> override of $k; was $TEST_STATE->{$k}, now $nv\n" if $debug;
+ }
+ if (defined $run_extra->{$k}) {
+ $TEST_STATE->{$k} = $run_extra->{$k};
+ } elsif (exists $TEST_STATE->{$k}) {
+ delete $TEST_STATE->{$k};
+ }
+ }
# Hit EOF after an initial return code number
@@ -3291,4 +3366,4 @@ tests_exit(-1, "No runnable tests selected") if @test_list == 0;
tests_exit(0);
# End of runtest script
-# vim: set sw=2 :
+# vim: set sw=2 et :
diff --git a/test/scripts/0000-Basic/0564 b/test/scripts/0000-Basic/0564
new file mode 100644
index 000000000..68fb607ec
--- /dev/null
+++ b/test/scripts/0000-Basic/0564
@@ -0,0 +1,25 @@
+# testing -bw inetd wait mode
+need_ipv4
+#
+exim -DSERVER=wait:PORT_D -bw
+****
+client 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250-
+??? 250
+mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+??? 250
+??? 354
+This is a test message.
+.
+??? 250
+quit
+??? 221
+****
+sleep 1
+killdaemon
diff --git a/test/stdout/0564 b/test/stdout/0564
new file mode 100644
index 000000000..6f4f06bdb
--- /dev/null
+++ b/test/stdout/0564
@@ -0,0 +1,29 @@
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 the.local.host.name ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-the.local.host.name Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-8BITMIME
+??? 250-
+<<< 250-PIPELINING
+??? 250
+<<< 250 HELP
+>>> mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+<<< 250 OK
+??? 250
+<<< 250 Accepted
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .
+??? 250
+<<< 250 OK id=10HmaX-0005vi-00
+>>> quit
+??? 221
+<<< 221 the.local.host.name closing connection
+End of script