1 /* 2 * Copyright (c) 2013, 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 8003992 26 * @summary Test file path name normalizer, and ensure it can handle embedded 27 * NUL character correctly. 28 * @author Dan Xu 29 */ 30 31 import java.io.File; 32 33 public class Normalize { 34 35 private final static char CHAR_NUL = '\u0000'; 36 37 public static void main(String[] args) { 38 testNormalizer(); 39 testUnixNormalizer(); 40 testWindowsNormalizer(); 41 } 42 43 private static void testNormalizer() { 44 StringBuilder name = new StringBuilder(); 45 46 test(name.append(""), ""); 47 test(name.append("").append(CHAR_NUL), ""); 48 test(name.append(CHAR_NUL).append("").append(CHAR_NUL), ""); 49 test(name.append(CHAR_NUL).append(CHAR_NUL).append("") 50 .append(CHAR_NUL).append(CHAR_NUL).append("") 51 .append(CHAR_NUL).append(CHAR_NUL), ""); 52 } 53 54 private static void testUnixNormalizer() { 55 String osName = System.getProperty("os.name"); 56 if (osName.startsWith("Windows")) 57 return; 58 59 StringBuilder name = new StringBuilder(); 60 61 test(name.append('/'), "/"); 62 63 name.setLength(0); 64 test(name.append(CHAR_NUL).append("/").append(CHAR_NUL), "/"); 65 66 name.setLength(0); 67 test(name.append("//"), "/"); 68 69 name.setLength(0); 70 test(name.append(CHAR_NUL).append("/").append(CHAR_NUL) 71 .append("/").append(CHAR_NUL), "/"); 72 73 name.setLength(0); 74 test(name.append("///"), "/"); 75 76 name.setLength(0); 77 test(name.append(CHAR_NUL).append("/").append(CHAR_NUL) 78 .append("/").append(CHAR_NUL) 79 .append("/").append(CHAR_NUL), "/"); 80 81 name.setLength(0); 82 test(name.append("/data//"), "/data"); 83 84 name.setLength(0); 85 test(name.append("/data").append(CHAR_NUL).append('/') 86 .append(CHAR_NUL).append('/'), "/data"); 87 88 name.setLength(0); 89 test(name.append("/data//info"), "/data/info"); 90 91 name.setLength(0); 92 test(name.append("/data//info/"), "/data/info"); 93 94 name.setLength(0); 95 test(name.append("//data///info//"), "/data/info"); 96 97 name.setLength(0); 98 test(name.append(CHAR_NUL).append('/').append(CHAR_NUL).append('/') 99 .append("//data//").append(CHAR_NUL).append("//info//") 100 .append(CHAR_NUL).append("/").append(CHAR_NUL), "/data/info"); 101 102 name.setLength(0); 103 test(name.append("//data///info//Book///"), "/data/info/Book"); 104 105 name.setLength(0); 106 test(name.append(CHAR_NUL).append('/').append(CHAR_NUL).append('/') 107 .append("//data//").append(CHAR_NUL).append("//info//") 108 .append(CHAR_NUL).append("/").append(CHAR_NUL).append("Book") 109 .append(CHAR_NUL).append("///"), "/data/info/Book"); 110 111 name.setLength(0); 112 test(name.append("data///info//Book///"), "data/info/Book"); 113 114 name.setLength(0); 115 test(name.append(CHAR_NUL).append(CHAR_NUL).append("data//") 116 .append(CHAR_NUL).append("//info//").append(CHAR_NUL) 117 .append("/").append(CHAR_NUL).append("Book") 118 .append(CHAR_NUL).append("///"), "data/info/Book"); 119 } 120 121 private static void testWindowsNormalizer() { 122 String osName = System.getProperty("os.name"); 123 if (!osName.startsWith("Windows")) 124 return; 125 126 StringBuilder name = new StringBuilder(); 127 128 test(name.append('/'), "\\"); 129 130 name.setLength(0); 131 test(name.append(CHAR_NUL).append("/").append(CHAR_NUL), "\\"); 132 133 name.setLength(0); 134 test(name.append('\\'), "\\"); 135 136 name.setLength(0); 137 test(name.append(CHAR_NUL).append("\\").append(CHAR_NUL), "\\"); 138 139 name.setLength(0); 140 test(name.append("\\\\"), "\\\\"); 141 142 name.setLength(0); 143 test(name.append(CHAR_NUL).append("\\").append(CHAR_NUL) 144 .append("\\").append(CHAR_NUL), "\\\\"); 145 146 name.setLength(0); 147 test(name.append("\\/"), "\\\\"); 148 149 name.setLength(0); 150 test(name.append(CHAR_NUL).append("\\").append(CHAR_NUL) 151 .append("/").append(CHAR_NUL), "\\\\"); 152 153 name.setLength(0); 154 test(name.append("/\\"), "\\\\"); 155 156 name.setLength(0); 157 test(name.append(CHAR_NUL).append(CHAR_NUL).append("/").append(CHAR_NUL) 158 .append("\\").append(CHAR_NUL), "\\\\"); 159 160 name.setLength(0); 161 test(name.append("/\\/"), "\\\\"); 162 163 name.setLength(0); 164 test(name.append("/\\\\"), "\\\\"); 165 166 name.setLength(0); 167 test(name.append("\\\\\\"), "\\\\"); 168 169 name.setLength(0); 170 test(name.append("///"), "\\\\"); 171 172 name.setLength(0); 173 test(name.append(CHAR_NUL).append(CHAR_NUL).append("/").append(CHAR_NUL) 174 .append("\\").append(CHAR_NUL) 175 .append("\\").append(CHAR_NUL), "\\\\"); 176 177 name.setLength(0); 178 test(name.append("z:"), "z:"); 179 180 name.setLength(0); 181 test(name.append(CHAR_NUL).append("z:").append(CHAR_NUL), "z:"); 182 183 name.setLength(0); 184 test(name.append("\\z:"), "z:"); 185 186 name.setLength(0); 187 test(name.append(CHAR_NUL).append("\\").append(CHAR_NUL) 188 .append("z:").append(CHAR_NUL), "z:"); 189 190 name.setLength(0); 191 test(name.append("z:\\"), "z:\\"); 192 193 name.setLength(0); 194 test(name.append(CHAR_NUL).append(CHAR_NUL) 195 .append("z:").append(CHAR_NUL).append("\\"), "z:\\"); 196 197 name.setLength(0); 198 test(name.append(CHAR_NUL).append(CHAR_NUL) 199 .append("z:").append("\\").append(CHAR_NUL), "z:\\"); 200 201 name.setLength(0); 202 test(name.append("z:/"), "z:\\"); 203 204 name.setLength(0); 205 test(name.append(CHAR_NUL).append(CHAR_NUL) 206 .append("z:").append(CHAR_NUL).append("/"), "z:\\"); 207 208 name.setLength(0); 209 test(name.append(CHAR_NUL).append(CHAR_NUL).append("z:") 210 .append("/").append(CHAR_NUL).append(CHAR_NUL), "z:\\"); 211 212 name.setLength(0); 213 test(name.append("\\z:\\"), "z:\\"); 214 215 name.setLength(0); 216 test(name.append(CHAR_NUL).append("\\").append("z").append(CHAR_NUL) 217 .append(':').append(CHAR_NUL).append("\\") 218 .append(CHAR_NUL), "z:\\"); 219 220 name.setLength(0); 221 test(name.append("\\z:\\\\"), "z:\\"); 222 223 name.setLength(0); 224 test(name.append(CHAR_NUL).append("\\").append("z").append(CHAR_NUL) 225 .append(':').append(CHAR_NUL).append("\\") 226 .append(CHAR_NUL).append('/'), "z:\\"); 227 228 name.setLength(0); 229 test(name.append("\\\\z:\\\\"), "z:\\"); 230 231 name.setLength(0); 232 test(name.append('/').append(CHAR_NUL).append("\\").append("z") 233 .append(CHAR_NUL).append(':').append(CHAR_NUL).append("\\") 234 .append(CHAR_NUL).append('/').append(CHAR_NUL), "z:\\"); 235 236 name.setLength(0); 237 test(name.append("\\\\\\z:\\\\\\"), "z:\\"); 238 239 name.setLength(0); 240 test(name.append(CHAR_NUL).append("\\").append('/').append(CHAR_NUL) 241 .append("\\").append("z").append(CHAR_NUL).append(CHAR_NUL) 242 .append(':').append(CHAR_NUL).append("\\").append(CHAR_NUL) 243 .append('/').append(CHAR_NUL).append(CHAR_NUL) 244 .append('/').append(CHAR_NUL).append(CHAR_NUL), "z:\\"); 245 246 name.setLength(0); 247 test(name.append("\\\\\\//z:\\\\\\"), "z:\\"); 248 249 name.setLength(0); 250 test(name.append(CHAR_NUL).append("\\").append('/').append(CHAR_NUL) 251 .append("\\").append("//").append(CHAR_NUL).append("z") 252 .append(CHAR_NUL).append(CHAR_NUL).append(CHAR_NUL) 253 .append(':').append(CHAR_NUL).append("\\").append(CHAR_NUL) 254 .append('/').append(CHAR_NUL).append(CHAR_NUL) 255 .append('/').append(CHAR_NUL).append(CHAR_NUL), "z:\\"); 256 257 name.setLength(0); 258 test(name.append("\\\\\\//z:\\\\\\data///info/\\Book"), 259 "z:\\data\\info\\Book"); 260 261 name.setLength(0); 262 test(name.append(CHAR_NUL).append("\\").append('/').append(CHAR_NUL) 263 .append("\\").append("//").append(CHAR_NUL).append("z") 264 .append(CHAR_NUL).append(CHAR_NUL).append(CHAR_NUL) 265 .append(':').append(CHAR_NUL).append("\\").append(CHAR_NUL) 266 .append('/').append(CHAR_NUL).append(CHAR_NUL) 267 .append('/').append(CHAR_NUL).append(CHAR_NUL) 268 .append("data").append('\\').append(CHAR_NUL) 269 .append('/').append(CHAR_NUL).append(CHAR_NUL) 270 .append("info").append('/').append(CHAR_NUL) 271 .append('\\').append(CHAR_NUL).append(CHAR_NUL) 272 .append("Book").append('/').append(CHAR_NUL) 273 .append('\\').append(CHAR_NUL).append(CHAR_NUL) 274 .append(CHAR_NUL), "z:\\data\\info\\Book"); 275 } 276 277 private static void test(StringBuilder pathName, String normalPath) { 278 File aFile = new File(pathName.toString()); 279 String path = aFile.getPath(); 280 281 if (!normalPath.equals(path)) 282 throw new RuntimeException("File path, " + pathName + 283 "(length " + pathName.length() + 284 "), should be normalized to, " + normalPath + 285 "(length " + normalPath.length() + 286 "), not, " + path + "(length " + path.length() + ")"); 287 } 288 }