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