Fix from Dean Brooks for ratelimit per_rcpt in acl_not_smtp.
[users/jgh/exim.git] / test / runtest
index acff149af00169ef0f3f4b52751a04f6f68e1092..397ea474d49bf72aaade097c2feebd5838548491 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# $Cambridge: exim/test/runtest,v 1.2 2006/02/08 14:28:51 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.10 2006/04/28 13:46:36 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.61 (06-Feb-06)";
+$testversion = "4.62 (20-Apr-06)";
 
 $cf = "bin/cf";
 $cr = "\r";
@@ -36,6 +36,7 @@ $server_opts = "";
 
 $have_ipv4 = 1;
 $have_ipv6 = 1;
+$have_largefiles = 0;
 
 $test_start = 1;
 $test_end = $test_top = 8999;
@@ -417,6 +418,7 @@ while(<IN>)
   # Time to retry may vary
   s/time to retry = \S+/time to retry = tttt/;
   s/retry record exists: age=\S+/retry record exists: age=ttt/;
+  s/failing_interval=\S+ message_age=\S+/failing_interval=ttt message_age=ttt/;
 
   # 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;
@@ -524,6 +526,8 @@ while(<IN>)
   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/\b\Q$parm_ipv4r\E\b/ip4-reverse/g;
+  s/\b\Q$parm_ipv6r\E\b/ip6-reverse/g;
 
 
   # ======== Test network IP addresses ========
@@ -611,9 +615,9 @@ while(<IN>)
   s/\b\d+\.H\d+P\d+\b/dddddddddd.HddddddPddddd/;
 
   # Maildirsize data
-  if (/^\d+S,\d+C\s*$/)
+  while (/^\d+S,\d+C\s*$/)
     {
-    print MUNGED "dddS,dC\n";
+    print MUNGED;
     while (<IN>)
       {
       last if !/^\d+ \d+\s*$/;
@@ -621,6 +625,7 @@ while(<IN>)
       }
     last if !defined $_;
     }
+  last if !defined $_;
 
 
   # ======== Output from the "fd" program about open descriptors ========
@@ -646,9 +651,11 @@ while(<IN>)
 
   if ($is_stdout)
     {
-    # Skip translate_ip_address in -bP output because it ain't always there
+    # Skip translate_ip_address and use_classresources in -bP output because
+    # they aren't always there.
 
     next if /translate_ip_address =/;
+    next if /use_classresources/;
 
     # In certain filter tests, remove initial filter lines because they just
     # clog up by repetition.
@@ -787,7 +794,8 @@ while(<IN>)
                 /^Transports:/ ||
                 /^log selectors =/ ||
                 /^cwd=/ ||
-                /^Fixed never_users:/
+                /^Fixed never_users:/ ||
+                /^Size of off_t:/
                 );
       }
 
@@ -1458,7 +1466,7 @@ if (/^sleep\s+(.*)$/)
 
 # Various Unix management commands are recognized
 
