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 }