| /* |
| * 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) { } |
| } |
| } |