X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FTest%2FValgrind%2FSession.pm;h=3174bdef84d6962962d1457bbf5882405cb0ea05;hb=1fdcbca240b4f4d939304b6e3c002d9ecc4289b4;hp=6c09793a91e20c08e28c973613f0f16794a3e88c;hpb=b41c498738a3a4ccb8742883a42e6ea5addb1afd;p=perl%2Fmodules%2FTest-Valgrind.git diff --git a/lib/Test/Valgrind/Session.pm b/lib/Test/Valgrind/Session.pm index 6c09793..3174bde 100644 --- a/lib/Test/Valgrind/Session.pm +++ b/lib/Test/Valgrind/Session.pm @@ -9,11 +9,11 @@ Test::Valgrind::Session - Test::Valgrind session object. =head1 VERSION -Version 1.00 +Version 1.01 =cut -our $VERSION = '1.00'; +our $VERSION = '1.01'; =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 executable. The L object associated to the selected C. +=cut + +sub version { + my ($self) = @_; + + my $version = $self->{version}; + $self->{version} = $version = $build_version->($version) unless ref $version; + + return $version; +} + =head2 C Read-only accessor for the C option. =cut -eval "sub $_ { \$_[0]->{$_} }" for qw/valgrind version no_def_supp/; +eval "sub $_ { \$_[0]->{$_} }" for qw/valgrind no_def_supp/; =head2 C @@ -158,14 +176,31 @@ sub extra_supps { @{$_[0]->{extra_supps} || []} } Runs the command C<$command> through C with the tool C<$tool>, which will report to the action C<$action>. +If the command is a L 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 Returns an absolute path to the default suppression file associated to the current session. -C will be returned as soon as any of C<< ->tool->suppressions_tag >> or C<< ->tool->suppressions_tag >> are also C. + +C will be returned as soon as any of C<< ->command->suppressions_tag >> or C<< ->tool->suppressions_tag >> are also C. 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