Testsuite: fix stderr munging
[users/heiko/exim.git] / test / runtest
index b369d59a3d0bff768ec089d87955f5bec3e028ff..6e9255b333ec88882d06673477d7a21a51b3964c 100755 (executable)
@@ -112,7 +112,7 @@ $ENV{LC_ALL} = 'C';
 $ENV{USER} = getpwuid($>) if not exists $ENV{USER};
 
 my ($parm_configure_owner, $parm_configure_group);
-my ($parm_ipv4, $parm_ipv6);
+my ($parm_ipv4, $parm_ipv6, $parm_ipv6_stripped);
 my $parm_hostname;
 
 ###############################################################################
@@ -758,6 +758,10 @@ RESET_AFTER_EXTRA_LINE_READ:
   s/waiting for children of \d+/waiting for children of pppp/;
   s/waiting for (\S+) \(\d+\)/waiting for $1 (pppp)/;
 
+  # Most builds are without HAVE_LOCAL_SCAN
+  next if /^calling local_scan\(\); timeout=300$/;
+  next if /^local_scan\(\) returned 0 NULL$/;
+
   # ======== Port numbers ========
   # Incoming port numbers may vary, but not in daemon startup line.
 
@@ -794,6 +798,7 @@ RESET_AFTER_EXTRA_LINE_READ:
   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/(^|\W)\K\Q$parm_ipv6\E/ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6/g;
+  s/(^|\W)\K\Q$parm_ipv6_stripped\E/ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6/g;
   s/\b\Q$parm_ipv4r\E\b/ip4-reverse/g;
   s/(^|\W)\K\Q$parm_ipv6r\E/ip6-reverse/g;
   s/^(\s+host\s\S+\s+\[\S+\]) +$/$1 /;
@@ -912,6 +917,11 @@ RESET_AFTER_EXTRA_LINE_READ:
   last if !defined $_;
 
 
+  # SRS timestamps and signatures vary by hostname and from run to run
+
+  s/SRS0=....=..=[^=]+=[^@]+\@test.ex/SRS0=ZZZZ=YY=the.local.host.name=CALLER\@test.ex/;
+
+
   # ======== Output from the "fd" program about open descriptors ========
   # The statuses seem to be different on different operating systems, but
   # at least we'll still be checking the number of open fd's.
@@ -1019,6 +1029,7 @@ RESET_AFTER_EXTRA_LINE_READ:
 
     s/(?<=^>>>>>>>>>>>>>>>> Exim pid=)\d+(?= terminating)/pppp/;
     s/^(proxy-proc \w{5}-pid) \d+$/$1 pppp/;
+    s/^(?:\s*\d+ )(exec .* -oPX)$/pppp $1/;
 
     # IP address lookups use gethostbyname() when IPv6 is not supported,
     # and gethostbyname2() or getipnodebyname() when it is.
@@ -1036,6 +1047,9 @@ RESET_AFTER_EXTRA_LINE_READ:
     next if /OpenSSL compile-time version: OpenSSL \d+[\.\da-z]+/;
     next if /OpenSSL runtime version: OpenSSL \d+[\.\da-z]+/;
 
+    # this is timing-dependent
+    next if /^OpenSSL: creating STEK$/;
+
     # drop lookups
     next if /^Lookups \(built-in\):/;
     next if /^Loading lookup modules from/;
@@ -1085,7 +1099,7 @@ RESET_AFTER_EXTRA_LINE_READ:
     next if /name=localhost address=::1/;
 
     # drop pdkim debugging header
-    next if /^PDKIM( <<<<<<<<<<<<<<<<<<<<<<<<<<<<<+|: no signatures)$/;
+    next if /^DKIM( <<<<<<<<<<<<<<<<<<<<<<<<<<<<<+|: no signatures)$/;
 
     # Various other IPv6 lines must be omitted too
 
@@ -1161,11 +1175,14 @@ RESET_AFTER_EXTRA_LINE_READ:
     # Platform-dependent resolver option bits
     s/^ (?:writing|update) neg-cache entry for [^,]+-\K[0-9a-f]+, ttl/xxxx, ttl/;
 
