RESET_AFTER_EXTRA_LINE_READ:
if ($munge_skip)
{
- # Munging is a no-op.
+ # Munging is a no-op, except for exim_msgdate specials.
# Useful when testing exim_msgdate so that
# we compare unmunged dates and message-ids.
+ s%^localhost \d+ from message-id != given number \d+ at \K/.+(?=/test/eximdir/exim_msgdate line 387.$)%DIR%;
+
print MUNGED;
next;
}
s/\bgid=\d+/gid=gggg/;
s/\begid=\d+/egid=gggg/;
s/\b(?:pid=|pid\s|PID:\s|Process\s|child\s)\K(\d+)/new_value($1, "p%s", \$next_pid)/gxe;
+ s/ Ci=\K(\d+)/new_value($1, "p%s", \$next_pid)/gxe;
s/\buid=\d+/uid=uuuu/;
s/\beuid=\d+/euid=uuuu/;
s/set_process_info:\s+\d+/set_process_info: pppp/;
s/([\s,])S=\d+\b/$1S=sss/;
s/:S\d+\b/:Ssss/;
- s/^(\s*\d+m\s+)\d+(\s+[a-z0-9-]{23} <)/$1sss$2/i if $is_stdout;
+ s/^(\s*\d+[mhd]\s+)\d+(\s+(?:[a-z0-9-]{23}|[a-z0-9-]{18}) <)/TTT sss$2/i if $is_stdout;
s/\sSIZE=\d+\b/ SIZE=ssss/;
s/\ssize=\d+\b/ size=sss/ if $is_stderr;
s/old size = \d+\b/old size = sssss/;
# DMARC is not always supported by the build
next if /^dmarc_tld_file =/;
+ # timestamp in dmarc history file
+ s/received \K\d{10}$/1692480217/;
# ARC is not always supported by the build
next if /^arc_sign =/;
s/250-AUTH ANONYMOUS PLAIN SCRAM-SHA-1\K SCRAM-SHA-256//;
# mailq times change with when the run is done, vs. static-source spoolfiles
- #s/\s*\d*[hd](?= 317 [0-9A-Za-z\-]{23} <nobody@test.ex>)/DDd/;
- s/^\s*\d*[hd](?= 317 [0-9A-Za-z\-]{23} <nobody@test.)/DDd/;
+ s/\s*\d*[hd](?= 317 [0-9A-Za-z\-]{23} <nobody\@test.ex>)/DDd/;
}
# ======== stderr ========
# OpenSSL version variances
s/(TLS error on connection [^:]*: error:)[0-9A-F]{8}(:system library):(?:fopen|func\(4095\)|):(No such file or directory)$/$1xxxxxxxx$2:fopen:$3/;
- next if /TLS error \(SSL_read\): error:0A000126:SSL routines::unexpected eof while reading$/ ;
+ next if /TLS error \(SSL_read\): .*error:0A000126:SSL routines::unexpected eof while reading$/ ;
s/EVDATA: \K\(SSL_accept\): error:0A000126:SSL routines::unexpected eof while reading/SSL_accept: TCP connection closed by peer/;
s/(DANE attempt failed.*error:)[0-9A-F]{8}(:SSL routines:)(?:(?i)ssl3_get_server_certificate|tls_process_server_certificate|CONNECT_CR_CERT|)(?=:certificate verify failed$)/$1xxxxxxxx$2ssl3_get_server_certificate/;
s/(DKIM: validation error: )error:[0-9A-F]{8}:rsa routines:(?:(?i)int_rsa_verify|CRYPTO_internal):(?:bad signature|algorithm mismatch)$/$1Public key signature verification has failed./;
for (my $i = 0; $i < @munged; $i++)
{
- if ($munged[$i] =~ /^[-\d]{10}\s[:\d]{8}\s[-A-Za-z\d]{16}\s[-=*]>/)
+ if ($munged[$i] =~ /^[-\d]{10}\s[:\d]{8}(\.\d{3})?\s[-A-Za-z\d]{23}\s[-=*]>/)
{
my $j;
for ($j = $i + 1; $j < @munged; $j++)
{
last if $munged[$j] !~
- /^[-\d]{10}\s[:\d]{8}\s[-A-Za-z\d]{16}\s[-=*]>/;
+ /^[-\d]{10}\s[:\d]{8}(\.\d{3})?\s[-A-Za-z\d]{23}\s[-=*]>/;
}
@temp = splice(@munged, $i, $j - $i);
@temp = sort(@temp);
if (/^client/ || /^(sudo\s+)?perl\b/)
{
+ if (defined($tls)) {
+ s/^client-anytls/client-ssl/ if ($tls eq 'openssl');
+ s/^client-anytls/client-gnutls/ if ($tls eq 'gnutls');
+ }
s"client"./bin/client";
$cmd = "$_ >>test-stdout 2>>test-stderr";
}
if (defined $queuespec)
{
- @listcmd = ("$parm_cwd/eximdir/exim", '-bp',
+ @listcmd = ("$parm_cwd/$exim_server", '-bp',
$queuespec,
- "-DEXIM_PATH=$parm_cwd/eximdir/exim",
+ "-DEXIM_PATH=$parm_cwd$exim_server",
-C => "$parm_cwd/test-config");
}
else
{
- @listcmd = ("$parm_cwd/eximdir/exim", '-bp',
- "-DEXIM_PATH=$parm_cwd/eximdir/exim",
+ @listcmd = ("$parm_cwd/$exim_server", '-bp',
+ "-DEXIM_PATH=$parm_cwd/$exim_server",
-C => "$parm_cwd/test-config");
}
print ">> Getting queue list from:\n>> @listcmd\n" if $debug;
my $opt_valgrind = $valgrind ? "valgrind --leak-check=yes --suppressions=$parm_cwd/aux-fixed/valgrind.supp " : '';
- $cmd = "$envset$sudo$opt_valgrind" .
- "$parm_cwd/eximdir/exim$special$optargs " .
- "-DEXIM_PATH=$parm_cwd/eximdir/exim$special " .
- "-C $parm_cwd/test-config $args " .
+ $cmd = "$envset$sudo$opt_valgrind";
+
+ if ($special ne '') {
+ $cmd .= "$parm_cwd/eximdir/exim$special$optargs " .
+ "-DEXIM_PATH=$parm_cwd/eximdir/exim$special ";
+ }
+ elsif ($args =~ /(^|\s)-DSERVER=server\s/) {
+ $cmd .= "$parm_cwd/$exim_server$optargs " .
+ "-DEXIM_PATH=$parm_cwd/$exim_server ";
+ }
+ else {
+ $cmd .= "$parm_cwd/$exim_client$optargs " .
+ "-DEXIM_PATH=$parm_cwd/$exim_client ";
+ }
+
+ $cmd .= "-C $parm_cwd/test-config $args " .
">>test-stdout 2>>test-stderr";
+
# If the command is starting an Exim daemon, we run it in the same
# way as the "server" command above, that is, we don't want to wait
# for the process to finish. That happens when "killdaemon" is obeyed later
'ipv6!' => \$have_ipv6,
'keep' => \$save_output,
'slow' => \$slow,
+ 'tls=s' => \my $tls,
'valgrind' => \$valgrind,
'range=s{2}' => \my @range_wanted,
'test=i@' => \my @tests_wanted,
die "** Unable to make patched exim: $!\n"
if (system("sudo ./patchexim $parm_exim") != 0);
+# If TLS-library-specific binaries have been made, grab them too
+
+$suff = 'openssl';
+$f = $parm_exim . '_' . $suff;
+if (-f $f) {
+ $exim_openssl = "eximdir/exim_$suff";
+ die "** Unable to make patched exim: $!\n"
+ if (system("sudo ./patchexim -o $exim_openssl $f") != 0);
+ }
+$suff = 'gnutls';
+$f = $parm_exim . '_' . $suff;
+if (-f $f) {
+ $exim_gnutls = "eximdir/exim_$suff";
+ die "** Unable to make patched exim: $!\n"
+ if (system("sudo ./patchexim -o $exim_gnutls $f") != 0);
+ }
+
+if (defined($tls))
+ {
+ die "** Need both $exim_openssl and $exim_gnutls for cross-library teting\n"
+ if ( !defined($exim_openssl) || !defined($exim_gnutls) );
+ if ($tls eq 'openssl')
+ {
+ $exim_client = $exim_openssl;
+ $exim_server = $exim_gnutls;
+ }
+ elsif ($tls eq 'gnutls')
+ {
+ $exim_client = $exim_gnutls;
+ $exim_server = $exim_openssl;
+ }
+ else
+ { die "** need eother openssl or gnutls speified as the client for cross-library testing, saw $tls\n"; }
+ }
+else
+ { $exim_client = $exim_server = 'eximdir/exim'; }
+print ">> \$exim_client <$exim_client>\n";;
+print ">> \$exim_server <$exim_server>\n";;
+
# From this point on, exits from the program must go via the subroutine
# tests_exit(), so that suitable cleaning up can be done when required.
# Arrange to catch interrupting signals, to assist with this.