/* * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test * @bug 4313887 6838333 7006126 7023034 * @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.IOException; import java.util.Set; public class TemporaryFiles { 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 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 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 (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 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 = 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 (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 { // 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 { testTempFile("blah", ".dat", dir); testTempFile("blah", null, dir); testTempFile(null, ".dat", dir); testTempFile(null, null, dir); testTempDirectory("blah", dir); testTempDirectory(null, dir); } finally { Files.delete(dir); } // invalid prefix and suffix testInvalidFileTemp("../blah", null); testInvalidFileTemp("dir/blah", null); testInvalidFileTemp("blah", ".dat/foo"); // nulls try { Files.createTempFile("blah", ".tmp", (FileAttribute<?>[])null); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } try { Files.createTempFile("blah", ".tmp", new FileAttribute<?>[] { null }); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } try { Files.createTempDirectory("blah", (FileAttribute<?>[])null); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } try { Files.createTempDirectory("blah", new FileAttribute<?>[] { null }); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } try { Files.createTempFile((Path)null, "blah", ".tmp"); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } try { Files.createTempDirectory((Path)null, "blah"); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } } }