X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2Flib%2FTest%2FValgrind%2FFakeValgrind.pm;h=0d13a0d50fdf226fdd30410dbafc9c7861767956;hb=5f7c59874ed712bf2787c3b0dbbaaf899fdd508c;hp=098bae02fed9b17e04dd9a13c67ca131077778d5;hpb=15e7706165e33a1e52fba63877a92613ff1794a8;p=perl%2Fmodules%2FTest-Valgrind.git diff --git a/t/lib/Test/Valgrind/FakeValgrind.pm b/t/lib/Test/Valgrind/FakeValgrind.pm index 098bae0..0d13a0d 100644 --- a/t/lib/Test/Valgrind/FakeValgrind.pm +++ b/t/lib/Test/Valgrind/FakeValgrind.pm @@ -8,7 +8,7 @@ use File::Spec; use File::Temp; sub _dummy_valgrind_code { - my ($version) = @_; + my ($version, $body) = @_; my $perl = $^X; unless (-e $perl and -x $perl) { @@ -18,34 +18,72 @@ sub _dummy_valgrind_code { } } + if (defined $body) { + $body = "\n$body"; + } else { + $body = ''; + } + return <<" FAKE_VG"; #!$perl if (\@ARGV == 1 && \$ARGV[0] eq '--version') { print "valgrind-$version\n"; -} + exit 0; +}$body FAKE_VG } +my $good_enough_file_temp; +BEGIN { + $good_enough_file_temp = do { + no warnings; + local $@; + eval { File::Temp->VERSION('0.19'); 1 } + } +} + 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 { - $self->{tmp_file_obj} = File::Temp->new(UNLINK => 1); - $self->{tmp_file} = $self->{tmp_file_obj}->filename; + # 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. + 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, ''); } - my $code = _dummy_valgrind_code($version); + my $code = _dummy_valgrind_code($version, $body); return 'Could not generate the dummy valgrind executable' unless $code; return 'Temporary file already exists' if -s $self->{tmp_file}; @@ -60,8 +98,10 @@ sub new { bless $self, $class; } -sub path { $_[0]->{tmp_file} } +sub path { $_[0]->{tmp_file} } + +sub dir { $_[0]->{tmp_dir} } -sub dir { $_[0]->{tmp_dir} } +sub DESTROY { 1 while unlink $_[0]->{tmp_file} } 1;