+    # timing variance, run-to-run
+    s/^time on queue = \K1s/0s/;
+
     # Skip hosts_require_dane checks when the options
     # are unset, because dane ain't always there.
     next if /in\shosts_require_dane\?\sno\s\(option\sunset\)/x;
 
-    # DISABLE_OCSP 
+    # DISABLE_OCSP
     next if /in hosts_requ(est|ire)_ocsp\? (no|yes)/;
 
     # SUPPORT_PROXY
@@ -1205,7 +1222,7 @@ RESET_AFTER_EXTRA_LINE_READ:
       }
 
     # Not all platforms build with DKIM enabled
-    next if /^PDKIM >> Body data for hash, canonicalized/;
+    next if /^DKIM >> Body data for hash, canonicalized/;
 
     # Not all platforms build with SPF enabled
     next if /^(spf_conn_init|SPF_dns_exim_new|spf_compile\.c)/;
@@ -1215,7 +1232,7 @@ RESET_AFTER_EXTRA_LINE_READ:
 
     #  Parts of DKIM-specific debug output depend on the time/date
     next if /^date:\w+,\{SP\}/;
-    next if /^PDKIM \[[^[]+\] (Header hash|b) computed:/;
+    next if /^DKIM \[[^[]+\] (Header hash|b) computed:/;
 
     # Not all platforms support TCP Fast Open, and the compile omits the check
     if (s/\S+ in hosts_try_fastopen\? (no \(option unset\)|yes \(matched "\*"\))\n$//)
@@ -1231,7 +1248,7 @@ RESET_AFTER_EXTRA_LINE_READ:
 
     if (/^([0-9: ]*                                            # possible timestamp
        Connecting\ to\ [^ ]+\ [^ ]+(\ from\ [^ ]+)?)\ \.\.\.
-       \ .*TFO\ mode\ 
+       \ .*TFO\ mode\x20
        (sendto,\ no\ data:\ EINPROGRESS                        # Linux
        |connection\ attempt\ to\ [^,]+,\ 0\ data)              # MacOS & no-support
        $/x)
@@ -3396,21 +3413,28 @@ else
 
 # Find this host's IP addresses - there may be many, of course, but we keep
 # one of each type (IPv4 and IPv6).
+#XXX it would be good to avoid non-UP interfaces
 
 open(IFCONFIG, '-|', (grep { -x "$_/ip" } split /:/, $ENV{PATH}) ? 'ip address' : 'ifconfig -a')
   or die "** Cannot run 'ip address' or 'ifconfig -a'\n";
 while (not ($parm_ipv4 and $parm_ipv6) and defined($_ = <IFCONFIG>))
   {
+  if (/^(?:[0-9]+: )?([a-z0-9]+): /) { $ifname = $1; }
+
   if (not $parm_ipv4 and /^\s*inet(?:\saddr)?:?\s?(\d+\.\d+\.\d+\.\d+)(?:\/\d+)?\s/i)
     {
-    next if $1 =~ /^(?:127|10)\./;
+    # It would ne nice to be able to vary the /16 used for manyhome; we could take
+    # an option to runtest used here - but we'd also have to pass it on to fakens.
+    # Possibly an environment variable?
+    next if $1 eq '0.0.0.0' or $1 =~ /^(?:127|10\.250)\./;
     $parm_ipv4 = $1;
     }
 
   if (not $parm_ipv6 and /^\s*inet6(?:\saddr)?:?\s?([abcdef\d:]+)(?:%[^ \/]+)?(?:\/\d+)?/i)
     {
-    next if $1 eq '::1' or $1 =~ /^fe80/i;
+    next if $1 eq '::' or $1 eq '::1' or $1 =~ /^ff00/i or $1 =~ /^fe80::1/i;
     $parm_ipv6 = $1;
+    if ($1 =~ /^fe80/i) { $parm_ipv6 .= '%' . $ifname; }
     }
   }
 close(IFCONFIG);
@@ -3468,6 +3492,8 @@ else
 print "IPv4 address is $parm_ipv4\n";
 print "IPv6 address is $parm_ipv6\n";
 $parm_ipv6 =~ /^[^%\/]*/;
+# drop any %scope from the ipv6, for some uses
+($parm_ipv6_stripped = $parm_ipv6) =~ s/%.*//g;
 
 # For munging test output, we need the reversed IP addresses.
 
@@ -3477,7 +3503,7 @@ $parm_ipv4r = ($parm_ipv4 !~ /^\d/)? '' :
 $parm_ipv6r = $parm_ipv6;             # Appropriate if not in use
 if ($parm_ipv6 =~ /^[\da-f]/)
   {
-  my(@comps) = split /:/, $parm_ipv6;
+  my(@comps) = split /:/, $parm_ipv6_stripped;
   my(@nibbles);
   foreach $comp (@comps)
     {
@@ -3898,7 +3924,7 @@ if ($have_ipv4 || $have_ipv6)
     "; for queries that it cannot answer\n\n" .
     "PASS ON NOT FOUND\n\n";
   print OUT "$shortname  A     $parm_ipv4\n" if $have_ipv4;
-  print OUT "$shortname  AAAA  $parm_ipv6\n" if $have_ipv6;
+  print OUT "$shortname  AAAA  $parm_ipv6_stripped\n" if $have_ipv6;
   print OUT "\n; End\n";
   close(OUT);
   }
@@ -3906,28 +3932,39 @@ if ($have_ipv4 || $have_ipv6)
 if ($have_ipv4 && $parm_ipv4 ne "127.0.0.1")
   {
   my(@components) = $parm_ipv4 =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/;
-  open(OUT, ">$parm_cwd/dnszones/db.ip4.$components[0]") ||
-    tests_exit(-1,
-      "Failed  to open $parm_cwd/dnszones/db.ip4.$components[0]: $!");
-  print OUT "; This is a dynamically constructed fake zone file.\n" .
-    "; The zone is $components[0].in-addr.arpa.\n\n" .
-    "$components[3].$components[2].$components[1]  PTR  $parm_hostname.\n\n" .
-    "; End\n";
-  close(OUT);
+
+  if ($components[0]=='10')
+    {
+    open(OUT, ">>$parm_cwd/dnszones/db.ip4.$components[0]") ||
+      tests_exit(-1, "Failed  to open $parm_cwd/dnszones/db.ip4.$components[0]: $!");
+    print OUT "$components[3].$components[2].$components[1]  PTR  $parm_hostname.\n\n";
+    close(OUT);
+    } 
+  else
+    {
+    open(OUT, ">$parm_cwd/dnszones/db.ip4.$components[0]") ||
+      tests_exit(-1,
+       "Failed  to open $parm_cwd/dnszones/db.ip4.$components[0]: $!");
+    print OUT "; This is a dynamically constructed fake zone file.\n" .
+      "; The zone is $components[0].in-addr.arpa.\n\n" .
+      "$components[3].$components[2].$components[1]  PTR  $parm_hostname.\n\n" .
+      "; End\n";
+    close(OUT);
+    }
   }
 
-if ($have_ipv6 && $parm_ipv6 ne "::1")
+if ($have_ipv6 && $parm_ipv6_stripped ne "::1")
   {
-  my($exp_v6) = $parm_ipv6;
+  my($exp_v6) = $parm_ipv6_stripped;
   $exp_v6 =~ s/[^:]//g;
-  if ( $parm_ipv6 =~ /^([^:].+)::$/ ) {
+  if ( $parm_ipv6_stripped =~ /^([^:].+)::$/ ) {
     $exp_v6 = $1 . ':0' x (9-length($exp_v6));
-  } elsif ( $parm_ipv6 =~ /^(.+)::(.+)$/ ) {
+  } elsif ( $parm_ipv6_stripped =~ /^(.+)::(.+)$/ ) {
     $exp_v6 = $1 . ':0' x (8-length($exp_v6)) . ':' . $2;
-  } elsif ( $parm_ipv6 =~ /^::(.+[^:])$/ ) {
+  } elsif ( $parm_ipv6_stripped =~ /^::(.+[^:])$/ ) {
     $exp_v6 = '0:' x (9-length($exp_v6)) . $1;
   } else {
-    $exp_v6 = $parm_ipv6;
+    $exp_v6 = $parm_ipv6_stripped;
   }
   my(@components) = split /:/, $exp_v6;
   my(@nibbles) = reverse (split /\s*/, shift @components);