Test suite portability updates.
[users/heiko/exim.git] / test / runtest
index 37b6fbed47b7ee7e8270fc7ab9a600942a46a9c0..775f658e2834382aed2f70d663debb527607c121 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# $Cambridge: exim/test/runtest,v 1.12 2006/07/04 09:07:20 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.26 2007/04/17 13:05:41 ph10 Exp $
 
 ###############################################################################
 # This is the controlling script for the "new" test suite for Exim. It should #
@@ -23,7 +23,7 @@ use Socket;
 
 # Start by initializing some global variables
 
-$testversion = "4.62 (20-Apr-06)";
+$testversion = "4.67 (16-Apr-07)";
 
 $cf = "bin/cf";
 $cr = "\r";
@@ -98,6 +98,7 @@ sub inthandler { print "\n"; tests_exit(-1, "Caught SIGINT"); }
 
 sub do_substitute{
 s?\bCALLER\b?$parm_caller?g;
+s?\bCALLERGROUP\b?$parm_caller_group?g;
 s?\bCALLER_UID\b?$parm_caller_uid?g;
 s?\bCALLER_GID\b?$parm_caller_gid?g;
 s?\bCLAMSOCKET\b?$parm_clamsocket?g;
@@ -358,6 +359,10 @@ while(<IN>)
   # Random local part in callout cache testing
   s/myhost.test.ex-\d+-testing/myhost.test.ex-dddddddd-testing/;
 
+  # File descriptor numbers may vary
+  s/^writing data block fd=\d+/writing data block fd=dddd/;
+  s/running as transport filter: write=\d+ read=\d+/running as transport filter: write=dddd read=dddd/;
+
 
   # ======== Dumpdb output ========
   # This must be before the general date/date munging.
@@ -424,6 +429,13 @@ while(<IN>)
   # Date/time in exim -bV output
   s/\d\d-[A-Z][a-z]{2}-\d{4}\s\d\d:\d\d:\d\d/07-Mar-2000 12:21:52/g;
 
+  # Time on queue tolerance
+  s/QT=1s/QT=0s/;
+
+  # Eximstats heading
+  s/Exim\sstatistics\sfrom\s\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d\sto\s
+    \d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d/Exim statistics from <time> to <time>/x;
+
 
   # ======== Caller's login, uid, gid, home ========
 
@@ -451,9 +463,10 @@ while(<IN>)
 
 
   # ======== Exim's login ========
-  # For bounce messages, this will appear on the U= lines in logs and also
-  # after Received: and in addresses. In one pipe test it appears after
-  # "Running as:". It also appears in addresses, and in the names of lock
+  # For messages received by the daemon, this is in the -H file, which some
+  # tests inspect. For bounce messages, this will appear on the U= lines in
+  # logs and also after Received: and in addresses. In one pipe test it appears
+  # after "Running as:". It also appears in addresses, and in the names of lock
   # files.
 
   s/U=$parm_eximuser/U=EXIMUSER/;
@@ -470,6 +483,8 @@ while(<IN>)
   s/\buid=$parm_exim_uid\b/uid=EXIM_UID/g;
   s/\bgid=$parm_exim_gid\b/gid=EXIM_GID/g;
 
+  s/^$parm_eximuser $parm_exim_uid $parm_exim_gid/EXIMUSER EXIM_UID EXIM_GID/;
+
 
   # ======== General uids, gids, and pids ========
   # Note: this must come after munges for caller's and exim's uid/gid
@@ -489,6 +504,10 @@ while(<IN>)
   # Pid in temp file in appendfile transport
   s"test-mail/temp\.\d+\."test-mail/temp.pppp.";
 
+  # Optional pid in log lines
+  s/^(\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d)(\s[+-]\d\d\d\d|)(\s\[\d+\])/
+    "$1$2 [" . new_value($3, "%s", \$next_pid) . "]"/gxe;
+
   # Detect a daemon stderr line with a pid and save the pid for subsequent
   # removal from following lines.
   $spid = $1 if /^(\s*\d+) (?:listening|LOG: MAIN|(?:daemon_smtp_port|local_interfaces) overridden by)/;
@@ -505,8 +524,8 @@ while(<IN>)
   s/\(port=(\d+)/"(port=" . new_value($1, "%s", \$next_port)/e;
 
   # This handles "connection from" and the like, when the port is given
-  if (!/listening for SMTP on/ && !/Connecting to/ && !/=>/ && !/\*>/ &&
-      !/Connection refused/)
+  if (!/listening for SMTP on/ && !/Connecting to/ && !/=>/ && !/->/
+      && !/\*>/ && !/Connection refused/)
     {
     s/\[([a-z\d:]+|\d+(?:\.\d+){3})\]:(\d+)/"[".$1."]:".new_value($2,"%s",\$next_port)/ie;
     }
@@ -569,7 +588,7 @@ while(<IN>)
   s/([\s,])S=\d+\b/$1S=sss/;
   s/:S\d+\b/:Ssss/;
   s/^(\s*\d+m\s+)\d+(\s+[a-z0-9-]{16} <)/$1sss$2/i if $is_stdout;
-  s/\sSIZE=\d+\b/ SIZE=ssss/ if $is_stderr || $is_stdout;
+  s/\sSIZE=\d+\b/ SIZE=ssss/;
   s/\ssize=\d+\b/ size=sss/ if $is_stderr;
   s/old size = \d+\b/old size = sssss/;
   s/message size = \d+\b/message size = sss/;
@@ -582,10 +601,12 @@ while(<IN>)
   s/\+0100,\d+;/+0100,ddd;/;
   s/\(\d+ bytes written\)/(ddd bytes written)/;
   s/added '\d+ 1'/added 'ddd 1'/;
+  s/Received\s+\d+/Received               nnn/;
+  s/Delivered\s+\d+/Delivered              nnn/;
 
 
   # ======== Values in spool space failure message ========
-  s/space=\d+ inodes=\d+/space=xxxxx inodes=xxxxx/;
+  s/space=\d+ inodes=[+-]?\d+/space=xxxxx inodes=xxxxx/;
 
 
   # ======== Filter sizes ========
@@ -1387,7 +1408,7 @@ if (/^exim_lock\s+(.*)$/)
   # This gives the process time to get started; otherwise the next
   # process may not find it there when it expects it.
 
-  select(undef, undef, undef, 0.01);
+  select(undef, undef, undef, 0.1);
   return 3;
   }
 
@@ -1405,6 +1426,30 @@ if (/^exinext\s+(.*)/)
   }
 
 
