#! /usr/bin/perl -w
-# $Cambridge: exim/test/runtest,v 1.37 2010/06/14 20:30:12 jetmore Exp $
-
###############################################################################
# This is the controlling script for the "new" test suite for Exim. It should #
# be possible to export this suite for running on a wide variety of hosts, in #
while(<IN>)
{
+RESET_AFTER_EXTRA_LINE_READ:
# Check for "*** truncated ***"
$yield = 1 if /\*\*\* truncated \*\*\*/;
s?\Q$parm_cwd\E?TESTSUITE?g;
# Replace the Exim version number (may appear in various places)
- s/Exim \d+\.\d+[\w-]*/Exim x.yz/i;
+ # patchexim should have fixed this for us
+ #s/(Exim) \d+\.\d+[\w_-]*/$1 x.yz/i;
# Replace Exim message ids by a unique series
s/((?:[^\W_]{6}-){2}[^\W_]{2})
s/host\s\Q$parm_ipv4\E\s\[\Q$parm_ipv4\E\]/host ipv4.ipv4.ipv4.ipv4 [ipv4.ipv4.ipv4.ipv4]/;
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/(^|\W)\K\Q$parm_ipv6\E/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;
+ s/(^|\W)\K\Q$parm_ipv6r\E/ip6-reverse/g;
s/^(\s+host\s\S+\s+\[\S+\]) +$/$1 /;
# ======== Output from ls ========
# Different operating systems use different spacing on long output
- s/ +/ /g if /^[-rwd]{10} /;
+ #s/ +/ /g if /^[-rwd]{10} /;
+ # (Bug 1226) SUSv3 allows a trailing printable char for modified access method control.
+ # Handle only the Gnu and MacOS space, dot, plus and at-sign. A full [[:graph:]]
+ # unfortunately matches a non-ls linefull of dashes.
+ # Allow the case where we've already picked out the file protection bits.
+ if (s/^([-d](?:[-r][-w][-SsTtx]){3})[.+@]?( +|$)/$1$2/) {
+ s/ +/ /g;
+ }
# ======== Message sizes =========
s/^\d\d\d(?=[PFS*])/ddd/;
+ # ========= Exim lookups ==================
+ # Lookups have a char which depends on the number of lookup types compiled in,
+ # in stderr output. Replace with a "0". Recognising this while avoiding
+ # other output is fragile; perhaps the debug output should be revised instead.
+ s%(?<!sqlite)(?<!lsearch\*@)(?<!lsearch\*)(?<!lsearch)[0-?]TESTSUITE/aux-fixed/%0TESTSUITE/aux-fixed/%g;
+
# ==========================================================
# Some munging is specific to the specific file types
next if /OpenSSL compile-time version: OpenSSL \d+[\.\da-z]+/;
next if /OpenSSL runtime version: OpenSSL \d+[\.\da-z]+/;
+ # drop lookups
+ next if /^Lookups \(built-in\):/;
+ next if /^Loading lookup modules from/;
+ next if /^Loaded \d+ lookup modules/;
+ next if /^Total \d+ lookups/;
+
+ # drop compiler information
+ next if /^Compiler:/;
+
+ # and the ugly bit
+ # different libraries will have different numbers (possibly 0) of follow-up
+ # lines, indenting with more data
+ if (/^Library version:/) {
+ while (1) {
+ $_ = <IN>;
+ next if /^\s/;
+ goto RESET_AFTER_EXTRA_LINE_READ;
+ }
+ }
+
+ # drop other build-time controls emitted for debugging
+ next if /^WHITELIST_D_MACROS:/;
+ next if /^TRUSTED_CONFIG_LIST:/;
+
+ # As of Exim 4.74, we log when a setgid fails; because we invoke Exim
+ # with -be, privileges will have been dropped, so this will always
+ # be the case
+ next if /^changing group to \d+ failed: Operation not permitted/;
+
+ # We invoke Exim with -D, so we hit this new messag as of Exim 4.73:
+ next if /^macros_trusted overridden to true by whitelisting/;
+
# We have to omit the localhost ::1 address so that all is well in
# the IPv4-only case.
# [4] TRUE if this is a log file whose deliveries must be sorted
#
# Returns: 0 comparison succeeded or differences to be ignored
-# 1 comparison failed; files were updated (=> re-compare)
+# 1 comparison failed; files may have been updated (=> re-compare)
#
# Does not return if the user replies "Q" to a prompt.
print "\n";
for (;;)
{
- interact("Continue, Update & retry, Quit? [Q] ", $force_update);
+ interact("Continue, Retry, Update & retry, Quit? [Q] ", $force_update);
tests_exit(1) if /^q?$/i;
return 0 if /^c$/i;
+ return 1 if /^r$/i;
last if (/^u$/i);
}
}
#
# Arguments: none
# Returns: 0 if the output compared equal
-# 1 if files were updated and the test must be re-run
+# 1 if re-run needed (files may have been updated)
sub check_output{
my($yield) = 0;
print "Exim tester $testversion\n";
+##################################################
+# Some tests check created file modes #
+##################################################
+
+umask 022;
+
+
##################################################
# Check for the "less" command #
##################################################
# Find what is in the binary #
##################################################
-open(EXIMINFO, "$parm_exim -C $parm_cwd/confs/0000 -DDIR=$parm_cwd " .
+# deal with TRUSTED_CONFIG_LIST restrictions
+unlink("$parm_cwd/test-config") if -e "$parm_cwd/test-config";
+symlink("$parm_cwd/confs/0000", "$parm_cwd/test-config")
+ or die "Unable to link initial config into place: $!\n";
+
+print("Probing with config file: $parm_cwd/test-config\n");
+open(EXIMINFO, "$parm_exim -d -C $parm_cwd/test-config -DDIR=$parm_cwd " .
"-bP exim_user exim_group|") ||
die "** Cannot run $parm_exim: $!\n";
while(<EXIMINFO>)
if ($parm_eximuser =~ /^\d+$/) { $parm_exim_uid = $parm_eximuser; }
else { $parm_exim_uid = getpwnam($parm_eximuser); }
}
+else
+ {
+ print "Unable to extract exim_user from binary.\n";
+ print "Check if Exim refused to run; if so, consider:\n";
+ print " TRUSTED_CONFIG_LIST ALT_CONFIG_PREFIX WHITELIST_D_MACROS\n";
+ die "Failing to get information from binary.\n";
+ }
if (defined $parm_eximgroup)
{
else { $parm_exim_gid = getgrnam($parm_eximgroup); }
}
-open(EXIMINFO, "$parm_exim -bV -C $parm_cwd/confs/0000 -DDIR=$parm_cwd |") ||
+open(EXIMINFO, "$parm_exim -bV -C $parm_cwd/test-config -DDIR=$parm_cwd |") ||
die "** Cannot run $parm_exim: $!\n";
print "-" x 78, "\n";
close(EXIMINFO);
print "-" x 78, "\n";
+unlink("$parm_cwd/test-config");
##################################################
# Check for SpamAssassin and ClamAV #
print "Program caller is $parm_caller, whose group is $parm_caller_group\n";
print "Home directory is $parm_caller_home\n";
+unless (defined $parm_eximgroup)
+ {
+ print "Unable to derive \$parm_eximgroup.\n";
+ die "** ABANDONING.\n";
+ }
+
print "You need to be in the Exim group to run these tests. Checking ...";
if (`groups` =~ /\b\Q$parm_eximgroup\E\b/)
if ($have_ipv6 && $parm_ipv6 ne "::1")
{
- my(@components) = split /:/, $parm_ipv6;
+ my($exp_v6) = $parm_ipv6;
+ $exp_v6 =~ s/[^:]//g;
+ if ( $parm_ipv6 =~ /^([^:].+)::$/ ) {
+ $exp_v6 = $1 . ':0' x (9-length($exp_v6));
+ } elsif ( $parm_ipv6 =~ /^(.+)::(.+)$/ ) {
+ $exp_v6 = $1 . ':0' x (8-length($exp_v6)) . ':' . $2;
+ } elsif ( $parm_ipv6 =~ /^::(.+[^:])$/ ) {
+ $exp_v6 = '0:' x (9-length($exp_v6)) . $1;
+ }
+ my(@components) = split /:/, $exp_v6;
my(@nibbles) = reverse (split /\s*/, shift @components);
my($sep) = "";
tests_exit(0);
# End of runtest script
-
+# vim: set sw=2 :