1 /* 2 * Copyright (c) 1998, 2010, 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 4032066 4039597 4046914 4054511 4065189 4109131 4875229 6983520 26 @summary General exhaustive test of win32 pathname handling 27 @author Mark Reinhold 28 29 @build General GeneralWin32 30 @run main/timeout=600 GeneralWin32 31 */ 32 33 import java.io.*; 34 35 public class GeneralWin32 extends General { 36 37 38 /** 39 * Hardwired UNC pathnames used for testing 40 * 41 * This test attempts to use the host and share names defined in this class 42 * to test UNC pathnames. The test will not fail if the host or share 43 * don't exist, but it will print a warning saying that it was unable to 44 * test UNC pathnames completely. 45 */ 46 private static final String EXISTENT_UNC_HOST = "pc-cup01"; 47 private static final String EXISTENT_UNC_SHARE = "pcdist"; 48 private static final String NONEXISTENT_UNC_HOST = "non-existent-unc-host"; 49 private static final String NONEXISTENT_UNC_SHARE = "bogus-share"; 50 private static final int DEPTH = 2; 51 private static String baseDir = null; 52 private static String userDir = null; 53 54 /* Pathnames relative to working directory */ 55 56 private static void checkCaseLookup() throws IOException { 57 /* Use long names here to avoid 8.3 format, which Samba servers often 58 force to lowercase */ 59 String relative = baseDir.substring(userDir.length() + 1); 60 File d1 = new File(relative, "XyZzY0123"); 61 File d2 = new File(d1, "FOO_bar_BAZ"); 62 File f = new File(d2, "GLORPified"); 63 if (!f.exists()) { 64 if (!d2.exists()) { 65 if (!d2.mkdirs()) { 66 throw new RuntimeException("Can't create directory " + d2); 67 } 68 } 69 OutputStream o = new FileOutputStream(f); 70 o.close(); 71 } 72 File f2 = new File(d2.getParent(), "mumble"); /* For later ud tests */ 73 if (!f2.exists()) { 74 OutputStream o = new FileOutputStream(f2); 75 o.close(); 76 } 77 78 /* Computing the canonical path of a Win32 file should expose the true 79 case of filenames, rather than just using the input case */ 80 File y = new File(userDir, f.getPath()); 81 String ans = y.getPath(); 82 check(ans, relative + "\\" + "XyZzY0123\\FOO_bar_BAZ\\GLORPified"); 83 check(ans, relative + "\\" + "xyzzy0123\\foo_bar_baz\\glorpified"); 84 check(ans, relative + "\\" + "XYZZY0123\\FOO_BAR_BAZ\\GLORPIFIED"); 85 } 86 87 private static void checkWild(File f) throws Exception { 88 try { 89 f.getCanonicalPath(); 90 } catch (IOException x) { 91 return; 92 } 93 throw new Exception("Wildcard path not rejected: " + f); 94 } 95 96 private static void checkWildCards() throws Exception { 97 File d = new File(baseDir).getCanonicalFile(); 98 checkWild(new File(d, "*.*")); 99 checkWild(new File(d, "*.???")); 100 checkWild(new File(new File(d, "*.*"), "foo")); 101 } 102 103 private static void checkRelativePaths() throws Exception { 104 checkCaseLookup(); 105 checkWildCards(); 106 String relative = baseDir.substring(userDir.length() + 1); 107 checkNames(3, true, baseDir.toString(), relative); 108 } 109 110 111 /* Pathnames with drive specifiers */ 112 113 private static char findInactiveDrive() { 114 for (char d = 'Z'; d >= 'E'; d--) { 115 File df = new File(d + ":\\"); 116 if (!df.exists()) { 117 return d; 118 } 119 } 120 throw new RuntimeException("Can't find an inactive drive"); 121 } 122 123 private static char findActiveDrive() { 124 for (char d = 'C'; d <= 'Z'; d--) { 125 File df = new File(d + ":\\"); 126 if (df.exists()) return d; 127 } 128 throw new RuntimeException("Can't find an active drive"); 129 } 130 131 private static void checkDrive(int depth, char drive, boolean exists) 132 throws Exception 133 { 134 String d = drive + ":"; 135 File df = new File(d); 136 String ans = exists ? df.getAbsolutePath() : d; 137 if (!ans.endsWith("\\")) 138 ans = ans + "\\"; 139 String relative = baseDir.substring(userDir.length() + 1); 140 checkNames(depth, false, ans + relative, d + relative); 141 } 142 143 private static void checkDrivePaths() throws Exception { 144 checkDrive(2, findActiveDrive(), true); 145 checkDrive(2, findInactiveDrive(), false); 146 } 147 148 149 /* UNC pathnames */ 150 151 private static void checkUncPaths() throws Exception { 152 String s = ("\\\\" + NONEXISTENT_UNC_HOST 153 + "\\" + NONEXISTENT_UNC_SHARE); 154 ensureNon(s); 155 checkSlashes(DEPTH, false, s, s); 156 157 s = "\\\\" + EXISTENT_UNC_HOST + "\\" + EXISTENT_UNC_SHARE; 158 if (!(new File(s)).exists()) { 159 System.err.println("WARNING: " + s + 160 " does not exist, unable to test UNC pathnames"); 161 return; 162 } 163 164 checkSlashes(DEPTH, false, s, s); 165 } 166 167 168 public static void main(String[] args) throws Exception { 169 if (File.separatorChar != '\\') { 170 /* This test is only valid on win32 systems */ 171 return; 172 } 173 if (args.length > 0) debug = true; 174 userDir = System.getProperty("user.dir"); 175 baseDir = initTestData(6); 176 checkRelativePaths(); 177 checkDrivePaths(); 178 checkUncPaths(); 179 } 180 181 private static String initTestData(int maxDepth) throws IOException { 182 File parent = new File(System.getProperty("user.dir")); 183 String baseDir = null; 184 maxDepth = maxDepth < DEPTH + 2 ? DEPTH + 2 : maxDepth; 185 for (int i = 0; i < maxDepth; i ++) { 186 File dir1 = new File(parent, gensym()); 187 dir1.mkdir(); 188 if (i != 0) { 189 File dir2 = new File(parent, gensym()); 190 dir2.mkdir(); 191 File f1 = new File(parent, gensym()); 192 f1.createNewFile(); 193 File f2 = new File(parent, gensym()); 194 f2.createNewFile(); 195 } 196 if (i == DEPTH + 1) { 197 baseDir = dir1.getAbsolutePath(); 198 } 199 parent = dir1; 200 } 201 return baseDir; 202 } 203 }