8062955: (fs spec) Files.setLastModifiedTime should specify SecurityException more clearly
authoralanb
Fri, 28 Nov 2014 14:58:10 +0000
changeset 27775 4ee8b208017c
parent 27774 659f0511ec75
child 27776 b2ddbbc58706
child 27780 a401c6f316d0
8062955: (fs spec) Files.setLastModifiedTime should specify SecurityException more clearly 8062949: (fs) Files.setLastModifiedTime(path, null) does not throw NPE Reviewed-by: chegar
jdk/src/java.base/share/classes/java/nio/file/Files.java
jdk/test/java/nio/file/Files/FileAttributes.java
jdk/test/java/nio/file/Files/SetLastModifiedTime.java
--- a/jdk/src/java.base/share/classes/java/nio/file/Files.java	Wed Nov 26 20:10:48 2014 +0100
+++ b/jdk/src/java.base/share/classes/java/nio/file/Files.java	Fri Nov 28 14:58:10 2014 +0000
@@ -1778,7 +1778,7 @@
      * @param   options
      *          options indicating how symbolic links are handled
      *
-     * @return  the {@code path} parameter
+     * @return  the given path
      *
      * @throws  UnsupportedOperationException
      *          if the attribute view is not available
@@ -2019,7 +2019,7 @@
      * @param   perms
      *          The new set of permissions
      *
-     * @return  The path
+     * @return  The given path
      *
      * @throws  UnsupportedOperationException
      *          if the associated file system does not support the {@code
@@ -2102,7 +2102,7 @@
      * @param   owner
      *          The new file owner
      *
-     * @return  The path
+     * @return  The given path
      *
      * @throws  UnsupportedOperationException
      *          if the associated file system does not support the {@code
@@ -2289,14 +2289,14 @@
      * @param   time
      *          the new last modified time
      *
-     * @return  the path
+     * @return  the given path
      *
      * @throws  IOException
      *          if an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the default provider, the security manager's {@link
-     *          SecurityManager#checkWrite(String) checkWrite} method is invoked
-     *          to check write access to file
+     *          In the case of the default provider, and a security manager is
+     *          installed, its {@link SecurityManager#checkWrite(String)
+     *          checkWrite} method denies write access to the file.
      *
      * @see BasicFileAttributeView#setTimes
      */
@@ -2304,7 +2304,7 @@
         throws IOException
     {
         getFileAttributeView(path, BasicFileAttributeView.class)
-            .setTimes(time, null, null);
+            .setTimes(Objects.requireNonNull(time), null, null);
         return path;
     }
 
--- a/jdk/test/java/nio/file/Files/FileAttributes.java	Wed Nov 26 20:10:48 2014 +0100
+++ b/jdk/test/java/nio/file/Files/FileAttributes.java	Fri Nov 28 14:58:10 2014 +0000
@@ -52,12 +52,6 @@
         }
     }
 
-    // checks that two time values are within 1s of each other
-    static void checkNearEqual(FileTime t1, FileTime t2) {
-        long diff = Math.abs(t1.toMillis() - t2.toMillis());
-        assertTrue(diff <= 1000);
-    }
-
     // Exercise getAttribute/setAttribute/readAttributes on basic attributes
     static void checkBasicAttributes(Path file, BasicFileAttributes attrs)
         throws IOException
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/file/Files/SetLastModifiedTime.java	Fri Nov 28 14:58:10 2014 +0000
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.FileTime;
+
+import org.testng.annotations.Test;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
+
+/**
+ * @test
+ * @bug 4313887 8062949
+ * @library ..
+ * @run testng SetLastModifiedTime
+ * @summary Unit test for Files.setLastModifiedTime
+ */
+
+public class SetLastModifiedTime {
+
+    static Path testDir;
+
+    @BeforeClass
+    void createTestDirectory() throws Exception {
+        testDir = TestUtil.createTemporaryDirectory();
+    }
+
+    @AfterClass
+    void removeTestDirectory() throws Exception {
+        TestUtil.removeAll(testDir);
+    }
+
+    /**
+     * Exercise Files.setLastModifiedTime on the given file
+     */
+    void test(Path path) throws Exception {
+        FileTime now = Files.getLastModifiedTime(path);
+        FileTime zero = FileTime.fromMillis(0L);
+
+        Path result = Files.setLastModifiedTime(path, zero);
+        assertTrue(result == path);
+        assertEquals(Files.getLastModifiedTime(path), zero);
+
+        result = Files.setLastModifiedTime(path, now);
+        assertTrue(result == path);
+        assertEquals(Files.getLastModifiedTime(path), now);
+    }
+
+    @Test
+    public void testRegularFile() throws Exception {
+        Path file = Files.createFile(testDir.resolve("file"));
+        test(file);
+    }
+
+    @Test
+    public void testDirectory() throws Exception {
+        Path dir = Files.createDirectory(testDir.resolve("dir"));
+        test(dir);
+    }
+
+    @Test
+    public void testSymbolicLink() throws Exception {
+        if (TestUtil.supportsLinks(testDir)) {
+            Path target = Files.createFile(testDir.resolve("target"));
+            Path link = testDir.resolve("link");
+            Files.createSymbolicLink(link, target);
+            test(link);
+        }
+    }
+
+    @Test
+    public void testNulls() throws Exception {
+        Path path = Paths.get("foo");
+        FileTime zero = FileTime.fromMillis(0L);
+
+        try {
+            Files.setLastModifiedTime(null, zero);
+            assertTrue(false);
+        } catch (NullPointerException expected) { }
+
+        try {
+            Files.setLastModifiedTime(path, null);
+            assertTrue(false);
+        } catch (NullPointerException expected) { }
+
+        try {
+            Files.setLastModifiedTime(null, null);
+            assertTrue(false);
+        } catch (NullPointerException expected) { }
+    }
+}
+