1 package Test::Valgrind::FakeValgrind;
10 sub _dummy_valgrind_code {
11 my ($version, $body) = @_;
14 unless (-e $perl and -x $perl) {
15 $perl = $Config::Config{perlpath};
16 unless (-e $perl and -x $perl) {
29 if (\@ARGV == 1 && \$ARGV[0] eq '--version') {
30 print "valgrind-$version\n";
36 my $good_enough_file_temp;
38 $good_enough_file_temp = do {
41 eval { File::Temp->VERSION('0.19'); 1 }
46 my ($class, %args) = @_;
48 return 'Temporary executables do not work on Windows' if $^O eq 'MSWin32';
50 my $exe_name = $args{exe_name};
51 my $version = $args{version} || '3.1.0';
52 my $body = $args{body};
56 my $exe_ext = $Config::Config{exe_ext};
57 $exe_ext = '' unless defined $exe_ext;
58 if (defined $exe_name) {
59 return 'File::Temp 0.19 is required to make a proper temporary directory'
60 unless $good_enough_file_temp;
61 if (length $exe_ext and $exe_name !~ /\Q$exe_ext\E$/) {
62 $exe_name .= $exe_ext;
64 $self->{tmp_dir_obj} = File::Temp->newdir(CLEANUP => 1);
65 $self->{tmp_dir} = $self->{tmp_dir_obj}->dirname;
66 $self->{tmp_file} = File::Spec->catfile($self->{tmp_dir}, $exe_name);
68 # Can't use the OO interface if we don't wan't the file to be opened by
69 # default, but then we have to deal with cleanup ourselves.
71 TEMPLATE => 'fakevgXXXX',
76 $args{SUFFIX} = $exe_ext if length $exe_ext;
79 (File::Temp::tempfile(%args))[1]
81 $self->{tmp_file} = $tmp_file;
82 my ($vol, $dir) = File::Spec->splitpath($self->{tmp_file});
83 $self->{tmp_dir} = File::Spec->catpath($vol, $dir, '');
86 my $code = _dummy_valgrind_code($version, $body);
87 return 'Could not generate the dummy valgrind executable' unless $code;
89 return 'Temporary file already exists' if -s $self->{tmp_file};
92 open my $vg_fh, '>', $self->{tmp_file};
95 chmod 0755, $self->{tmp_file};
101 sub path { $_[0]->{tmp_file} }
103 sub dir { $_[0]->{tmp_dir} }
105 sub DESTROY { 1 while unlink $_[0]->{tmp_file} }