]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/commitdiff
Improve detection of executables
authorVincent Pit <perl@profvince.com>
Mon, 16 Nov 2015 13:25:56 +0000 (11:25 -0200)
committerVincent Pit <perl@profvince.com>
Mon, 16 Nov 2015 13:41:19 +0000 (11:41 -0200)
Also make Test::Valgrind::FakeValgrind decide if the test should be skipped
or not depending on the operating system.

Makefile.PL
lib/Test/Valgrind/Session.pm
t/30-skip.t
t/70-session.t
t/lib/Test/Valgrind/FakeValgrind.pm

index 35627d2037f4a13920f723292865e47416049852..39d91cebb8e7753d73a8fd7569a7d1fc5802878e 100644 (file)
@@ -124,6 +124,7 @@ my %PREREQ_PM = (
  'Carp'                  => 0,
  'Digest::MD5'           => 0,
  'Env::Sanctify'         => 0,
+ 'ExtUtils::MM'          => 0,
  'File::HomeDir'         => '0.86',
  'File::Path'            => 0,
  'File::Spec'            => 0,
index ba00ee24e02028b4ac7a7d6c4e6ddc2c97671f9e..d222f11ae788a4d0394607ca3728325b1325002a 100644 (file)
@@ -22,7 +22,9 @@ It also acts as a dispatcher between the different components.
 
 =cut
 
+use Config       ();
 use File::Spec   ();
+use ExtUtils::MM (); # MM->maybe_command()
 use Scalar::Util ();
 
 use Fcntl       (); # F_SETFD
@@ -111,10 +113,12 @@ sub new {
  if (defined $vg and not ref $vg) {
   @paths = ($vg);
  } else {
-  push @paths, @$vg if $vg and ref $vg eq 'ARRAY';
+  push @paths, @$vg if defined $vg and ref $vg eq 'ARRAY';
   my $dirs = delete $args{search_dirs};
-  $dirs = [ File::Spec->path ] unless $dirs;
-  push @paths, map File::Spec->catfile($_, 'valgrind'), @$dirs
+  $dirs = [ File::Spec->path ] unless defined $dirs;
+  my $exe_name = 'valgrind';
+  $exe_name   .= $Config::Config{exe_ext} if defined $Config::Config{exe_ext};
+  push @paths, map File::Spec->catfile($_, $exe_name), @$dirs
                                                         if ref $dirs eq 'ARRAY';
  }
  $class->_croak('Empty valgrind candidates list') unless @paths;
@@ -125,16 +129,16 @@ sub new {
  }
 
  my ($valgrind, $version);
- for (@paths) {
-  next unless -x;
-  my $output = qx/$_ --version/;
+ for my $path (@paths) {
+  next unless defined($path) and MM->maybe_command($path);
+  my $output = qx/$path --version/;
   $version   = do {
    local $@;
    eval { Test::Valgrind::Version->new(command_output => $output) };
   };
   if (defined $version) {
    next if defined $min_version and $version < $min_version;
-   $valgrind = $_;
+   $valgrind = $path;
    last;
   }
  }
index b758af10fc973ef299b38a96a14d1d08bf55fd08..5a35a2c96b4a453a1fd6357f25a019868d1fdf95 100644 (file)
@@ -20,8 +20,6 @@ SKIP: {
 }
 
 SKIP: {
- skip 'Only on linux or darwin' => 1 unless $^O eq 'linux' or $^O eq 'darwin';
-
  my $old_vg = Test::Valgrind::FakeValgrind->new(
   exe_name => 'valgrind',
   version  => '3.0.0',
@@ -35,8 +33,6 @@ SKIP: {
 }
 
 SKIP: {
- skip 'Only on linux or darwin' => 1 unless $^O eq 'linux' or $^O eq 'darwin';
-
  my $new_vg = Test::Valgrind::FakeValgrind->new(
   exe_name => 'valgrind',
   version  => '3.4.0',
@@ -49,4 +45,3 @@ SKIP: {
  like $out, qr/^1\.\.0 # (?:SKIP|Skip) No compatible suppressions available/,
             'correctly skip when no compatible suppressions were available';
 }
-
index c9c3cc4e28f3ba226a32a5c3219a081c82f59d69..f39285f703111197bd5d22749d667d793dbd094f 100644 (file)
@@ -23,8 +23,6 @@ $sess = eval { Test::Valgrind::Session->new(
 like $@, qr/^No appropriate valgrind executable/, 'nonexistant valgrind';
 
 SKIP: {
- skip 'Only on linux or darwin' => 5 unless $^O eq 'linux' or $^O eq 'darwin';
-
  my $old_vg = Test::Valgrind::FakeValgrind->new(
   version => '3.0.0',
  );
index 067309b6a5cd708f0b04a8fc064673ffbe49740b..0d13a0d50fdf226fdd30410dbafc9c7861767956 100644 (file)
@@ -45,28 +45,39 @@ BEGIN {
 sub new {
  my ($class, %args) = @_;
 
+ return 'Temporary executables do not work on Windows' if $^O eq 'MSWin32';
+
  my $exe_name = $args{exe_name};
  my $version  = $args{version} || '3.1.0';
  my $body     = $args{body};
 
  my $self = { };
 
+ my $exe_ext = $Config::Config{exe_ext};
+ $exe_ext    = '' unless defined $exe_ext;
  if (defined $exe_name) {
   return 'File::Temp 0.19 is required to make a proper temporary directory'
          unless $good_enough_file_temp;
+  if (length $exe_ext and $exe_name !~ /\Q$exe_ext\E$/) {
+   $exe_name .= $exe_ext;
+  }
   $self->{tmp_dir_obj}  = File::Temp->newdir(CLEANUP => 1);
   $self->{tmp_dir}      = $self->{tmp_dir_obj}->dirname;
   $self->{tmp_file}     = File::Spec->catfile($self->{tmp_dir}, $exe_name);
  } else {
   # Can't use the OO interface if we don't wan't the file to be opened by
   # default, but then we have to deal with cleanup ourselves.
-  local $^W = 0;
-  (undef, my $tmp_file) = File::Temp::tempfile(
+  my %args = (
    TEMPLATE => 'fakevgXXXX',
    TMPDIR   => 1,
    CLEANUP  => 0,
    OPEN     => 0,
   );
+  $args{SUFFIX} = $exe_ext if length $exe_ext;
+  my $tmp_file = do {
+   local $^W = 0;
+   (File::Temp::tempfile(%args))[1]
+  };
   $self->{tmp_file}     = $tmp_file;
   my ($vol, $dir)       = File::Spec->splitpath($self->{tmp_file});
   $self->{tmp_dir}      = File::Spec->catpath($vol, $dir, '');