+# The "exigrep" command runs exigrep on the current mainlog
+
+if (/^exigrep\s+(.*)/)
+  {
+  run_system("(./eximdir/exigrep " .
+    "$1 $parm_cwd/spool/log/mainlog;" .
+    "echo exigrep exit code = \$?)" .
+    ">>test-stdout");
+  return 1;
+  }
+
+
+# The "eximstats" command runs eximstats on the current mainlog
+
+if (/^eximstats\s+(.*)/)
+  {
+  run_system("(./eximdir/eximstats " .
+    "$1 $parm_cwd/spool/log/mainlog;" .
+    "echo eximstats exit code = \$?)" .
+    ">>test-stdout");
+  return 1;
+  }
+
+
 # The "gnutls" command makes a copy of saved GnuTLS parameter data in the
 # spool directory, to save Exim from re-creating it each time.
 
@@ -1509,7 +1554,7 @@ if (/^server\s+(.*)$/)
   # This gives the server time to get started; otherwise the next
   # process may not find it there when it expects it.
 
-  select(undef, undef, undef, 0.01);
+  select(undef, undef, undef, 0.5);
   return 3;
   }
 
@@ -1589,12 +1634,12 @@ if (/^(cat)?write\s+(\S+)(?:\s+(.*))?\s*$/)
 # command in the variable $cmd. Shared code to run this command and handle its
 # input and output follows.
 
