X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FTest-Valgrind.git;a=blobdiff_plain;f=lib%2FTest%2FValgrind%2FSession.pm;h=3b377fb482d0d3f127cfd6f93b96086bfd89a267;hp=fdb51c2313cf57c0177e54d3f8a8ef37a277ea2a;hb=8cacc78f5dbd91f8ff36075b44d923edd659541f;hpb=764e57fa66b8998b44e9c8e369df99399e030896 diff --git a/lib/Test/Valgrind/Session.pm b/lib/Test/Valgrind/Session.pm index fdb51c2..3b377fb 100644 --- a/lib/Test/Valgrind/Session.pm +++ b/lib/Test/Valgrind/Session.pm @@ -43,6 +43,7 @@ use base qw; min_version => $min_version, regen_def_supp => $regen_def_supp, no_def_supp => $no_def_supp, + allow_no_supp => $allow_no_supp, extra_supps => \@extra_supps, ); @@ -84,6 +85,12 @@ Defaults to false. =item * +If C<$allow_no_supp> is true, the command will always be run into C even if no appropriate suppression file is available. + +Defaults to false. + +=item * + C<$extra_supps> is a reference to an array of optional suppression files that will be passed to C. Defaults to none. @@ -141,6 +148,7 @@ sub new { version => $version, regen_def_supp => delete($args{regen_def_supp}), no_def_supp => delete($args{no_def_supp}), + allow_no_supp => delete($args{allow_no_supp}), extra_supps => $extra_supps, }, $class; } @@ -182,9 +190,20 @@ Read-only accessor for the C option. Read-only accessor for the C option. +=head2 C + + my $allow_no_supp = $tvs->allow_no_supp; + +Read-only accessor for the C option. + =cut -eval "sub $_ { \$_[0]->{$_} }" for qw; +eval "sub $_ { \$_[0]->{$_} }" for qw< + valgrind + regen_def_supp + no_def_supp + allow_no_supp +>; =head2 C @@ -240,33 +259,48 @@ sub _run { my @supp_args; if ($self->do_suppressions) { push @supp_args, '--gen-suppressions=all'; - } elsif (not $self->no_def_supp) { - my $def_supp = $self->def_supp_file; - my $forced; - if ($self->regen_def_supp and -e $def_supp) { - 1 while unlink $def_supp; - $forced = 1; + } else { + if (!$self->no_def_supp) { + my $def_supp = $self->def_supp_file; + my $forced; + if ($self->regen_def_supp and -e $def_supp) { + 1 while unlink $def_supp; + $forced = 1; + } + if (defined $def_supp and not -e $def_supp) { + $self->report($self->report_class->new_diag( + 'Generating suppressions' . ($forced ? ' (forced)' : '') . '...' + )); + require Test::Valgrind::Suppressions; + Test::Valgrind::Suppressions->generate( + tool => $self->tool, + command => $self->command, + target => $def_supp, + ); + $self->_croak('Couldn\'t generate suppressions') unless -e $def_supp; + $self->report($self->report_class->new_diag( + "Suppressions for this perl stored in $def_supp" + )); + } } - if (defined $def_supp and not -e $def_supp) { + my @supp_files = grep { + -e $_ and $self->command->check_suppressions_file($_) + } $self->suppressions; + if (@supp_files > 1) { + my $files_list = join "\n", map " $_", @supp_files; $self->report($self->report_class->new_diag( - 'Generating suppressions' . ($forced ? ' (forced)' : '') . '...' + "Using suppressions from:\n$files_list" )); - require Test::Valgrind::Suppressions; - Test::Valgrind::Suppressions->generate( - tool => $self->tool, - command => $self->command, - target => $def_supp, - ); - $self->_croak('Couldn\'t generate suppressions') unless -e $def_supp; + } elsif (@supp_files) { $self->report($self->report_class->new_diag( - "Suppressions for this perl stored in $def_supp" + "Using suppressions from $supp_files[0]" )); + } elsif ($self->allow_no_supp) { + $self->report($self->report_class->new_diag("No suppressions used")); + } else { + $self->_croak("No compatible suppressions available"); } - for ($self->suppressions) { - next unless -e $_; - $self->report($self->report_class->new_diag("Using suppression file $_")); - push @supp_args, "--suppressions=$_"; - } + @supp_args = map "--suppressions=$_", @supp_files; } pipe my $vrdr, my $vwtr or $self->_croak("pipe(\$vrdr, \$vwtr): $!");