blob: 0242402f93eb6c885bec15732bf50d76c0ad9752 [file] [log] [blame]
duke6e45e102007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2003 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/* @test
25 @bug 4032066 4039597 4046914 4054511 4065189 4109131 4875229
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
33import java.io.*;
34import java.util.*;
35
36
37public 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}