Testsuite: add per-testcase munge facility; use for dnssec and gnutls.
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 5 Jun 2012 19:50:30 +0000 (20:50 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 5 Jun 2012 19:50:30 +0000 (20:50 +0100)
12 files changed:
test/README
test/log/2014
test/runtest
test/scripts/0000-Basic/0002
test/scripts/0000-Basic/0094
test/scripts/0000-Basic/0381
test/scripts/2000-GnuTLS/2014
test/scripts/2000-GnuTLS/2027
test/scripts/2200-dnsdb/2202
test/stdout/0002
test/stdout/3450
test/stdout/3454

index 3628da98a73571bc34c37f047057835547b2aa75..f5121753767cd10a5f6a976063ceabb98ef1c392 100644 (file)
@@ -715,6 +715,12 @@ This command causes the script to sleep for m milliseconds. Nothing is output
 to the screen.
 
 
 to the screen.
 
 
+  munge <name>
+
+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
   need_ipv4
 
 This command must be at the head of a script. If no IPv4 interface has been
index 554100b77c3652b0d211f109ddd1c1f36deab8a6..51d195fa34c20426f0db3db288ed7dfc0e0012a1 100644 (file)
@@ -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=<userx@test.ex> rejected RCPT <userx@test.ex>: 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 (rhu5.barb) [ip4.ip4.ip4.ip4] (certificate verification failed): invalid
 1999-03-02 09:44:33 H=[127.0.0.1] F=<userx@test.ex> rejected RCPT <userx@test.ex>: 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=<userx@test.ex> rejected RCPT <userx@test.ex>: certificate not verified: peerdn=C=UK,O=The Exim Maintainers,OU=Test Suite,CN=Phil Pennock
 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=<userx@test.ex> rejected RCPT <userx@test.ex>: certificate not verified: peerdn=C=UK,O=The Exim Maintainers,OU=Test Suite,CN=Phil Pennock
index b88e71e60f05e5524b34a095e61ad077b5e89790..2756348f9c4a729fc506c1720640a5b066a00d08 100755 (executable)
@@ -313,6 +313,7 @@ return @yield;
 
 sub munge {
 my($file) = $_[0];
 
 sub munge {
 my($file) = $_[0];
+my($extra) = $_[1];
 my($yield) = 0;
 my(@saved) = ();
 
 my($yield) = 0;
 my(@saved) = ();
 
@@ -338,6 +339,13 @@ $spid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 while(<IN>)
   {
 RESET_AFTER_EXTRA_LINE_READ:
 while(<IN>)
   {
 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 \*\*\*/;
 
   # 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
 #             [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)
 #
 # 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{
 # 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.
 
 # 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: $!");
 # 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";
 if (defined $rsf && -e $rsf)
   {
   print MUNGED "\n******** SERVER ********\n";
-  $truncated |= munge($rsf);
+  $truncated |= munge($rsf, $extra);
   }
 close(MUNGED);
 
   }
 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
 ##################################################
 #    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
 #
 #  [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{
 # 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($yield) = 0;
+my($munge) = $munges->{$mungename} if defined $mungename;
 
 $yield = 1 if check_file("spool/log/paniclog",
                        "spool/log/serverpaniclog",
                        "test-paniclog-munged",
 
 $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",
 
 $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",
 
 $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",
 
 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)
   }
 
 if (!$stderr_skip)
@@ -1250,7 +1288,8 @@ if (!$stderr_skip)
   $yield = 1 if check_file("test-stderr",
                        "test-stderr-server",
                        "test-stderr-munged",
   $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.
   }
 
 # 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",
 
     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"};
     }
 
     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,
         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"};
       }
     }
       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
 #            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];
 
 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.
 
 # 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 ($docheck)
     {
-    if (check_output() != 0)
+    if (check_output($TEST_STATE->{munge}) != 0)
       {
       print (("#" x 79) . "\n");
       redo;
       {
       print (("#" x 79) . "\n");
       redo;
index 40e4259ef314c2614f5b13c685997b359821ae7a..3b485ee97c8511c0d1e048b332002ed073434429 100644 (file)
@@ -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.
 # 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
 
 
 exim -be
 
index 9a915e06f3af7302c4535487b6af719b7afbfe52..87fb5309fc3b6561a10664c22f2f4937d0ea7636 100644 (file)
@@ -1,4 +1,5 @@
 # Reverse lookup failures
 # Reverse lookup failures
+munge dnssec
 exim -bh V4NET.11.12.13
 mail from:<userx@cam.ac.uk>
 rcpt to:<userx@cam.ac.uk>
 exim -bh V4NET.11.12.13
 mail from:<userx@cam.ac.uk>
 rcpt to:<userx@cam.ac.uk>
index c5f7d844133a5510602fe6154a0f13f0f49b36fd..738b0661de934f0d268c1471b05ae4992f9f148e 100644 (file)
@@ -1,4 +1,5 @@
 # negatives with wildcard hosts when host has multiple names
 # negatives with wildcard hosts when host has multiple names
+munge dnssec
 exim -d -bs -oMa V4NET.99.99.97
 mail from:<notgov@test.ex>
 rcpt to:<x@test.ex>
 exim -d -bs -oMa V4NET.99.99.97
 mail from:<notgov@test.ex>
 rcpt to:<x@test.ex>
index dfddfa54c1e899d40a32ed2a859b81065c6554a7..c5a01494adad15ec17f8ef6efc2b34c726176cef 100644 (file)
@@ -1,5 +1,6 @@
 # TLS server: mandatory, optional, and revoked certificates
 gnutls
 # TLS server: mandatory, optional, and revoked certificates
 gnutls
+munge gnutls_unexpected
 exim -DSERVER=server -bd -oX PORT_D
 ****
 # No certificate, certificate required
 exim -DSERVER=server -bd -oX PORT_D
 ****
 # No certificate, certificate required
index 5d713121db0da3312ec25d3604d2e97ea224647b..bf0b06fd9917b80c35780b1545c7f87774c7f21f 100644 (file)
@@ -1,5 +1,6 @@
 # TLS server & client: no certificate in client
 gnutls
 # TLS server & client: no certificate in client
 gnutls
+munge gnutls_handshake
 exim -DSERVER=server -bd -oX PORT_D
 ****
 exim userx@test.ex
 exim -DSERVER=server -bd -oX PORT_D
 ****
 exim userx@test.ex
index 0f0651d6ffed38c3a916a631948eb7f9bf2d1f4a..e55fbc38b0e9405744868697e7055fdc1543fe52 100644 (file)
@@ -1,4 +1,5 @@
 # dns_again_means_nonexist
 # dns_again_means_nonexist
+munge dnssec
 exim -d -bh HOSTIPV4
 mail from:<xx@cioce.test.again.dns>
 rcpt to:<a@b>
 exim -d -bh HOSTIPV4
 mail from:<xx@cioce.test.again.dns>
 rcpt to:<a@b>
index c009fbd1214f9d92d903876faf292d09d60147cf..2acfb63ea34868a54bb097b34642dd83edc4a12b 100644 (file)
 > md5:    NO
 > mask:   NO
 > 
 > md5:    NO
 > mask:   NO
 > 
+> # Number suffixes in conditions
+> 1k: y
+> 1K: y
+> 1M: y
+> 1G: y
+> 
 > # Numeric overflow
 > # >32b should work, >64b not
 > 
 > # Numeric overflow
 > # >32b should work, >64b not
 > 
index 3c2ee8a31bd6108a98b552f71fd2736aaa95f4a9..1bd2e21d2d68a8342d361694da4eb953112a4dd0 100644 (file)
@@ -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 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-
 Succeeded in starting TLS
 >>> ehlo foobar
 ??? 250-
index 1deec37c5e7dd0895283d928eda01d6b5bc59682..ae2eab337cbcb479a844bb79457a9f14671272bc 100644 (file)
@@ -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 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
 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 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
 Succeeded in starting TLS
 >>> ehlo foobar
 ??? 250-myhost