#! /usr/bin/perl -w
-# $Cambridge: exim/test/runtest,v 1.4 2006/02/10 16:29:20 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.12 2006/07/04 09:07:20 ph10 Exp $
###############################################################################
# This is the controlling script for the "new" test suite for Exim. It should #
# Start by initializing some global variables
-$testversion = "4.61 (06-Feb-06)";
+$testversion = "4.62 (20-Apr-06)";
$cf = "bin/cf";
$cr = "\r";
my($next) = $3 - $2;
$_ = " first failed=dddd last try=dddd next try=+$next $4\n";
}
- s/^now=\d+ received_time=\d+ diff=\d+ timeout=(\d+)/now=tttt received_time=tttt diff=tttt timeout=$1/;
+ s/^(\s*)now=\d+ first_failed=\d+ next_try=\d+ expired=(\d)/$1now=tttt first_failed=tttt next_try=tttt expired=$2/;
+ s/^(\s*)received_time=\d+ diff=\d+ timeout=(\d+)/$1received_time=tttt diff=tttt timeout=$2/;
# Time to retry may vary
s/time to retry = \S+/time to retry = tttt/;
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 ========
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;
while (<IN>)
}
last if !defined $_;
}
+ last if !defined $_;
# ======== Output from the "fd" program about open descriptors ========
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.
if (! -e $sf)
{
- return 0 if (! -s $rf && ! -s $rsf);
+ return 0 if (! -s $rf && (! defined $rsf || ! -s $rsf));
print "\n";
print "** $rf is not empty\n" if (-s $rf);
}
}
+ # 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;
}
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";
}
}
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`);
@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