]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/blobdiff - lib/Test/Valgrind/Session.pm
Add 'regen_def_supp', an option to regenerate the suppressions
[perl/modules/Test-Valgrind.git] / lib / Test / Valgrind / Session.pm
index 95a0130021e4c8f6ac971133ec37fa04011d6f7e..bbafa5620500c137a9280b6fb0913d0ada8577ce 100644 (file)
@@ -9,11 +9,11 @@ Test::Valgrind::Session - Test::Valgrind session object.
 
 =head1 VERSION
 
-Version 1.12
+Version 1.14
 
 =cut
 
-our $VERSION = '1.12';
+our $VERSION = '1.14';
 
 =head1 DESCRIPTION
 
@@ -30,11 +30,21 @@ use POSIX (); # SIGKILL
 
 use version ();
 
-use base qw/Test::Valgrind::Carp/;
+use base qw<Test::Valgrind::Carp>;
 
 =head1 METHODS
 
-=head2 C<< new search_dirs => \@search_dirs, valgrind => [ $valgrind | \@valgrind ], min_version => $min_version, no_def_supp => $no_def_supp, extra_supps => \@extra_supps >>
+=head2 C<new>
+
+    my $tvs = Test::Valgrind::Session->new(
+     search_dirs    => \@search_dirs,
+     valgrind       => $valgrind,  # One candidate
+     valgrind       => \@valgrind, # Several candidates
+     min_version    => $min_version,
+     regen_def_supp => $regen_def_supp,
+     no_def_supp    => $no_def_supp,
+     extra_supps    => \@extra_supps,
+    );
 
 The package constructor, which takes several options :
 
@@ -62,7 +72,13 @@ Defaults to none.
 
 =item *
 
-If C<$no_def_supp> is false, C<valgrind> won't read the default suppression file associated with the tool and the command.
+If C<$regen_def_supp> is true, the default suppression file associated with the tool and the command will be forcefully regenerated.
+
+Defaults to false.
+
+=item *
+
+If C<$no_def_supp> is true, C<valgrind> won't read the default suppression file associated with the tool and the command.
 
 Defaults to false.
 
@@ -121,19 +137,24 @@ sub new {
  @$extra_supps   = grep { defined && -f $_ && -r _ } @$extra_supps;
 
  bless {
-  valgrind    => $valgrind,
-  version     => $version,
-  no_def_supp => delete($args{no_def_supp}),
-  extra_supps => $extra_supps,
+  valgrind       => $valgrind,
+  version        => $version,
+  regen_def_supp => delete($args{regen_def_supp}),
+  no_def_supp    => delete($args{no_def_supp}),
+  extra_supps    => $extra_supps,
  }, $class;
 }
 
 =head2 C<valgrind>
 
+    my $valgrind_path = $tvs->valgrind;
+
 The path to the selected C<valgrind> executable.
 
 =head2 C<version>
 
+    my $valgrind_version = $tvs->version;
+
 The L<version> object associated to the selected C<valgrind>.
 
 =cut
@@ -147,23 +168,41 @@ sub version {
  return $version;
 }
 
+=head2 C<regen_def_supp>
+
+    my $regen_def_supp = $tvs->regen_def_supp;
+
+Read-only accessor for the C<regen_def_supp> option.
+
+=cut
+
 =head2 C<no_def_supp>
 
+    my $no_def_supp = $tvs->no_def_supp;
+
 Read-only accessor for the C<no_def_supp> option.
 
 =cut
 
-eval "sub $_ { \$_[0]->{$_} }" for qw/valgrind no_def_supp/;
+eval "sub $_ { \$_[0]->{$_} }" for qw<valgrind regen_def_supp no_def_supp>;
 
 =head2 C<extra_supps>
 
+    my @extra_supps = $tvs->extra_supps;
+
 Read-only accessor for the C<extra_supps> option.
 
 =cut
 
 sub extra_supps { @{$_[0]->{extra_supps} || []} }
 
