]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/blobdiff - lib/Test/Valgrind/Session.pm
This is 1.02
[perl/modules/Test-Valgrind.git] / lib / Test / Valgrind / Session.pm
index 6c09793a91e20c08e28c973613f0f16794a3e88c..95aaa011b9bf7e3c414b27da8e27306f5da89879 100644 (file)
@@ -9,11 +9,11 @@ Test::Valgrind::Session - Test::Valgrind session object.
 
 =head1 VERSION
 
-Version 1.00
+Version 1.02
 
 =cut
 
-our $VERSION = '1.00';
+our $VERSION = '1.02';
 
 =head1 DESCRIPTION
 
@@ -30,8 +30,6 @@ BEGIN {
 
  require Fcntl; # F_SETFD
  require POSIX; # SIGKILL
-
- require version;
 }
 
 use base qw/Test::Valgrind::Carp/;
@@ -82,6 +80,11 @@ Defaults to none.
 
 =cut
 
+my $build_version = sub {
+ require version;
+ version->new($_[0]);
+};
+
 sub new {
  my $class = shift;
  $class = ref($class) || $class;
@@ -102,15 +105,19 @@ sub new {
  $class->_croak('Empty valgrind candidates list') unless @paths;
 
  my $min_version = delete $args{min_version};
- defined and not ref and $_ = version->new($_) for $min_version;
+ defined and not ref and $_ = $build_version->($_) for $min_version;
 
  my ($valgrind, $version);
  for (@paths) {
   next unless -x;
   my $ver = qx/$_ --version/;
   if ($ver =~ /^valgrind-(\d+(\.\d+)*)/) {
-   $version = version->new($1);
-   next if $min_version and $version < $min_version;
+   if ($min_version) {
+    $version = $build_version->($1);
+    next if $version < $min_version;
+   } else {
+    $version = $1;
+   }
    $valgrind = $_;
    last;
   }
@@ -138,13 +145,24 @@ The path to the selected C<valgrind> executable.
 
 The L<version> object associated to the selected C<valgrind>.
 
+=cut
+
+sub version {
+ my ($self) = @_;
+
+ my $version = $self->{version};
+ $self->{version} = $version = $build_version->($version) unless ref $version;
+
+ return $version;
+}
+
 =head2 C<no_def_supp>
 
 Read-only accessor for the C<no_def_supp> option.
 
 =cut
 
-eval "sub $_ { \$_[0]->{$_} }" for qw/valgrind version no_def_supp/;
+eval "sub $_ { \$_[0]->{$_} }" for qw/valgrind no_def_supp/;
 
 =head2 C<extra_supps>
 
@@ -158,14 +176,31 @@ sub extra_supps { @{$_[0]->{extra_supps} || []} }
 
 Runs the command C<$command> through C<valgrind> with the tool C<$tool>, which will report to the action C<$action>.
 
+If the command is a L<Test::Valgrind::Command::Aggregate> object, the action and the tool will be initialized once before running all the aggregated commands.
+
 =cut
 
 sub run {
  my $self = shift;
 
- $self->start(@_);
+ my %args = @_;
+
+ $self->start(%args);
  my $guard = bless sub { $self->finish } => 'Test::Valgrind::Session::Guard';
 
+ $self->_run($args{command});
+}
+
+sub _run {
+ my ($self, $cmd) = @_;
+
+ if ($cmd->isa('Test::Valgrind::Command::Aggregate')) {
+  $self->_run($_) for $cmd->commands;
+  return;
+ }
+
+ $self->command($cmd);
+
  $self->report(Test::Valgrind::Report->new_diag(
   'Using valgrind ' . $self->version . ' located at ' . $self->valgrind
  ));
@@ -284,7 +319,8 @@ sub report_class { $_[0]->tool->report_class($_[0]) }
 =head2 C<def_supp_file>
 
 Returns an absolute path to the default suppression file associated to the current session.
-C<undef> will be returned as soon as any of C<< ->tool->suppressions_tag >> or C<< ->tool->suppressions_tag >> are also C<undef>.
+
+C<undef> will be returned as soon as any of C<< ->command->suppressions_tag >> or C<< ->tool->suppressions_tag >> are also C<undef>.
 Otherwise, the file part of the name is builded by joining those two together, and the directory part is roughly F<< File::HomeDir->my_home / .perl / Test-Valgrind / suppressions / $VERSION >>.
 
 =cut
@@ -376,8 +412,14 @@ Forwards to C<< ->action->report >> after unshifting the session object to the a
 =cut
 
 sub report {
- my $self = shift;
- $self->action->report($self, @_);
+ my ($self, $report) = @_;
+
+ return unless defined $report;
+
+ $report = $self->command->filter($self, $report);
+ return unless defined $report;
+
+ $self->action->report($self, $report);
 }
 
 =head2 C<finish>