|
Packit |
a89ea5 |
#!/usr/local/bin/perl -w
|
|
Packit |
a89ea5 |
# Test for File::Temp - tempfile function
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
use strict;
|
|
Packit |
a89ea5 |
use Test::More tests => 28;
|
|
Packit |
a89ea5 |
use File::Spec;
|
|
Packit |
a89ea5 |
use Cwd qw/ cwd /;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Will need to check that all files were unlinked correctly
|
|
Packit |
a89ea5 |
# Set up an END block here to do it
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Arrays containing list of dirs/files to test
|
|
Packit |
a89ea5 |
my (@files, @dirs, @still_there);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# And a test for files that should still be around
|
|
Packit |
a89ea5 |
# These are tidied up
|
|
Packit |
a89ea5 |
END {
|
|
Packit |
a89ea5 |
foreach (@still_there) {
|
|
Packit |
a89ea5 |
($_) = /(^.*)/; # untaint for testing under taint mode
|
|
Packit |
a89ea5 |
ok( -f $_, "File $_ is still present" );
|
|
Packit |
a89ea5 |
ok( unlink( $_ ), "Unlink file" );
|
|
Packit |
a89ea5 |
ok( !(-f $_), "File is no longer present" );
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Loop over an array hoping that the files dont exist
|
|
Packit |
a89ea5 |
END { foreach (@files) { ok( !(-e $_), "File $_ should not be present" )} }
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# And a test for directories
|
|
Packit |
a89ea5 |
END { foreach (@dirs) { ok( !(-d $_), "Dir $_ should not be present" )} }
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Need to make sure that the END blocks are setup before
|
|
Packit |
a89ea5 |
# the ones that File::Temp configures since END blocks are evaluated
|
|
Packit |
a89ea5 |
# in revers order and we need to check the files *after* File::Temp
|
|
Packit |
a89ea5 |
# removes them
|
|
Packit |
a89ea5 |
use File::Temp qw/ tempfile tempdir/;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Now we start the tests properly
|
|
Packit |
a89ea5 |
ok(1, "Start test");
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Tempfile
|
|
Packit |
a89ea5 |
# Open tempfile in some directory, unlink at end
|
|
Packit |
a89ea5 |
my ($fh, $tempfile) = tempfile(
|
|
Packit |
a89ea5 |
UNLINK => 1,
|
|
Packit |
a89ea5 |
SUFFIX => '.txt',
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile), "Tempfile exists" );
|
|
Packit |
a89ea5 |
# Should still be around after closing
|
|
Packit |
a89ea5 |
ok( close( $fh ), "Tempfile closed" );
|
|
Packit |
a89ea5 |
ok( (-f $tempfile), "Tempfile exists" );
|
|
Packit |
a89ea5 |
# Check again at exit
|
|
Packit |
a89ea5 |
push(@files, $tempfile);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# TEMPDIR test
|
|
Packit |
a89ea5 |
# Create temp directory in current dir
|
|
Packit |
a89ea5 |
my $template = 'tmpdirXXXXXX';
|
|
Packit |
a89ea5 |
print "# Template: $template\n";
|
|
Packit |
a89ea5 |
my $tempdir = tempdir( $template ,
|
|
Packit |
a89ea5 |
DIR => File::Spec->curdir,
|
|
Packit |
a89ea5 |
CLEANUP => 1,
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPDIR: $tempdir\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-d $tempdir), "Local tempdir exists" );
|
|
Packit |
a89ea5 |
push(@dirs, File::Spec->rel2abs($tempdir));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
my $tempdir2 = tempdir( TEMPLATE => "customXXXXX",
|
|
Packit |
a89ea5 |
DIR => File::Spec->curdir,
|
|
Packit |
a89ea5 |
CLEANUP => 1,
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPDIR2: $tempdir2\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
like( $tempdir2, qr/custom/, "tempdir with TEMPLATE" );
|
|
Packit |
a89ea5 |
push(@dirs, File::Spec->rel2abs($tempdir));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Create file in the temp dir
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile(
|
|
Packit |
a89ea5 |
DIR => $tempdir,
|
|
Packit |
a89ea5 |
UNLINK => 1,
|
|
Packit |
a89ea5 |
SUFFIX => '.dat',
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPFILE: Created $tempfile\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile), "Local temp file exists with .dat extension");
|
|
Packit |
a89ea5 |
push(@files, File::Spec->rel2abs($tempfile));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Test tempfile
|
|
Packit |
a89ea5 |
# ..and again
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile(
|
|
Packit |
a89ea5 |
DIR => $tempdir,
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile ), "Local tempfile in tempdir exists");
|
|
Packit |
a89ea5 |
push(@files, File::Spec->rel2abs($tempfile));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Test tempfile
|
|
Packit |
a89ea5 |
# ..and another with changed permissions (read-only)
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile(
|
|
Packit |
a89ea5 |
DIR => $tempdir,
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
chmod 0444, $tempfile;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile ), "Local tempfile in tempdir exists read-only");
|
|
Packit |
a89ea5 |
push(@files, File::Spec->rel2abs($tempfile));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPFILE: Created $tempfile\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# and another (with template)
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile( 'helloXXXXXXX',
|
|
Packit |
a89ea5 |
DIR => $tempdir,
|
|
Packit |
a89ea5 |
UNLINK => 1,
|
|
Packit |
a89ea5 |
SUFFIX => '.dat',
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPFILE: Created $tempfile\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile), "Local tempfile in tempdir with .dat extension exists" );
|
|
Packit |
a89ea5 |
push(@files, File::Spec->rel2abs($tempfile));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# and another (with TEMPLATE)
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile( TEMPLATE => 'goodbyeXXXXXXX',
|
|
Packit |
a89ea5 |
DIR => $tempdir,
|
|
Packit |
a89ea5 |
UNLINK => 1,
|
|
Packit |
a89ea5 |
SUFFIX => '.dat',
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPFILE: Created $tempfile\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-f $tempfile), "Local tempfile in tempdir with TEMPLATE" );
|
|
Packit |
a89ea5 |
push(@files, File::Spec->rel2abs($tempfile));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Create a temporary file that should stay around after
|
|
Packit |
a89ea5 |
# it has been closed
|
|
Packit |
a89ea5 |
($fh, $tempfile) = tempfile( 'permXXXXXXX', UNLINK => 0 );
|
|
Packit |
a89ea5 |
print "# TEMPFILE: Created $tempfile\n";
|
|
Packit |
a89ea5 |
ok( -f $tempfile, "Long-lived temp file" );
|
|
Packit |
a89ea5 |
ok( close( $fh ), "Close long-lived temp file" );
|
|
Packit |
a89ea5 |
push( @still_there, File::Spec->rel2abs($tempfile) ); # check at END
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Would like to create a temp file and just retrieve the handle
|
|
Packit |
a89ea5 |
# but the test is problematic since:
|
|
Packit |
a89ea5 |
# - We dont know the filename so we cant check that it is tidied
|
|
Packit |
a89ea5 |
# correctly
|
|
Packit |
a89ea5 |
# - The unlink0 required on unix for tempfile creation will fail
|
|
Packit |
a89ea5 |
# on NFS
|
|
Packit |
a89ea5 |
# Try to do what we can.
|
|
Packit |
a89ea5 |
# Tempfile croaks on error so we need an eval
|
|
Packit |
a89ea5 |
$fh = eval { tempfile( 'ftmpXXXXX', DIR => File::Temp::_wrap_file_spec_tmpdir() ) };
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
if ($fh) {
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# print something to it to make sure something is there
|
|
Packit |
a89ea5 |
ok( print($fh "Test\n"), "Write to temp file" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Close it - can not check it is gone since we dont know the name
|
|
Packit |
a89ea5 |
ok( close($fh), "Close temp file" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
} else {
|
|
Packit |
a89ea5 |
SKIP: {
|
|
Packit |
a89ea5 |
skip "Skip Failed probably due to NFS", 2;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Create temp directory and chdir to it; it should still be removed on exit.
|
|
Packit |
a89ea5 |
$tempdir = tempdir(CLEANUP => 1);
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
print "# TEMPDIR: $tempdir\n";
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
ok( (-d $tempdir), "Temp directory in temp dir" );
|
|
Packit |
a89ea5 |
chdir $tempdir or die $!;
|
|
Packit |
a89ea5 |
push(@dirs, File::Spec->rel2abs($tempdir));
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Now END block will execute to test the removal of directories
|
|
Packit |
a89ea5 |
print "# End of tests. Execute END blocks in directory ". cwd() ."\n";
|
|
Packit |
a89ea5 |
|