FileAttributes.java revision 3471:236e3f2d0a6b
1/* 2 * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* @test 25 * @bug 4313887 6838333 26 * @summary Unit test for java.nio.file.Files 27 * @library .. 28 */ 29 30import java.nio.file.*; 31import java.nio.file.attribute.*; 32import java.io.IOException; 33import java.util.*; 34import java.util.concurrent.TimeUnit; 35 36/** 37 * Exercises getAttribute/setAttribute/readAttributes methods. 38 */ 39 40public class FileAttributes { 41 42 static void assertTrue(boolean okay) { 43 if (!okay) 44 throw new RuntimeException("Assertion Failed"); 45 } 46 47 static void checkEqual(Object o1, Object o2) { 48 if (o1 == null) { 49 assertTrue(o2 == null); 50 } else { 51 assertTrue (o1.equals(o2)); 52 } 53 } 54 55 // checks that two time values are within 1s of each other 56 static void checkNearEqual(FileTime t1, FileTime t2) { 57 long diff = Math.abs(t1.toMillis() - t2.toMillis()); 58 assertTrue(diff <= 1000); 59 } 60 61 // Exercise getAttribute/setAttribute/readAttributes on basic attributes 62 static void checkBasicAttributes(Path file, BasicFileAttributes attrs) 63 throws IOException 64 { 65 // getAttribute 66 checkEqual(attrs.size(), Files.getAttribute(file, "size")); 67 checkEqual(attrs.lastModifiedTime(), Files.getAttribute(file, "basic:lastModifiedTime")); 68 checkEqual(attrs.lastAccessTime(), Files.getAttribute(file, "lastAccessTime")); 69 checkEqual(attrs.creationTime(), Files.getAttribute(file, "basic:creationTime")); 70 assertTrue((Boolean)Files.getAttribute(file, "isRegularFile")); 71 assertTrue(!(Boolean)Files.getAttribute(file, "basic:isDirectory")); 72 assertTrue(!(Boolean)Files.getAttribute(file, "isSymbolicLink")); 73 assertTrue(!(Boolean)Files.getAttribute(file, "basic:isOther")); 74 checkEqual(attrs.fileKey(), Files.getAttribute(file, "basic:fileKey")); 75 76 // setAttribute 77 FileTime modTime = attrs.lastModifiedTime(); 78 Files.setAttribute(file, "basic:lastModifiedTime", FileTime.fromMillis(0L)); 79 checkEqual(Files.getLastModifiedTime(file), 80 FileTime.fromMillis(0L)); 81 Files.setAttribute(file, "lastModifiedTime", modTime); 82 checkEqual(Files.getLastModifiedTime(file), modTime); 83 84 Map<String,Object> map; 85 map = Files.readAttributes(file, "*"); 86 assertTrue(map.size() >= 9); 87 checkEqual(attrs.isRegularFile(), map.get("isRegularFile")); // check one 88 89 map = Files.readAttributes(file, "basic:*"); 90 assertTrue(map.size() >= 9); 91 checkEqual(attrs.lastAccessTime(), map.get("lastAccessTime")); // check one 92 93 map = Files.readAttributes(file, "size,lastModifiedTime"); 94 assertTrue(map.size() == 2); 95 checkEqual(attrs.size(), map.get("size")); 96 checkEqual(attrs.lastModifiedTime(), map.get("lastModifiedTime")); 97 98 map = Files.readAttributes(file, 99 "basic:lastModifiedTime,lastAccessTime,ShouldNotExist"); 100 assertTrue(map.size() == 2); 101 checkEqual(attrs.lastModifiedTime(), map.get("lastModifiedTime")); 102 checkEqual(attrs.lastAccessTime(), map.get("lastAccessTime")); 103 } 104 105 // Exercise getAttribute/setAttribute/readAttributes on posix attributes 106 static void checkPosixAttributes(Path file, PosixFileAttributes attrs) 107 throws IOException 108 { 109 checkBasicAttributes(file, attrs); 110 111 // getAttribute 112 checkEqual(attrs.permissions(), Files.getAttribute(file, "posix:permissions")); 113 checkEqual(attrs.owner(), Files.getAttribute(file, "posix:owner")); 114 checkEqual(attrs.group(), Files.getAttribute(file, "posix:group")); 115 116 // setAttribute 117 Set<PosixFilePermission> orig = attrs.permissions(); 118 Set<PosixFilePermission> newPerms = new HashSet<>(orig); 119 newPerms.remove(PosixFilePermission.OTHERS_READ); 120 newPerms.remove(PosixFilePermission.OTHERS_WRITE); 121 newPerms.remove(PosixFilePermission.OTHERS_EXECUTE); 122 Files.setAttribute(file, "posix:permissions", newPerms); 123 checkEqual(Files.getPosixFilePermissions(file), newPerms); 124 Files.setAttribute(file, "posix:permissions", orig); 125 checkEqual(Files.getPosixFilePermissions(file), orig); 126 Files.setAttribute(file, "posix:owner", attrs.owner()); 127 Files.setAttribute(file, "posix:group", attrs.group()); 128 129 // readAttributes 130 Map<String,Object> map; 131 map = Files.readAttributes(file, "posix:*"); 132 assertTrue(map.size() >= 12); 133 checkEqual(attrs.permissions(), map.get("permissions")); // check one 134 135 map = Files.readAttributes(file, "posix:size,owner,ShouldNotExist"); 136 assertTrue(map.size() == 2); 137 checkEqual(attrs.size(), map.get("size")); 138 checkEqual(attrs.owner(), map.get("owner")); 139 } 140 141 // Exercise getAttribute/readAttributes on unix attributes 142 static void checkUnixAttributes(Path file) throws IOException { 143 // getAttribute 144 int mode = (Integer)Files.getAttribute(file, "unix:mode"); 145 long ino = (Long)Files.getAttribute(file, "unix:ino"); 146 long dev = (Long)Files.getAttribute(file, "unix:dev"); 147 long rdev = (Long)Files.getAttribute(file, "unix:rdev"); 148 int nlink = (Integer)Files.getAttribute(file, "unix:nlink"); 149 int uid = (Integer)Files.getAttribute(file, "unix:uid"); 150 int gid = (Integer)Files.getAttribute(file, "unix:gid"); 151 FileTime ctime = (FileTime)Files.getAttribute(file, "unix:ctime"); 152 153 // readAttributes 154 Map<String,Object> map; 155 map = Files.readAttributes(file, "unix:*"); 156 assertTrue(map.size() >= 20); 157 158 map = Files.readAttributes(file, "unix:size,uid,gid,ShouldNotExist"); 159 assertTrue(map.size() == 3); 160 checkEqual(map.get("size"), 161 Files.readAttributes(file, BasicFileAttributes.class).size()); 162 } 163 164 // Exercise getAttribute/setAttribute on dos attributes 165 static void checkDosAttributes(Path file, DosFileAttributes attrs) 166 throws IOException 167 { 168 checkBasicAttributes(file, attrs); 169 170 // getAttribute 171 checkEqual(attrs.isReadOnly(), Files.getAttribute(file, "dos:readonly")); 172 checkEqual(attrs.isHidden(), Files.getAttribute(file, "dos:hidden")); 173 checkEqual(attrs.isSystem(), Files.getAttribute(file, "dos:system")); 174 checkEqual(attrs.isArchive(), Files.getAttribute(file, "dos:archive")); 175 176 // setAttribute 177 boolean value; 178 179 value = attrs.isReadOnly(); 180 Files.setAttribute(file, "dos:readonly", !value); 181 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isReadOnly(), !value); 182 Files.setAttribute(file, "dos:readonly", value); 183 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isReadOnly(), value); 184 185 value = attrs.isHidden(); 186 Files.setAttribute(file, "dos:hidden", !value); 187 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isHidden(), !value); 188 Files.setAttribute(file, "dos:hidden", value); 189 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isHidden(), value); 190 191 value = attrs.isSystem(); 192 Files.setAttribute(file, "dos:system", !value); 193 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isSystem(), !value); 194 Files.setAttribute(file, "dos:system", value); 195 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isSystem(), value); 196 197 value = attrs.isArchive(); 198 Files.setAttribute(file, "dos:archive", !value); 199 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isArchive(), !value); 200 Files.setAttribute(file, "dos:archive", value); 201 checkEqual(Files.readAttributes(file, DosFileAttributes.class).isArchive(), value); 202 203 // readAttributes 204 Map<String,Object> map; 205 map = Files.readAttributes(file, "dos:*"); 206 assertTrue(map.size() >= 13); 207 checkEqual(attrs.isReadOnly(), map.get("readonly")); // check one 208 209 map = Files.readAttributes(file, "dos:size,hidden,ShouldNotExist"); 210 assertTrue(map.size() == 2); 211 checkEqual(attrs.size(), map.get("size")); 212 checkEqual(attrs.isHidden(), map.get("hidden")); 213 } 214 215 static void miscTests(Path file) throws IOException { 216 // NPE tests 217 try { 218 Files.getAttribute(file, null); 219 throw new RuntimeException("NullPointerException expected"); 220 } catch (NullPointerException npe) { } 221 try { 222 Files.getAttribute(file, "isRegularFile", (LinkOption[])null); 223 throw new RuntimeException("NullPointerException expected"); 224 } catch (NullPointerException npe) { } 225 try { 226 Files.setAttribute(file, null, 0L); 227 throw new RuntimeException("NullPointerException expected"); 228 } catch (NullPointerException npe) { } 229 } 230 231 static void doTests(Path dir) throws IOException { 232 Path file = dir.resolve("foo"); 233 Files.createFile(file); 234 FileStore store = Files.getFileStore(file); 235 try { 236 checkBasicAttributes(file, 237 Files.readAttributes(file, BasicFileAttributes.class)); 238 239 if (store.supportsFileAttributeView("posix")) 240 checkPosixAttributes(file, 241 Files.readAttributes(file, PosixFileAttributes.class)); 242 243 if (store.supportsFileAttributeView("unix")) 244 checkUnixAttributes(file); 245 246 if (store.supportsFileAttributeView("dos")) 247 checkDosAttributes(file, 248 Files.readAttributes(file, DosFileAttributes.class)); 249 250 miscTests(file); 251 } finally { 252 Files.delete(file); 253 } 254 } 255 256 257 public static void main(String[] args) throws IOException { 258 Path dir = TestUtil.createTemporaryDirectory(); 259 try { 260 doTests(dir); 261 } finally { 262 TestUtil.removeAll(dir); 263 } 264 } 265} 266