diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2023-01-20 17:41:14 +0000 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2023-08-09 12:08:39 +0100 |
commit | ecb6fe6728708adefdf4f2f2aad134e36f09fc28 (patch) | |
tree | 4bf64d03cd6b6e4e329ac8e7a8cbc0dc283ca695 /test | |
parent | 4e871f9b28dff4cacfd012aede1d092cc8cfbd36 (diff) |
Testsuite: support TLS cross-library testing
Diffstat (limited to 'test')
-rw-r--r-- | test/README | 5 | ||||
-rwxr-xr-x | test/patchexim | 12 | ||||
-rwxr-xr-x | test/runtest | 73 |
3 files changed, 80 insertions, 10 deletions
diff --git a/test/README b/test/README index 6c9a2d8da..d013f7823 100644 --- a/test/README +++ b/test/README @@ -301,6 +301,11 @@ There are some options for the ./runtest script itself: -SLOW For very slow hosts that appear to have Heisenbugs, delay before comparing output files from a testcase + -TLS <client> For cross-library testing. Specify 'openssl" or 'gnutls' + as the client; the other is used as the server (assumes that + both have been built: set up Local/Makefile for OpenSSL and + "make exim_openssl", then for GnuTLS and "make exim_gnutls") + The options for ./runtest must be given first (but after the name of the binary, if present). Any further options, that is, items on the command line that start with a hyphen, are passed to the Exim binary when it is run as part diff --git a/test/patchexim b/test/patchexim index 2a4077820..a006022e0 100755 --- a/test/patchexim +++ b/test/patchexim @@ -2,6 +2,7 @@ use strict; use warnings; +use Getopt::Std; ############################################################################### # This is an auxiliary script that is part of the Exim test suite. It must be # @@ -11,10 +12,17 @@ use warnings; # # # The only argument to this script is the name of the Exim binary that is to # # be copied. The script must be run in the correct current directory. # +# # +# One option, -o <outfile> can be given. Default is "eximdir/exim" # ############################################################################### +our ($opt_o); +getopts('o:'); + +my $outfile = defined($opt_o) ? $opt_o : 'eximdir/exim'; + open(IN, $ARGV[0]) || die "** Failed to open $ARGV[0]: $!\n"; -open(OUT, '>eximdir/exim') || die "** Failed to open eximdir/exim: $!\n"; +open(OUT, ">$outfile") || die "** Failed to open $outfile: $!\n"; while(<IN>) { @@ -37,6 +45,6 @@ while(<IN>) close(IN); close(OUT); -chmod 04755, 'eximdir/exim'; +chmod 04755, $outfile; # End of patchexim script diff --git a/test/runtest b/test/runtest index 74c53e229..23551861a 100755 --- a/test/runtest +++ b/test/runtest @@ -2759,6 +2759,10 @@ if (/^(cat)?write\s+(\S+)(?:\s+(.*))?\s*$/) 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"; } @@ -2812,15 +2816,15 @@ elsif (/^((?i:[A-Z\d_]+=\S+\s+)+)?(\d+)?\s*(sudo(?:\s+-u\s+(\w+))?\s+)?exim(_\S+ 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; @@ -2852,11 +2856,24 @@ elsif (/^((?i:[A-Z\d_]+=\S+\s+)+)?(\d+)?\s*(sudo(?:\s+-u\s+(\w+))?\s+)?exim(_\S+ 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 @@ -3335,6 +3352,7 @@ GetOptions( '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, @@ -3912,6 +3930,45 @@ else 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. |