From: Vincent Pit Date: Tue, 14 Apr 2009 13:47:10 +0000 (+0200) Subject: A new PerlScript command that specializes the Perl command to scripts X-Git-Tag: v1.01~7 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FTest-Valgrind.git;a=commitdiff_plain;h=3968e3b9715c8e5e7eaf998012d434b914b9e126 A new PerlScript command that specializes the Perl command to scripts So that we can move the taint mode handling from Test::Valgrind to there. --- diff --git a/MANIFEST b/MANIFEST index d38a971..785365d 100644 --- a/MANIFEST +++ b/MANIFEST @@ -12,6 +12,7 @@ lib/Test/Valgrind/Action/Test.pm lib/Test/Valgrind/Carp.pm lib/Test/Valgrind/Command.pm lib/Test/Valgrind/Command/Perl.pm +lib/Test/Valgrind/Command/PerlScript.pm lib/Test/Valgrind/Report.pm lib/Test/Valgrind/Session.pm lib/Test/Valgrind/Suppressions.pm diff --git a/lib/Test/Valgrind.pm b/lib/Test/Valgrind.pm index 1fac287..a447541 100644 --- a/lib/Test/Valgrind.pm +++ b/lib/Test/Valgrind.pm @@ -136,20 +136,11 @@ sub import { return; } - my $taint_mode; - { - open my $fh, '<', $file or last; - my $first = <$fh>; - close $fh; - if ($first and my ($args) = $first =~ /^\s*#\s*!\s*perl\s*(.*)/) { - $taint_mode = 1 if $args =~ /(?:^|\s)-T(?:$|\s)/; - } - } - require Test::Valgrind::Command; my $cmd = Test::Valgrind::Command->new( - command => 'Perl', - args => [ '-MTest::Valgrind=run,1', (('-T') x!! $taint_mode), $file ], + command => 'PerlScript', + file => $file, + args => [ '-MTest::Valgrind=run,1' ], ); my $instanceof = sub { diff --git a/lib/Test/Valgrind/Command/PerlScript.pm b/lib/Test/Valgrind/Command/PerlScript.pm new file mode 100644 index 0000000..a107b79 --- /dev/null +++ b/lib/Test/Valgrind/Command/PerlScript.pm @@ -0,0 +1,121 @@ +package Test::Valgrind::Command::PerlScript; + +use strict; +use warnings; + +=head1 NAME + +Test::Valgrind::Command::PerlScript - A Test::Valgrind command that invokes a perl script. + +=head1 VERSION + +Version 1.00 + +=cut + +our $VERSION = '1.00'; + +=head1 DESCRIPTION + +This command is meant to abstract the argument list handling of a C script. + +=cut + +use base qw/Test::Valgrind::Command::Perl Test::Valgrind::Carp/; + +=head1 METHODS + +This class inherits L. + +=head2 C<< new file => $file, [ taint_mode => $taint_mode ], ... >> + +Your usual constructor. + +C<$file> is the path to the C script you want to run. + +C<$taint_mode> is a boolean that specifies if the script should be run under taint mode. +If C is passed (which is the default), the constructor will try to infer it from the shebang line of the script. + +Other arguments are passed straight to C<< Test::Valgrind::Command::Perl->new >>. + +=cut + +sub new { + my $class = shift; + $class = ref($class) || $class; + + my %args = @_; + + my $file = delete $args{file}; + $class->_croak('Invalid script file') unless $file and -e $file; + my $taint_mode = delete $args{taint_mode}; + + my $self = bless $class->SUPER::new(%args), $class; + + $self->{file} = $file; + + if (not defined $taint_mode and open my $fh, '<', $file) { + my $first = <$fh>; + close $fh; + if ($first and my ($args) = $first =~ /^\s*#\s*!\s*perl\s*(.*)/) { + $taint_mode = 1 if $args =~ /(?:^|\s)-T(?:$|\s)/; + } + $taint_mode = 0 unless defined $taint_mode; + } + $self->{taint_mode} = $taint_mode; + + return $self; +} + +sub new_trainer { Test::Valgrind::Command::Perl->new_trainer } + +=head2 C + +Read-only accessor for the C option. + +=head2 C + +Read-only accessor for the C option. + +=cut + +eval "sub $_ { \$_[0]->{$_} }" for qw/file taint_mode/; + +sub args { + my $self = shift; + + return $self->SUPER::args(@_), + (('-T') x!! $self->taint_mode), + $self->file +} + +=head1 SEE ALSO + +L, L. + +=head1 AUTHOR + +Vincent Pit, C<< >>, L. + +You can contact me by mail or on C (vincent). + +=head1 BUGS + +Please report any bugs or feature requests to C, or through the web interface at L. +I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command. + + perldoc Test::Valgrind::Command::PerlScript + +=head1 COPYRIGHT & LICENSE + +Copyright 2009 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. + +=cut + +1; # End of Test::Valgrind::Command::PerlScript diff --git a/t/92-pod-coverage.t b/t/92-pod-coverage.t index 3e6f0da..dcfcec8 100644 --- a/t/92-pod-coverage.t +++ b/t/92-pod-coverage.t @@ -18,7 +18,7 @@ plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" if $@ my $trustparents = { coverage_class => 'Pod::Coverage::CountParents' }; -plan tests => 14; +plan tests => 15; pod_coverage_ok('Test::Valgrind'); @@ -31,6 +31,7 @@ pod_coverage_ok('Test::Valgrind::Carp'); pod_coverage_ok('Test::Valgrind::Command'); pod_coverage_ok('Test::Valgrind::Command::Perl', $trustparents); +pod_coverage_ok('Test::Valgrind::Command::PerlScript', $trustparents); pod_coverage_ok('Test::Valgrind::Report'); pod_coverage_ok('Test::Valgrind::Session');