Add support for test.valgrind parallel testing
authorMatthew Horsfall (via RT) <perlbug-followup@perl.org>
Thu, 13 Mar 2014 12:39:48 +0000 (05:39 -0700)
committerKarl Williamson <public@khwilliamson.com>
Tue, 18 Mar 2014 18:51:22 +0000 (12:51 -0600)
# New Ticket Created by  Matthew Horsfall
# Please include the string:  [perl #121431]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=121431 >

This is a bug report for perl from wolfsage@gmail.com,
generated with the help of perlbug 1.39 running under perl 5.14.2.

-----------------------------------------------------------------
[Please describe your issue here]

The included patch allows test.valgrind to run tests in parallel.

Valgrind output for each test will be printed out after the test
completes, with the name of the test prefixing every line.

Example usage might be:

  TEST_JOBS=8 make test.valgrind VALGRIND='valgrind -q' 2>&1 | tee out.txt

-q is needed to ensure only *errors* are captured, otherwise the output will
be much louder than it already is. (Perhaps this should be the default mode?)

[Please do not change anything below this line]
-----------------------------------------------------------------

Makefile.SH
t/TEST
t/harness

index 6e9df1a..3b5d023 100755 (executable)
@@ -1510,7 +1510,7 @@ test.valgrind check.valgrind:     test_prep
        @grep "^usemymalloc='n'" config.sh >/dev/null || exit 1
        @echo "And of course you have to have valgrind..."
        $(VALGRIND) $(VG_TEST) || exit 1
-       PERL_VALGRIND=1 VALGRIND='$(VALGRIND)' $(RUN_TESTS) choose
+       PERL_VALGRIND=1 VALGRIND='$(VALGRIND)' TESTFILE=harness $(RUN_TESTS) choose
 !NO!SUBS!
        ;;
 esac
diff --git a/t/TEST b/t/TEST
index 96eb6a4..356bdc2 100755 (executable)
--- a/t/TEST
+++ b/t/TEST
@@ -284,16 +284,15 @@ sub _cmd {
         if ($ENV{PERL_VALGRIND}) {
             my $perl_supp = $options->{return_dir} ? "$options->{return_dir}/perl.supp" : "perl.supp";
             my $valgrind_exe = $ENV{VALGRIND} // 'valgrind';
+            if ($options->{run_dir}) {
+                $Valgrind_Log = "$options->{run_dir}/$Valgrind_Log";
+            }
             my $vg_opts = $ENV{VG_OPTS}
-              // '--log-fd=3 '
+              //   "--log-file=$Valgrind_Log "
                  . "--suppressions=$perl_supp --leak-check=yes "
                  . "--leak-resolution=high --show-reachable=yes "
-                  . "--num-callers=50 --track-origins=yes";
+                 . "--num-callers=50 --track-origins=yes";
             $perl = "$valgrind_exe $vg_opts $perl";
-            $redir = "3>$Valgrind_Log";
-            if ($options->{run_dir}) {
-                $Valgrind_Log = "$options->{run_dir}/$Valgrind_Log";
-            }
         }
 
         my $args = "$options->{testswitch} $options->{switch} $options->{utf8}";
index 1ed70cb..845b270 100644 (file)
--- a/t/harness
+++ b/t/harness
@@ -16,6 +16,7 @@ use Config;
 
 $::do_nothing = $::do_nothing = 1;
 require './TEST';
+our $Valgrind_Log;
 
 my $Verbose = 0;
 $Verbose++ while @ARGV && $ARGV[0] eq '-v' && shift;
@@ -224,10 +225,29 @@ my $h = TAP::Harness->new({
            $options = $options{$test} = _scan_test($test, $type);
        }
 
+       (local $Valgrind_Log = "$test.valgrind-current") =~ s/^.*\///;
+
        return [ split ' ', _cmd($options, $type) ];
     },
 });
 
+# Print valgrind output after test completes
+if ($ENV{PERL_VALGRIND}) {
+    $h->callback(
+                after_test => sub {
+                    my ($job) = @_;
+                    my $test = $job->[0];
+                    my $vfile = "$test.valgrind-current";
+                    $vfile =~ s/^.*\///;
+
+                    open(my $voutput, '<', $vfile) or return;
+                    print "$test: Valgrind output:\n";
+                    print "$test: $_" for <$voutput>;
+                    close($voutput);
+                }
+                );
+}
+
 if ($state) {
     $h->callback(
                 after_test => sub {