t/op/dump.t: silence 'Aborted' messages on stderr
authorDavid Mitchell <davem@iabyn.com>
Wed, 18 Mar 2015 14:10:33 +0000 (14:10 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 18 Mar 2015 14:13:45 +0000 (14:13 +0000)
On some platforms, t/op/dump.t produces extraneous (and scary)

    sh: line 1: 17605 Aborted (core dumped)

style messages on stderr.

Do a fork in each test to avoid this.

t/op/dump.t

index a2e320f..a858643 100644 (file)
@@ -19,7 +19,9 @@ skip_all("only tested on devel builds")
 
 # there may be other operating systems where it makes sense, but
 # there are some where it isn't, so limit the platforms we test
-# this on
+# this on. Also this needs to be a platform that fully supports
+# fork() and waitpid().
+
 skip_all("no point in dumping on $^O")
   unless $^O =~ /^(linux|.*bsd|solaris)$/;
 
@@ -33,22 +35,56 @@ chdir $tmp
 
 plan(2);
 
-# depending on how perl is built there may be extra output after
-# the A such as "Aborted".
+# Depending on how perl is built, there may be extraneous stuff on stderr
+# such as "Aborted", which isn't caught by the '2>&1' that
+# fresh_perl_like() does. So execute each dump() in a sub-process.
+#
+# In detail:
+# fresh_perl_like() ends up doing a `` which invokes a shell with 2 args:
+#
+#   "sh", "-c", "perl /tmp/foo 2>&1"
+#
+# When the perl process coredumps after calling dump(), the parent
+# sh sees that the exit of the child flags a coredump and so prints
+# something like the following to stderr:
+#
+#    sh: line 1: 17605 Aborted (core dumped)
+#
+# Note that the '2>&1' only applies to the perl process, not to the sh
+# command itself.
+# By do the dump in a child, the parent perl process exits back to sh with
+# a normal exit value, so sh won't complain.
 
 fresh_perl_like(<<'PROG', qr/\AA(?!B\z)/, {}, "plain dump quits");
 ++$|;
-print qq(A);
-dump;
-print qq(B);
+my $pid = fork;
+die "fork: $!\n" unless defined $pid;
+if ($pid) {
+    # parent
+    waitpid($pid, 0);
+}
+else {
+    # child
+    print qq(A);
+    dump;
+    print qq(B);
+}
 PROG
 
 fresh_perl_like(<<'PROG', qr/A(?!B\z)/, {}, "dump with label quits");
 ++$|;
-print qq(A);
-dump foo;
-foo:
-print qq(B);
+my $pid = fork;
+die "fork: $!\n" unless defined $pid;
+if ($pid) {
+    # parent
+    waitpid($pid, 0);
+}
+else {
+    print qq(A);
+    dump foo;
+    foo:
+    print qq(B);
+}
 PROG
 
 END {