Integrate perlio:
[p5sagit/p5-mst-13.2.git] / t / lib / ftmp-tempfile.t
index 9c0de8b..ed59765 100755 (executable)
@@ -1,30 +1,46 @@
-#!./perl
+#!/usr/local/bin/perl -w
+# Test for File::Temp - tempfile function
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib';
+       chdir 't' if -d 't';
+       @INC = '../lib';
+       require Test; import Test;
+       plan(tests => 20);
 }
 
-# Test for File::Temp - tempfile function
-
 use strict;
-use Test;
-BEGIN { plan tests => 10}
 use File::Spec;
-use File::Temp qw/ tempfile tempdir/;
 
 # Will need to check that all files were unlinked correctly
-# Set up an END block here to do it (since the END blocks
-# set up by File::Temp will be evaluated in reverse order we
-# set ours up first....
+# Set up an END block here to do it
+
+# Arrays containing list of dirs/files to test
+my (@files, @dirs, @still_there);
+
+# And a test for files that should still be around
+# These are tidied up
+END {
+  foreach (@still_there) {
+    ok( -f $_ );
+    ok( unlink( $_ ) );
+    ok( !(-f $_) );
+  }
+}
 
 # Loop over an array hoping that the files dont exist
-my @files;
-eval q{ END { foreach (@files) { ok( !(-e $_) )} } 1; } || die; 
+END { foreach (@files) { ok( !(-e $_) )} }
 
 # And a test for directories
-my @dirs;
-eval q{ END { foreach (@dirs) { ok( !(-d $_) )} } 1; } || die; 
+END { foreach (@dirs)  { ok( !(-d $_) )} }
+
+# Need to make sure that the END blocks are setup before
+# the ones that File::Temp configures since END blocks are evaluated
+# in revers order and we need to check the files *after* File::Temp
+# removes them
+use File::Temp qw/ tempfile tempdir/;
+
+# Now we start the tests properly
+ok(1);
 
 
 # Tempfile
@@ -35,6 +51,10 @@ my ($fh, $tempfile) = tempfile(
                              );
 
 ok( (-f $tempfile) );
+# Should still be around after closing
+ok( close( $fh ) ); 
+ok( (-f $tempfile) );
+# Check again at exit
 push(@files, $tempfile);
 
 # TEMPDIR test
@@ -88,5 +108,38 @@ print "# TEMPFILE: Created $tempfile\n";
 ok( (-f $tempfile) );
 push(@files, $tempfile);
 
-# no tests yet to make sure that the END{} blocks correctly remove
-# the files
+
+# Create a temporary file that should stay around after
+# it has been closed
+($fh, $tempfile) = tempfile( 'permXXXXXXX', UNLINK => 0 );
+print "# TEMPFILE: Created $tempfile\n";
+ok( -f $tempfile );
+ok( close( $fh ) );
+push( @still_there, $tempfile); # check at END
+
+# Would like to create a temp file and just retrieve the handle
+# but the test is problematic since:
+#  - We dont know the filename so we cant check that it is tidied
+#    correctly
+#  - The unlink0 required on unix for tempfile creation will fail
+#    on NFS
+# Try to do what we can.
+# Tempfile croaks on error so we need an eval
+$fh = eval { tempfile( 'ftmpXXXXX', DIR => File::Spec->tmpdir ) };
+
+if ($fh) {
+
+  # print something to it to make sure something is there
+  ok( print $fh "Test\n" );
+
+  # Close it - can not check it is gone since we dont know the name
+  ok( close($fh) );
+
+} else {
+  skip "Skip Failed probably due to NFS", 1;
+  skip "Skip Failed probably due to NFS", 1;
+}
+
+# Now END block will execute to test the removal of directories
+print "# End of tests. Execute END blocks\n";
+