-if (/^(ln|ls|du|mkdir|mkfifo|touch|cp)\s/ ||
+if (/^(ln|ls|du|mkdir|mkfifo|touch|cp|cat)\s/ ||
     /^sudo (rmdir|rm|chown|chmod)\s/)
   {
   run_system("$_ >>test-stdout 2>>test-stderr");
@@ -1951,9 +1959,14 @@ while (<EXIMINFO>)
   {
   my(@temp);
 
-  if (/^Exim version/) { print; next; }
+  if (/^Exim version/) { print; }
 
-  if (/^Support for: (.*)/)
+  elsif (/^Size of off_t: (\d+)/)
+    {
+    $have_largefiles = 1 if $1 > 4;
+    }
+
+  elsif (/^Support for: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1961,7 +1974,7 @@ while (<EXIMINFO>)
     %parm_support = @temp;
     }
 
-  if (/^Lookups: (.*)/)
+  elsif (/^Lookups: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1969,7 +1982,7 @@ while (<EXIMINFO>)
     %parm_lookups = @temp;
     }
 
-  if (/^Authenticators: (.*)/)
+  elsif (/^Authenticators: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1977,7 +1990,7 @@ while (<EXIMINFO>)
     %parm_authenticators = @temp;
     }
 
-  if (/^Routers: (.*)/)
+  elsif (/^Routers: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1989,7 +2002,7 @@ while (<EXIMINFO>)
   # that the basic transport name is set, and then the name with each of the
   # options.
 
-  if (/^Transports: (.*)/)
+  elsif (/^Transports: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -2101,30 +2114,74 @@ if (defined $parm_support{'Content_Scanning'})
         }
       }
 
+    # Read the ClamAV configuration file and find the socket interface.
+
     if ($clamconf ne "")
       {
+      my $socket_domain;
       open(IN, "$clamconf") || die "\n** Unable to open $clamconf: $!\n";
       while (<IN>)
         {
         if (/^LocalSocket\s+(.*)/)
           {
           $parm_clamsocket = $1;
+          $socket_domain = AF_UNIX;
           last;
           }
+        if (/^TCPSocket\s+(\d+)/)
+          {
+          if (defined $parm_clamsocket)
+            {
+            $parm_clamsocket .= " $1";
+            $socket_domain = AF_INET;
+            last;
+            }
+          else
+            {
+            $parm_clamsocket = " $1";
+            }
+          }
+        elsif (/^TCPAddr\s+(\S+)/)
+          {
+          if (defined $parm_clamsocket)
+            {
+            $parm_clamsocket = $1 . $parm_clamsocket;
+            $socket_domain = AF_INET;
+            last;
+            }
+          else
+            {
+            $parm_clamsocket = $1;
+            }
+          }
         }
       close(IN);
-      if (-e $parm_clamsocket)
+
+      if (defined $socket_domain)
         {
         print ":\n  The clamd socket is $parm_clamsocket\n";
         # This test for an active ClamAV is courtesy of Daniel Tiefnig.
         eval
           {
-          my $sun = sockaddr_un($parm_clamsocket) or die "** Failed packing '$parm_clamsocket'\n";
-          socket(SOCK, AF_UNIX, SOCK_STREAM, 0) or die "** Unable to open socket '$parm_clamsocket'\n";
-
+          my $socket;
+          if ($socket_domain == AF_UNIX)
+            {
+            $socket = sockaddr_un($parm_clamsocket) or die "** Failed packing '$parm_clamsocket'\n";
+            }
+          elsif ($socket_domain == AF_INET)
+            {
+            my ($ca_host, $ca_port) = split(/\s+/,$parm_clamsocket);
+            my $ca_hostent = gethostbyname($ca_host) or die "** Failed to get raw address for host '$ca_host'\n";
+            $socket = sockaddr_in($ca_port, $ca_hostent) or die "** Failed packing '$parm_clamsocket'\n";
+            }
+          else
+            {
+            die "** Unknown socket domain '$socket_domain' (should not happen)\n";
+            }
+          socket(SOCK, $socket_domain, SOCK_STREAM, 0) or die "** Unable to open socket '$parm_clamsocket'\n";
           local $SIG{ALRM} = sub { die "** Timeout while connecting to socket '$parm_clamsocket'\n"; };
           alarm(5);
-          connect(SOCK, $sun) or die "** Unable to connect to socket '$parm_clamsocket'\n";
+          connect(SOCK, $socket) or die "** Unable to connect to socket '$parm_clamsocket'\n";
           alarm(0);
 
           my $ofh = select SOCK; $| = 1; select $ofh;
@@ -2152,7 +2209,7 @@ if (defined $parm_support{'Content_Scanning'})
         }
       else
         {
-        print ", but the socket for clamd does not exist\n";
+        print ", but the socket for clamd could not be determined\n";
         print "Assume ClamAV is not running\n";
         }
       }
@@ -2349,6 +2406,24 @@ else
 print "IPv4 address is $parm_ipv4\n";
 print "IPv6 address is $parm_ipv6\n";
 
+# For munging test output, we need the reversed IP addresses.
+
+$parm_ipv4r = ($parm_ipv4 !~ /^\d/)? "" :
+  join(".", reverse(split /\./, $parm_ipv4));
+
+$parm_ipv6r = "";
+if ($parm_ipv6 =~ /^[\da-f]/)
+  {
+  my(@comps) = split /:/, $parm_ipv6;
+  my(@nibbles);
+  foreach $comp (@comps)
+    {
+    push @nibbles, sprintf("%lx", hex($comp) >> 8);
+    push @nibbles, sprintf("%lx", hex($comp) & 0xff);
+    }
+  $parm_ipv6r = join(".", reverse(@nibbles));
+  }
+
 # Find the host name, fully qualified.
 
 chomp($temp = `hostname`);
@@ -2504,12 +2579,25 @@ opendir(DIR, "scripts") || tests_exit(-1, "Failed to opendir(\"scripts\"): $!");
 @test_dirs = sort readdir(DIR);
 closedir(DIR);
 
+# Remove . and .. and CVS from the list.
+
+for ($i = 0; $i < @test_dirs; $i++)
+  {
+  my($d) = $test_dirs[$i];
+  if ($d eq "." || $d eq ".." || $d eq "CVS")
+    {
+    splice @test_dirs, $i, 1;
+    $i--;
+    }
+  }
+
+# Scan for relevant tests
+
 for ($i = 0; $i < @test_dirs; $i++)
   {
   my($testdir) = $test_dirs[$i];
   my($wantthis) = 1;
 
-  next if $testdir eq "." || $testdir eq "..";
   print ">>Checking $testdir\n" if $debug;
 
   # Skip this directory if the first test is equal or greater than the first
@@ -2852,6 +2940,15 @@ foreach $test (@test_list)
       if (/^rmfiltertest/)     { $rmfiltertest = 1; next; }
       if (/^sortlog/)          { $sortlog = 1; next; }
 
+      if (/^need_largefiles/)
+        {
+        next if $have_largefiles;
+        print ">>> Large file support is needed for test $testno, but is not available: skipping\n";
+        $docheck = 0;      # don't check output
+        undef $_;          # pretend EOF
+        last;
+        }
+
       if (/^need_ipv4/)
         {
         next if $have_ipv4;