-=head2 C<< run action => $action, tool => $tool, command => $command >>
+=head2 C<run>
+
+    $tvs->run(
+     action  => $action,
+     tool    => $tool,
+     command => $command,
+    );
 
 Runs the command C<$command> through C<valgrind> with the tool C<$tool>, which will report to the action C<$action>.
 
@@ -203,9 +242,14 @@ sub _run {
   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;
+  }
   if (defined $def_supp and not -e $def_supp) {
    $self->report($self->report_class->new_diag(
-    "Generating suppressions..."
+    'Generating suppressions' . ($forced ? ' (forced)' : '') . '...'
    ));
    require Test::Valgrind::Suppressions;
    Test::Valgrind::Suppressions->generate(
@@ -295,7 +339,7 @@ Read-only accessor for the C<command> associated to the current run.
 
 my @members;
 BEGIN {
- @members = qw/action tool command parser/;
+ @members = qw<action tool command parser>;
  for (@members) {
   eval "sub $_ { \@_ <= 1 ? \$_[0]->{$_} : (\$_[0]->{$_} = \$_[1]) }";
   die if $@;
@@ -358,6 +402,8 @@ sub def_supp_file {
 
 =head2 C<suppressions>
 
+    my @suppressions = $tvs->suppressions;
+
 Returns the list of all the suppressions that will be passed to C<valgrind>.
 Honors L</no_def_supp> and L</extra_supps>.
 
@@ -378,6 +424,12 @@ sub suppressions {
 
 =head2 C<start>
 
+    $tvs->start(
+     action  => $action,
+     tool    => $tool,
+     command => $command,
+    );
+
 Starts the action and tool associated to the current run.
 It's automatically called at the beginning of L</run>.
 
@@ -388,7 +440,7 @@ sub start {
 
  my %args = @_;
 
- for (qw/action tool command/) {
+ for (qw<action tool command>) {
   my $base = 'Test::Valgrind::' . ucfirst;
   my $value = $args{$_};
   $self->_croak("Invalid $_") unless Scalar::Util::blessed($value)
@@ -396,7 +448,7 @@ sub start {
   $self->$_($args{$_})
  }
 
- delete @{$self}{qw/last_status exit_code/};
+ delete @{$self}{qw<last_status exit_code>};
 
  $self->tool->start($self);
  $self->parser($self->parser_class->new)->start($self);
@@ -405,7 +457,9 @@ sub start {
  return;
 }
 
-=head2 C<abort $msg>
+=head2 C<abort>
+
+    $tvs->abort($msg);
 
 Forwards to C<< ->action->abort >> after unshifting the session object to the argument list.
 
@@ -417,7 +471,9 @@ sub abort {
  $self->action->abort($self, @_);
 }
 
-=head2 C<report $report>
+=head2 C<report>
+
+    $tvs->report($report);
 
 Forwards to C<< ->action->report >> after unshifting the session object to the argument list.
 
@@ -428,7 +484,7 @@ sub report {
 
  return unless defined $report;
 
- for my $handler (qw/tool command/) {
+ for my $handler (qw<tool command>) {
   $report = $self->$handler->filter($self, $report);
   return unless defined $report;
  }
@@ -438,6 +494,8 @@ sub report {
 
 =head2 C<finish>
 
+    $tvs->finish;
+
 Finishes the action and tool associated to the current run.
 It's automatically called at the end of L</run>.
 
@@ -462,6 +520,8 @@ sub finish {
 
 =head2 C<status>
 
+    my $status = $tvs->status;
+
 Returns the status code of the last run of the session.
 
 =cut
@@ -493,7 +553,7 @@ You can find documentation for this module with the perldoc command.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2009 Vincent Pit, all rights reserved.
+Copyright 2009,2010,2011,2013 Vincent Pit, all rights reserved.
 
 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.