-# The "client" and "client-ssl" commands run a script-driven program that plays
-# the part of an email client. We also have the availability of running Perl
-# for doing one-off special things. Note that all these commands expect stdin
-# data to be supplied.
+# The "client", "client-gnutls", and "client-ssl" commands run a script-driven
+# program that plays the part of an email client. We also have the availability
+# of running Perl for doing one-off special things. Note that all these
+# commands expect stdin data to be supplied.
 
-if (/^client/ || /^client-ssl/ || /^(sudo\s+)?perl\b/)
+if (/^client/ || /^(sudo\s+)?perl\b/)
   {
   s"client"./bin/client";
   $cmd = "$_ >>test-stdout 2>>test-stderr";
@@ -1686,9 +1731,11 @@ elsif (/^([A-Z_]+=\S+\s+)?(\d+)?\s*(sudo\s+)?exim(_\S+)?\s+(.*)$/)
 
     # Before running the command, convert the -bd option into -bdf so that an
     # Exim daemon doesn't double fork. This means that when we wait close
-    # DAEMONCMD, it waits for the correct process.
+    # DAEMONCMD, it waits for the correct process. Also, ensure that the pid
+    # file is written to the spool directory, in case the Exim binary was
+    # built with PID_FILE_PATH pointing somewhere else.
 
-    $cmd =~ s/\s-bd\s/ -bdf /;
+    $cmd =~ s!\s-bd\s! -bdf -oP $parm_cwd/spool/exim-daemon.pid !;
     print ">> |${cmd}-server\n" if ($debug);
     open DAEMONCMD, "|${cmd}-server" || tests_exit(-1, "Failed to run $cmd");
     DAEMONCMD->autoflush(1);
@@ -2037,7 +2084,6 @@ if (defined $parm_support{'Content_Scanning'})
   {
   if (system("spamc -h 2>/dev/null >/dev/null") == 0)
     {
-    $parm_running{'SpamAssassin'} = ' ';
     print "The spamc command works:\n";
 
     # This test for an active SpamAssassin is courtesy of John Jetmore.
@@ -2199,7 +2245,7 @@ if (defined $parm_support{'Content_Scanning'})
 
         if($@)
           {
-          warn $@;
+          print "  $@";
           print "  Assume ClamAV is not running\n";
           }
         else
@@ -2412,7 +2458,7 @@ print "IPv6 address is $parm_ipv6\n";
 $parm_ipv4r = ($parm_ipv4 !~ /^\d/)? "" :
   join(".", reverse(split /\./, $parm_ipv4));
 
-$parm_ipv6r = "";
+$parm_ipv6r = $parm_ipv6;             # Appropriate if not in use
 if ($parm_ipv6 =~ /^[\da-f]/)
   {
   my(@comps) = split /:/, $parm_ipv6;
@@ -2526,6 +2572,16 @@ if (system("cp $parm_exim_dir/exinext eximdir") != 0)
   tests_exit(-1, "Failed to make a copy of exinext: $!");
   }
 
+if (system("cp $parm_exim_dir/exigrep eximdir") != 0)
+  {
+  tests_exit(-1, "Failed to make a copy of exigrep: $!");
+  }
+
+if (system("cp $parm_exim_dir/eximstats eximdir") != 0)
+  {
+  tests_exit(-1, "Failed to make a copy of eximstats: $!");
+  }
+
 
 ##################################################
 #    Check that the Exim user can access stuff   #
@@ -2895,6 +2951,7 @@ foreach $test (@test_list)
 
   undef %cache;
   $next_msgid = "aX";
+  $next_pid = 1234;
   $next_port = 1111;
   $message_skip = 0;
   $msglog_skip = 0;