Update the test suite's runtest script to allow for ClamAV support via
[users/jgh/exim.git] / test / runtest
index acff149af00169ef0f3f4b52751a04f6f68e1092..699030bda7aaff53a51321a22756111445dd056a 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.5 2006/02/16 14:34:42 ph10 Exp $
 
 ###############################################################################
 # This is the controlling script for the "new" test suite for Exim. It should #
@@ -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;
@@ -613,7 +615,7 @@ while(<IN>)
   # Maildirsize data
   if (/^\d+S,\d+C\s*$/)
     {
-    print MUNGED "dddS,dC\n";
+    print MUNGED;
     while (<IN>)
       {
       last if !/^\d+ \d+\s*$/;
@@ -787,7 +789,8 @@ while(<IN>)
                 /^Transports:/ ||
                 /^log selectors =/ ||
                 /^cwd=/ ||
-                /^Fixed never_users:/
+                /^Fixed never_users:/ ||
+                /^Size of off_t:/
                 );
       }
 
@@ -1458,7 +1461,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 +1954,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 +1969,7 @@ while (<EXIMINFO>)
     %parm_support = @temp;
     }
 
-  if (/^Lookups: (.*)/)
+  elsif (/^Lookups: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1969,7 +1977,7 @@ while (<EXIMINFO>)
     %parm_lookups = @temp;
     }
 
-  if (/^Authenticators: (.*)/)
+  elsif (/^Authenticators: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1977,7 +1985,7 @@ while (<EXIMINFO>)
     %parm_authenticators = @temp;
     }
 
-  if (/^Routers: (.*)/)
+  elsif (/^Routers: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1989,7 +1997,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 +2109,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 +2204,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";
         }
       }
@@ -2852,6 +2904,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;