From c9a55f6ac1c48adf32a02b21d628c0deb71b3e6f Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Tue, 5 Jun 2012 20:50:30 +0100 Subject: [PATCH] Testsuite: add per-testcase munge facility; use for dnssec and gnutls. --- test/README | 6 +++ test/log/2014 | 1 - test/runtest | 80 +++++++++++++++++++++++++++++------ test/scripts/0000-Basic/0002 | 1 + test/scripts/0000-Basic/0094 | 1 + test/scripts/0000-Basic/0381 | 1 + test/scripts/2000-GnuTLS/2014 | 1 + test/scripts/2000-GnuTLS/2027 | 1 + test/scripts/2200-dnsdb/2202 | 1 + test/stdout/0002 | 6 +++ test/stdout/3450 | 2 +- test/stdout/3454 | 4 +- 12 files changed, 88 insertions(+), 17 deletions(-) diff --git a/test/README b/test/README index 3628da98a..f51217537 100644 --- a/test/README +++ b/test/README @@ -715,6 +715,12 @@ This command causes the script to sleep for m milliseconds. Nothing is output to the screen. + munge + +This command requests custom munging of the test outputs. The munge names +used are coded in the runtest script. + + need_ipv4 This command must be at the head of a script. If no IPv4 interface has been diff --git a/test/log/2014 b/test/log/2014 index 554100b77..51d195fa3 100644 --- a/test/log/2014 +++ b/test/log/2014 @@ -4,6 +4,5 @@ 1999-03-02 09:44:33 TLS error on connection from (rhu5.barb) [ip4.ip4.ip4.ip4] (certificate verification failed): invalid 1999-03-02 09:44:33 H=[127.0.0.1] F= rejected RCPT : certificate not verified: peerdn=C=UK,O=The Exim Maintainers,OU=Test Suite,CN=Phil Pennock 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225 -1999-03-02 09:44:33 TLS error on connection from [ip4.ip4.ip4.ip4] (recv): A TLS packet with unexpected length was received. 1999-03-02 09:44:33 TLS error on connection from [ip4.ip4.ip4.ip4] (send): The specified session has been invalidated for some reason. 1999-03-02 09:44:33 H=[127.0.0.1] F= rejected RCPT : certificate not verified: peerdn=C=UK,O=The Exim Maintainers,OU=Test Suite,CN=Phil Pennock diff --git a/test/runtest b/test/runtest index b88e71e60..2756348f9 100755 --- a/test/runtest +++ b/test/runtest @@ -313,6 +313,7 @@ return @yield; sub munge { my($file) = $_[0]; +my($extra) = $_[1]; my($yield) = 0; my(@saved) = (); @@ -338,6 +339,13 @@ $spid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; while() { RESET_AFTER_EXTRA_LINE_READ: + # Custom munges + if ($extra) + { + next if $extra =~ m%^/% && eval $extra; + eval $extra if $extra =~ m/^s/; + } + # Check for "*** truncated ***" $yield = 1 if /\*\*\* truncated \*\*\*/; @@ -1022,6 +1030,7 @@ if ($_[1]) { $_ = "u"; print "... update forced\n"; } # [2] where to put the munged copy # [3] the name of the saved file # [4] TRUE if this is a log file whose deliveries must be sorted +# [5] optionally, a custom munge command # # Returns: 0 comparison succeeded or differences to be ignored # 1 comparison failed; files may have been updated (=> re-compare) @@ -1029,7 +1038,7 @@ if ($_[1]) { $_ = "u"; print "... update forced\n"; } # Does not return if the user replies "Q" to a prompt. sub check_file{ -my($rf,$rsf,$mf,$sf,$sortfile) = @_; +my($rf,$rsf,$mf,$sf,$sortfile,$extra) = @_; # If there is no saved file, the raw files must either not exist, or be # empty. The test ! -s is TRUE if the file does not exist or is empty. @@ -1077,11 +1086,11 @@ if (! -e $sf) # data that does exist. open(MUNGED, ">$mf") || tests_exit(-1, "Failed to open $mf: $!"); -my($truncated) = munge($rf) if -e $rf; +my($truncated) = munge($rf, $extra) if -e $rf; if (defined $rsf && -e $rsf) { print MUNGED "\n******** SERVER ********\n"; - $truncated |= munge($rsf); + $truncated |= munge($rsf, $extra); } close(MUNGED); @@ -1202,47 +1211,76 @@ return 1; +################################################## +# Custom munges +# keyed by name of munge; value is a ref to a hash +# which is keyed by file, value a string to look for. +# Usable files are: +# paniclog, rejectlog, mainlog, stdout, stderr, msglog, mail +# Search strings starting with 's' do substitutions; +# with '/' do line-skips. +################################################## +$munges = + { 'dnssec' => + { 'stderr' => '/^Reverse DNS security status: unverified\n/', }, + + 'gnutls_unexpected' => + { 'mainlog' => '/\(recv\): A TLS packet with unexpected length was received./', }, + + 'gnutls_handshake' => + { 'mainlog' => 's/\(gnutls_handshake\): Error in the push function/\(gnutls_handshake\): A TLS packet with unexpected length was received/', }, + + }; + + ################################################## # Subroutine to check the output of a test # ################################################## # This function is called when the series of subtests is complete. It makes -# use of check() file, whose arguments are: +# use of check_file(), whose arguments are: # # [0] the name of the main raw output file # [1] the name of the server raw output file or undef # [2] where to put the munged copy # [3] the name of the saved file # [4] TRUE if this is a log file whose deliveries must be sorted +# [5] an optional custom munge command # -# Arguments: none +# Arguments: Optionally, name of a custom munge to run. # Returns: 0 if the output compared equal # 1 if re-run needed (files may have been updated) sub check_output{ +my($mungename) = $_[0]; my($yield) = 0; +my($munge) = $munges->{$mungename} if defined $mungename; $yield = 1 if check_file("spool/log/paniclog", "spool/log/serverpaniclog", "test-paniclog-munged", - "paniclog/$testno", 0); + "paniclog/$testno", 0, + $munge->{'paniclog'}); $yield = 1 if check_file("spool/log/rejectlog", "spool/log/serverrejectlog", "test-rejectlog-munged", - "rejectlog/$testno", 0); + "rejectlog/$testno", 0, + $munge->{'rejectlog'}); $yield = 1 if check_file("spool/log/mainlog", "spool/log/servermainlog", "test-mainlog-munged", - "log/$testno", $sortlog); + "log/$testno", $sortlog, + $munge->{'mainlog'}); if (!$stdout_skip) { $yield = 1 if check_file("test-stdout", "test-stdout-server", "test-stdout-munged", - "stdout/$testno", 0); + "stdout/$testno", 0, + $munge->{'stdout'}); } if (!$stderr_skip) @@ -1250,7 +1288,8 @@ if (!$stderr_skip) $yield = 1 if check_file("test-stderr", "test-stderr-server", "test-stderr-munged", - "stderr/$testno", 0); + "stderr/$testno", 0, + $munge->{'stderr'}); } # Compare any delivered messages, unless this test is skipped. @@ -1289,7 +1328,8 @@ if (! $message_skip) print ">> COMPARE $mail mail/$testno.$saved_mail\n" if $debug; $yield = 1 if check_file($mail, undef, "test-mail-munged", - "mail/$testno.$saved_mail", 0); + "mail/$testno.$saved_mail", 0, + $munge->{'mail'}); delete $expected_mails{"mail/$testno.$saved_mail"}; } @@ -1359,7 +1399,8 @@ if (! $msglog_skip) s/((?:[^\W_]{6}-){2}[^\W_]{2}) /new_value($1, "10Hm%s-0005vi-00", \$next_msgid)/egx; $yield = 1 if check_file("spool/msglog/$msglog", undef, - "test-msglog-munged", "msglog/$testno.$munged_msglog", 0); + "test-msglog-munged", "msglog/$testno.$munged_msglog", 0, + $munge->{'msglog'}); delete $expected_msglogs{"$testno.$munged_msglog"}; } } @@ -1453,6 +1494,7 @@ system("$cmd"); # 4 EOF was encountered after an initial return code line # Optionally alse a second parameter, a hash-ref, with auxilliary information: # exim_pid: pid of a run process +# munge: name of a post-script results munger sub run_command{ my($testno) = $_[0]; @@ -1665,6 +1707,18 @@ elsif (/^millisleep\s+(.*)$/) } +# The "munge" command selects one of a hardwired set of test-result modifications +# to be made before result compares are run agains the golden set. This lets +# us account for test-system dependent things which only affect a few, but known, +# test-cases. +# Currently only the last munge takes effect. + +if (/^munge\s+(.*)$/) + { + return (0, { munge => $1 }); + } + + # The "sleep" command does just that. For sleeps longer than 1 second we # tell the user what's going on. @@ -3441,7 +3495,7 @@ foreach $test (@test_list) if ($docheck) { - if (check_output() != 0) + if (check_output($TEST_STATE->{munge}) != 0) { print (("#" x 79) . "\n"); redo; diff --git a/test/scripts/0000-Basic/0002 b/test/scripts/0000-Basic/0002 index 40e4259ef..3b485ee97 100644 --- a/test/scripts/0000-Basic/0002 +++ b/test/scripts/0000-Basic/0002 @@ -4,6 +4,7 @@ # be present in the basic Exim binary which we require in order to run these # tests at all. Specialized expansion tests also exist for optional features # in other test scripts. +munge dnssec exim -be diff --git a/test/scripts/0000-Basic/0094 b/test/scripts/0000-Basic/0094 index 9a915e06f..87fb5309f 100644 --- a/test/scripts/0000-Basic/0094 +++ b/test/scripts/0000-Basic/0094 @@ -1,4 +1,5 @@ # Reverse lookup failures +munge dnssec exim -bh V4NET.11.12.13 mail from: rcpt to: diff --git a/test/scripts/0000-Basic/0381 b/test/scripts/0000-Basic/0381 index c5f7d8441..738b0661d 100644 --- a/test/scripts/0000-Basic/0381 +++ b/test/scripts/0000-Basic/0381 @@ -1,4 +1,5 @@ # negatives with wildcard hosts when host has multiple names +munge dnssec exim -d -bs -oMa V4NET.99.99.97 mail from: rcpt to: diff --git a/test/scripts/2000-GnuTLS/2014 b/test/scripts/2000-GnuTLS/2014 index dfddfa54c..c5a01494a 100644 --- a/test/scripts/2000-GnuTLS/2014 +++ b/test/scripts/2000-GnuTLS/2014 @@ -1,5 +1,6 @@ # TLS server: mandatory, optional, and revoked certificates gnutls +munge gnutls_unexpected exim -DSERVER=server -bd -oX PORT_D **** # No certificate, certificate required diff --git a/test/scripts/2000-GnuTLS/2027 b/test/scripts/2000-GnuTLS/2027 index 5d713121d..bf0b06fd9 100644 --- a/test/scripts/2000-GnuTLS/2027 +++ b/test/scripts/2000-GnuTLS/2027 @@ -1,5 +1,6 @@ # TLS server & client: no certificate in client gnutls +munge gnutls_handshake exim -DSERVER=server -bd -oX PORT_D **** exim userx@test.ex diff --git a/test/scripts/2200-dnsdb/2202 b/test/scripts/2200-dnsdb/2202 index 0f0651d6f..e55fbc38b 100644 --- a/test/scripts/2200-dnsdb/2202 +++ b/test/scripts/2200-dnsdb/2202 @@ -1,4 +1,5 @@ # dns_again_means_nonexist +munge dnssec exim -d -bh HOSTIPV4 mail from: rcpt to: diff --git a/test/stdout/0002 b/test/stdout/0002 index c009fbd12..2acfb63ea 100644 --- a/test/stdout/0002 +++ b/test/stdout/0002 @@ -220,6 +220,12 @@ > md5: NO > mask: NO > +> # Number suffixes in conditions +> 1k: y +> 1K: y +> 1M: y +> 1G: y +> > # Numeric overflow > # >32b should work, >64b not > diff --git a/test/stdout/3450 b/test/stdout/3450 index 3c2ee8a31..1bd2e21d2 100644 --- a/test/stdout/3450 +++ b/test/stdout/3450 @@ -62,7 +62,7 @@ SSL info: SSLv3 flush data SSL info: SSLv3 read finished A SSL info: SSL negotiation finished successfully SSL info: SSL negotiation finished successfully -SSL connection using DHE-RSA-AES256-SHA +SSL connection using AES256-SHA Succeeded in starting TLS >>> ehlo foobar ??? 250- diff --git a/test/stdout/3454 b/test/stdout/3454 index 1deec37c5..ae2eab337 100644 --- a/test/stdout/3454 +++ b/test/stdout/3454 @@ -34,7 +34,7 @@ SSL info: SSLv3 flush data SSL info: SSLv3 read finished A SSL info: SSL negotiation finished successfully SSL info: SSL negotiation finished successfully -SSL connection using DHE-RSA-AES256-SHA +SSL connection using AES256-SHA Succeeded in starting TLS >>> auth plain AHVzZXJ4AHNlY3JldA== ??? 503 @@ -76,7 +76,7 @@ SSL info: SSLv3 flush data SSL info: SSLv3 read finished A SSL info: SSL negotiation finished successfully SSL info: SSL negotiation finished successfully -SSL connection using DHE-RSA-AES256-SHA +SSL connection using AES256-SHA Succeeded in starting TLS >>> ehlo foobar ??? 250-myhost -- 2.30.2