test/java/nio/file/Files/TemporaryFiles.java

Print this page

        

@@ -20,79 +20,152 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
 /* @test
- * @bug 4313887 6838333
- * @summary Unit test for File.createTemporaryXXX (to be be moved to test/java/io/File)
+ * @bug 4313887 6838333 7006126
+ * @summary Unit test for Files.createTempXXX
  * @library ..
  */
 
 import java.nio.file.*;
 import static java.nio.file.StandardOpenOption.*;
 import java.nio.file.attribute.*;
-import java.io.File;
 import java.io.IOException;
 import java.util.Set;
 
 public class TemporaryFiles {
 
-    static void checkInTempDirectory(Path file) {
-        Path tmpdir = Paths.get(System.getProperty("java.io.tmpdir"));
-        if (!file.getParent().equals(tmpdir))
-            throw new RuntimeException("Not in temporary directory");
+    static void checkInDirectory(Path file, Path dir) {
+        if (dir == null)
+            dir = Paths.get(System.getProperty("java.io.tmpdir"));
+        if (!file.getParent().equals(dir))
+            throw new RuntimeException("Not in expected directory");
     }
 
-    static void checkFile(Path file) throws IOException {
-        // check file is in temporary directory
-        checkInTempDirectory(file);
+    static void testTempFile(String prefix, String suffix, Path dir)
+        throws IOException
+    {
+        Path file = (dir == null) ?
+            Files.createTempFile(prefix, suffix) :
+            Files.createTempFile(dir, prefix, suffix);
+        try {
+            // check file name
+            String name = file.getFileName().toString();
+            if (prefix != null && !name.startsWith(prefix))
+                throw new RuntimeException("Should start with " + prefix);
+            if (suffix == null && !name.endsWith(".tmp"))
+                throw new RuntimeException("Should end with .tmp");
+            if (suffix != null && !name.endsWith(suffix))
+                throw new RuntimeException("Should end with " + suffix);
 
+            // check file is in expected directory
+            checkInDirectory(file, dir);
+
         // check that file can be opened for reading and writing
-        file.newByteChannel(READ).close();
-        file.newByteChannel(WRITE).close();
-        file.newByteChannel(READ,WRITE).close();
+            Files.newByteChannel(file, READ).close();
+            Files.newByteChannel(file, WRITE).close();
+            Files.newByteChannel(file, READ,WRITE).close();
 
         // check file permissions are 0600 or more secure
-        if (file.getFileStore().supportsFileAttributeView("posix")) {
-            Set<PosixFilePermission> perms = Attributes
-                .readPosixFileAttributes(file).permissions();
+            if (Files.getFileStore(file).supportsFileAttributeView("posix")) {
+                Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
             perms.remove(PosixFilePermission.OWNER_READ);
             perms.remove(PosixFilePermission.OWNER_WRITE);
             if (!perms.isEmpty())
                 throw new RuntimeException("Temporary file is not secure");
         }
+        } finally {
+            Files.delete(file);
     }
+    }
 
-    static void checkDirectory(Path dir) throws IOException {
-        // check directory is in temporary directory
-        checkInTempDirectory(dir);
+    static void testTempFile(String prefix, String suffix)
+        throws IOException
+    {
+        testTempFile(prefix, suffix, null);
+    }
 
+    static void testTempDirectory(String prefix, Path dir) throws IOException {
+        Path subdir = (dir == null) ?
+            Files.createTempDirectory(prefix) :
+            Files.createTempDirectory(dir, prefix);
+        try {
+            // check file name
+            String name = subdir.getFileName().toString();
+            if (prefix != null && !name.startsWith(prefix))
+                throw new RuntimeException("Should start with " + prefix);
+
+            // check directory is in expected directory
+            checkInDirectory(subdir, dir);
+
         // check directory is empty
-        DirectoryStream<Path> stream = dir.newDirectoryStream();
+            DirectoryStream<Path> stream = Files.newDirectoryStream(subdir);
         try {
             if (stream.iterator().hasNext())
                 throw new RuntimeException("Tempory directory not empty");
         } finally {
             stream.close();
         }
 
+            // check that we can create file in directory
+            Path file = Files.createFile(subdir.resolve("foo"));
+            try {
+                Files.newByteChannel(file, READ,WRITE).close();
+            } finally {
+                Files.delete(file);
+            }
+
         // check file permissions are 0700 or more secure
-        if (dir.getFileStore().supportsFileAttributeView("posix")) {
-            Set<PosixFilePermission> perms = Attributes
-                .readPosixFileAttributes(dir).permissions();
+            if (Files.getFileStore(subdir).supportsFileAttributeView("posix")) {
+                Set<PosixFilePermission> perms = Files.getPosixFilePermissions(subdir);
             perms.remove(PosixFilePermission.OWNER_READ);
             perms.remove(PosixFilePermission.OWNER_WRITE);
             perms.remove(PosixFilePermission.OWNER_EXECUTE);
             if (!perms.isEmpty())
                 throw new RuntimeException("Temporary directory is not secure");
         }
+        } finally {
+            Files.delete(subdir);
     }
+    }
 
+    static void testTempDirectory(String prefix) throws IOException {
+        testTempDirectory(prefix, null);
+    }
+
+    static void testInvalidFileTemp(String prefix, String suffix) throws IOException {
+        try {
+            Path file = Files.createTempFile(prefix, suffix);
+            Files.delete(file);
+            throw new RuntimeException("IllegalArgumentException expected");
+        } catch (IllegalArgumentException expected) { }
+    }
+
     public static void main(String[] args) throws IOException {
-        Path file = File.createTemporaryFile("blah", null).toPath();
+        // temporary-file directory
+        testTempFile("blah", ".dat");
+        testTempFile("blah", null);
+        testTempFile(null, ".dat");
+        testTempFile(null, null);
+        testTempDirectory("blah");
+        testTempDirectory(null);
+
+        // a given directory
+        Path dir = Files.createTempDirectory("tmpdir");
         try {
-            checkFile(file);
+            testTempFile("blah", ".dat", dir);
+            testTempFile("blah", null, dir);
+            testTempFile(null, ".dat", dir);
+            testTempFile(null, null, dir);
+            testTempDirectory("blah", dir);
+            testTempDirectory(null, dir);
         } finally {
-            TestUtil.deleteUnchecked(file);
+            Files.delete(dir);
         }
+
+        // invalid prefix and suffix
+        testInvalidFileTemp("../blah", null);
+        testInvalidFileTemp("dir/blah", null);
+        testInvalidFileTemp("blah", ".dat/foo");
     }
 }