X-Git-Url: https://git.exim.org/users/heiko/exim.git/blobdiff_plain/21c28500c0afea85a4acc9cd2e6c816522394431..1cc59d374be28e0f2a27720d003271216676c12e:/test/runtest?ds=sidebyside diff --git a/test/runtest b/test/runtest index d5a161234..0d5b10504 100755 --- a/test/runtest +++ b/test/runtest @@ -1,6 +1,6 @@ #! /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.22 2007/01/23 14:57:51 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.67 (15-Jan-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() # 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. @@ -413,7 +418,8 @@ while() 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/; @@ -423,6 +429,9 @@ while() # 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/; + # ======== Caller's login, uid, gid, home ======== @@ -526,6 +535,8 @@ while() 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 ======== @@ -582,7 +593,7 @@ while() # ======== 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 ======== @@ -613,7 +624,7 @@ while() 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 () @@ -623,6 +634,7 @@ while() } last if !defined $_; } + last if !defined $_; # ======== Output from the "fd" program about open descriptors ======== @@ -648,9 +660,11 @@ while() 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. @@ -853,7 +867,7 @@ my($rf,$rsf,$mf,$sf,$sortfile) = @_; 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); @@ -1381,7 +1395,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; } @@ -1503,7 +1517,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; } @@ -1583,12 +1597,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"; @@ -1680,9 +1694,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); @@ -2031,7 +2047,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. @@ -2109,30 +2124,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 () { 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; @@ -2149,7 +2208,7 @@ if (defined $parm_support{'Content_Scanning'}) if($@) { - warn $@; + print " $@"; print " Assume ClamAV is not running\n"; } else @@ -2160,7 +2219,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"; } } @@ -2357,6 +2416,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 = $parm_ipv6; # Appropriate if not in use +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`); @@ -2512,12 +2589,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