1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.io; 18 19 import static org.junit.jupiter.api.Assertions.assertEquals; 20 import static org.junit.jupiter.api.Assertions.assertFalse; 21 import static org.junit.jupiter.api.Assertions.assertNull; 22 import static org.junit.jupiter.api.Assertions.assertThrows; 23 import static org.junit.jupiter.api.Assertions.assertTrue; 24 25 import java.io.BufferedOutputStream; 26 import java.io.File; 27 import java.io.IOException; 28 import java.nio.file.Files; 29 import java.nio.file.Path; 30 import java.util.ArrayList; 31 import java.util.Arrays; 32 import java.util.Collection; 33 34 import org.apache.commons.io.test.TestUtils; 35 import org.apache.commons.lang3.SystemUtils; 36 import org.junit.jupiter.api.BeforeEach; 37 import org.junit.jupiter.api.Test; 38 import org.junit.jupiter.api.io.TempDir; 39 40 /** 41 * Tests {@link FilenameUtils}. 42 */ 43 public class FilenameUtilsTest { 44 45 private static final String SEP = "" + File.separatorChar; 46 47 private static final boolean WINDOWS = File.separatorChar == '\\'; 48 49 @TempDir 50 public Path temporaryFolder; 51 52 private Path testFile1; 53 private Path testFile2; 54 55 private int testFile1Size; 56 private int testFile2Size; 57 58 @BeforeEach setUp()59 public void setUp() throws Exception { 60 testFile1 = Files.createTempFile(temporaryFolder, "test", "1"); 61 testFile2 = Files.createTempFile(temporaryFolder, "test", "2"); 62 63 testFile1Size = (int) Files.size(testFile1); 64 testFile2Size = (int) Files.size(testFile2); 65 if (!Files.exists(testFile1.getParent())) { 66 throw new IOException("Cannot create file " + testFile1 67 + " as the parent directory does not exist"); 68 } 69 try (BufferedOutputStream output3 = 70 new BufferedOutputStream(Files.newOutputStream(testFile1))) { 71 TestUtils.generateTestData(output3, testFile1Size); 72 } 73 if (!Files.exists(testFile2.getParent())) { 74 throw new IOException("Cannot create file " + testFile2 75 + " as the parent directory does not exist"); 76 } 77 try (BufferedOutputStream output2 = 78 new BufferedOutputStream(Files.newOutputStream(testFile2))) { 79 TestUtils.generateTestData(output2, testFile2Size); 80 } 81 if (!Files.exists(testFile1.getParent())) { 82 throw new IOException("Cannot create file " + testFile1 83 + " as the parent directory does not exist"); 84 } 85 try (BufferedOutputStream output1 = 86 new BufferedOutputStream(Files.newOutputStream(testFile1))) { 87 TestUtils.generateTestData(output1, testFile1Size); 88 } 89 if (!Files.exists(testFile2.getParent())) { 90 throw new IOException("Cannot create file " + testFile2 91 + " as the parent directory does not exist"); 92 } 93 try (BufferedOutputStream output = 94 new BufferedOutputStream(Files.newOutputStream(testFile2))) { 95 TestUtils.generateTestData(output, testFile2Size); 96 } 97 } 98 99 @Test testConcat()100 public void testConcat() { 101 assertNull(FilenameUtils.concat("", null)); 102 assertNull(FilenameUtils.concat(null, null)); 103 assertNull(FilenameUtils.concat(null, "")); 104 assertNull(FilenameUtils.concat(null, "a")); 105 assertEquals(SEP + "a", FilenameUtils.concat(null, "/a")); 106 107 assertNull(FilenameUtils.concat("", ":")); // invalid prefix 108 assertNull(FilenameUtils.concat(":", "")); // invalid prefix 109 110 assertEquals("f" + SEP, FilenameUtils.concat("", "f/")); 111 assertEquals("f", FilenameUtils.concat("", "f")); 112 assertEquals("a" + SEP + "f" + SEP, FilenameUtils.concat("a/", "f/")); 113 assertEquals("a" + SEP + "f", FilenameUtils.concat("a", "f")); 114 assertEquals("a" + SEP + "b" + SEP + "f" + SEP, FilenameUtils.concat("a/b/", "f/")); 115 assertEquals("a" + SEP + "b" + SEP + "f", FilenameUtils.concat("a/b", "f")); 116 117 assertEquals("a" + SEP + "f" + SEP, FilenameUtils.concat("a/b/", "../f/")); 118 assertEquals("a" + SEP + "f", FilenameUtils.concat("a/b", "../f")); 119 assertEquals("a" + SEP + "c" + SEP + "g" + SEP, FilenameUtils.concat("a/b/../c/", "f/../g/")); 120 assertEquals("a" + SEP + "c" + SEP + "g", FilenameUtils.concat("a/b/../c", "f/../g")); 121 122 assertEquals("a" + SEP + "c.txt" + SEP + "f", FilenameUtils.concat("a/c.txt", "f")); 123 124 assertEquals(SEP + "f" + SEP, FilenameUtils.concat("", "/f/")); 125 assertEquals(SEP + "f", FilenameUtils.concat("", "/f")); 126 assertEquals(SEP + "f" + SEP, FilenameUtils.concat("a/", "/f/")); 127 assertEquals(SEP + "f", FilenameUtils.concat("a", "/f")); 128 129 assertEquals(SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "/c/d")); 130 assertEquals("C:c" + SEP + "d", FilenameUtils.concat("a/b/", "C:c/d")); 131 assertEquals("C:" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "C:/c/d")); 132 assertEquals("~" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "~/c/d")); 133 assertEquals("~user" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "~user/c/d")); 134 assertEquals("~" + SEP, FilenameUtils.concat("a/b/", "~")); 135 assertEquals("~user" + SEP, FilenameUtils.concat("a/b/", "~user")); 136 } 137 138 @Test testDirectoryContains()139 public void testDirectoryContains() { 140 assertTrue(FilenameUtils.directoryContains("/foo", "/foo/bar")); 141 assertTrue(FilenameUtils.directoryContains("/foo/", "/foo/bar")); 142 assertTrue(FilenameUtils.directoryContains("C:\\foo", "C:\\foo\\bar")); 143 assertTrue(FilenameUtils.directoryContains("C:\\foo\\", "C:\\foo\\bar")); 144 145 assertFalse(FilenameUtils.directoryContains("/foo", "/foo")); 146 assertFalse(FilenameUtils.directoryContains("/foo", "/foobar")); 147 assertFalse(FilenameUtils.directoryContains("C:\\foo", "C:\\foobar")); 148 assertFalse(FilenameUtils.directoryContains("/foo", null)); 149 assertFalse(FilenameUtils.directoryContains("", "")); 150 assertFalse(FilenameUtils.directoryContains("", "/foo")); 151 assertFalse(FilenameUtils.directoryContains("/foo", "")); 152 } 153 154 @Test testEquals()155 public void testEquals() { 156 assertTrue(FilenameUtils.equals(null, null)); 157 assertFalse(FilenameUtils.equals(null, "")); 158 assertFalse(FilenameUtils.equals("", null)); 159 assertTrue(FilenameUtils.equals("", "")); 160 assertTrue(FilenameUtils.equals("file.txt", "file.txt")); 161 assertFalse(FilenameUtils.equals("file.txt", "FILE.TXT")); 162 assertFalse(FilenameUtils.equals("a\\b\\file.txt", "a/b/file.txt")); 163 } 164 165 @Test testEquals_fullControl()166 public void testEquals_fullControl() { 167 assertFalse(FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.SENSITIVE)); 168 assertTrue(FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.INSENSITIVE)); 169 assertEquals(WINDOWS, FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.SYSTEM)); 170 assertFalse(FilenameUtils.equals("file.txt", "FILE.TXT", true, null)); 171 } 172 173 @Test testEqualsNormalized()174 public void testEqualsNormalized() { 175 assertTrue(FilenameUtils.equalsNormalized(null, null)); 176 assertFalse(FilenameUtils.equalsNormalized(null, "")); 177 assertFalse(FilenameUtils.equalsNormalized("", null)); 178 assertTrue(FilenameUtils.equalsNormalized("", "")); 179 assertTrue(FilenameUtils.equalsNormalized("file.txt", "file.txt")); 180 assertFalse(FilenameUtils.equalsNormalized("file.txt", "FILE.TXT")); 181 assertTrue(FilenameUtils.equalsNormalized("a\\b\\file.txt", "a/b/file.txt")); 182 assertFalse(FilenameUtils.equalsNormalized("a/b/", "a/b")); 183 } 184 185 /** 186 * Test for https://issues.apache.org/jira/browse/IO-128 187 */ 188 @Test testEqualsNormalizedError_IO_128()189 public void testEqualsNormalizedError_IO_128() { 190 assertFalse(FilenameUtils.equalsNormalizedOnSystem("//file.txt", "file.txt")); 191 assertFalse(FilenameUtils.equalsNormalizedOnSystem("file.txt", "//file.txt")); 192 assertFalse(FilenameUtils.equalsNormalizedOnSystem("//file.txt", "//file.txt")); 193 } 194 195 @Test testEqualsNormalizedOnSystem()196 public void testEqualsNormalizedOnSystem() { 197 assertTrue(FilenameUtils.equalsNormalizedOnSystem(null, null)); 198 assertFalse(FilenameUtils.equalsNormalizedOnSystem(null, "")); 199 assertFalse(FilenameUtils.equalsNormalizedOnSystem("", null)); 200 assertTrue(FilenameUtils.equalsNormalizedOnSystem("", "")); 201 assertTrue(FilenameUtils.equalsNormalizedOnSystem("file.txt", "file.txt")); 202 assertEquals(WINDOWS, FilenameUtils.equalsNormalizedOnSystem("file.txt", "FILE.TXT")); 203 assertTrue(FilenameUtils.equalsNormalizedOnSystem("a\\b\\file.txt", "a/b/file.txt")); 204 assertFalse(FilenameUtils.equalsNormalizedOnSystem("a/b/", "a/b")); 205 } 206 207 @Test testEqualsOnSystem()208 public void testEqualsOnSystem() { 209 assertTrue(FilenameUtils.equalsOnSystem(null, null)); 210 assertFalse(FilenameUtils.equalsOnSystem(null, "")); 211 assertFalse(FilenameUtils.equalsOnSystem("", null)); 212 assertTrue(FilenameUtils.equalsOnSystem("", "")); 213 assertTrue(FilenameUtils.equalsOnSystem("file.txt", "file.txt")); 214 assertEquals(WINDOWS, FilenameUtils.equalsOnSystem("file.txt", "FILE.TXT")); 215 assertFalse(FilenameUtils.equalsOnSystem("a\\b\\file.txt", "a/b/file.txt")); 216 } 217 218 @Test testGetBaseName()219 public void testGetBaseName() { 220 assertNull(FilenameUtils.getBaseName(null)); 221 assertEquals("noseparator", FilenameUtils.getBaseName("noseparator.inthispath")); 222 assertEquals("c", FilenameUtils.getBaseName("a/b/c.txt")); 223 assertEquals("c", FilenameUtils.getBaseName("a/b/c")); 224 assertEquals("", FilenameUtils.getBaseName("a/b/c/")); 225 assertEquals("c", FilenameUtils.getBaseName("a\\b\\c")); 226 assertEquals("file.txt", FilenameUtils.getBaseName("file.txt.bak")); 227 } 228 229 @Test testGetBaseName_with_null_character()230 public void testGetBaseName_with_null_character() { 231 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getBaseName("fil\u0000e.txt.bak")); 232 } 233 234 @Test testGetExtension()235 public void testGetExtension() { 236 assertNull(FilenameUtils.getExtension(null)); 237 assertEquals("ext", FilenameUtils.getExtension("file.ext")); 238 assertEquals("", FilenameUtils.getExtension("README")); 239 assertEquals("com", FilenameUtils.getExtension("domain.dot.com")); 240 assertEquals("jpeg", FilenameUtils.getExtension("image.jpeg")); 241 assertEquals("", FilenameUtils.getExtension("a.b/c")); 242 assertEquals("txt", FilenameUtils.getExtension("a.b/c.txt")); 243 assertEquals("", FilenameUtils.getExtension("a/b/c")); 244 assertEquals("", FilenameUtils.getExtension("a.b\\c")); 245 assertEquals("txt", FilenameUtils.getExtension("a.b\\c.txt")); 246 assertEquals("", FilenameUtils.getExtension("a\\b\\c")); 247 assertEquals("", FilenameUtils.getExtension("C:\\temp\\foo.bar\\README")); 248 assertEquals("ext", FilenameUtils.getExtension("../filename.ext")); 249 250 if (FilenameUtils.isSystemWindows()) { 251 // Special case handling for NTFS ADS names 252 final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getExtension("foo.exe:bar.txt")); 253 assertEquals("NTFS ADS separator (':') in file name is forbidden.", e.getMessage()); 254 } else { 255 // Upwards compatibility: 256 assertEquals("txt", FilenameUtils.getExtension("foo.exe:bar.txt")); 257 } 258 } 259 260 @Test testGetFullPath()261 public void testGetFullPath() { 262 assertNull(FilenameUtils.getFullPath(null)); 263 assertEquals("", FilenameUtils.getFullPath("noseparator.inthispath")); 264 assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c.txt")); 265 assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c")); 266 assertEquals("a/b/c/", FilenameUtils.getFullPath("a/b/c/")); 267 assertEquals("a\\b\\", FilenameUtils.getFullPath("a\\b\\c")); 268 269 assertNull(FilenameUtils.getFullPath(":")); 270 assertNull(FilenameUtils.getFullPath("1:/a/b/c.txt")); 271 assertNull(FilenameUtils.getFullPath("1:")); 272 assertNull(FilenameUtils.getFullPath("1:a")); 273 assertNull(FilenameUtils.getFullPath("///a/b/c.txt")); 274 assertNull(FilenameUtils.getFullPath("//a")); 275 276 assertEquals("", FilenameUtils.getFullPath("")); 277 278 if (SystemUtils.IS_OS_WINDOWS) { 279 assertEquals("C:", FilenameUtils.getFullPath("C:")); 280 } 281 if (SystemUtils.IS_OS_LINUX) { 282 assertEquals("", FilenameUtils.getFullPath("C:")); 283 } 284 285 assertEquals("C:/", FilenameUtils.getFullPath("C:/")); 286 assertEquals("//server/", FilenameUtils.getFullPath("//server/")); 287 assertEquals("~/", FilenameUtils.getFullPath("~")); 288 assertEquals("~/", FilenameUtils.getFullPath("~/")); 289 assertEquals("~user/", FilenameUtils.getFullPath("~user")); 290 assertEquals("~user/", FilenameUtils.getFullPath("~user/")); 291 292 assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c.txt")); 293 assertEquals("/a/b/", FilenameUtils.getFullPath("/a/b/c.txt")); 294 assertEquals("C:", FilenameUtils.getFullPath("C:a")); 295 assertEquals("C:a/b/", FilenameUtils.getFullPath("C:a/b/c.txt")); 296 assertEquals("C:/a/b/", FilenameUtils.getFullPath("C:/a/b/c.txt")); 297 assertEquals("//server/a/b/", FilenameUtils.getFullPath("//server/a/b/c.txt")); 298 assertEquals("~/a/b/", FilenameUtils.getFullPath("~/a/b/c.txt")); 299 assertEquals("~user/a/b/", FilenameUtils.getFullPath("~user/a/b/c.txt")); 300 } 301 302 @Test testGetFullPathNoEndSeparator()303 public void testGetFullPathNoEndSeparator() { 304 assertNull(FilenameUtils.getFullPathNoEndSeparator(null)); 305 assertEquals("", FilenameUtils.getFullPathNoEndSeparator("noseparator.inthispath")); 306 assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c.txt")); 307 assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c")); 308 assertEquals("a/b/c", FilenameUtils.getFullPathNoEndSeparator("a/b/c/")); 309 assertEquals("a\\b", FilenameUtils.getFullPathNoEndSeparator("a\\b\\c")); 310 311 assertNull(FilenameUtils.getFullPathNoEndSeparator(":")); 312 assertNull(FilenameUtils.getFullPathNoEndSeparator("1:/a/b/c.txt")); 313 assertNull(FilenameUtils.getFullPathNoEndSeparator("1:")); 314 assertNull(FilenameUtils.getFullPathNoEndSeparator("1:a")); 315 assertNull(FilenameUtils.getFullPathNoEndSeparator("///a/b/c.txt")); 316 assertNull(FilenameUtils.getFullPathNoEndSeparator("//a")); 317 318 assertEquals("", FilenameUtils.getFullPathNoEndSeparator("")); 319 320 if (SystemUtils.IS_OS_WINDOWS) { 321 assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:")); 322 } 323 if (SystemUtils.IS_OS_LINUX) { 324 assertEquals("", FilenameUtils.getFullPathNoEndSeparator("C:")); 325 } 326 327 assertEquals("C:/", FilenameUtils.getFullPathNoEndSeparator("C:/")); 328 assertEquals("//server/", FilenameUtils.getFullPathNoEndSeparator("//server/")); 329 assertEquals("~", FilenameUtils.getFullPathNoEndSeparator("~")); 330 assertEquals("~/", FilenameUtils.getFullPathNoEndSeparator("~/")); 331 assertEquals("~user", FilenameUtils.getFullPathNoEndSeparator("~user")); 332 assertEquals("~user/", FilenameUtils.getFullPathNoEndSeparator("~user/")); 333 334 assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c.txt")); 335 assertEquals("/a/b", FilenameUtils.getFullPathNoEndSeparator("/a/b/c.txt")); 336 assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:a")); 337 assertEquals("C:a/b", FilenameUtils.getFullPathNoEndSeparator("C:a/b/c.txt")); 338 assertEquals("C:/a/b", FilenameUtils.getFullPathNoEndSeparator("C:/a/b/c.txt")); 339 assertEquals("//server/a/b", FilenameUtils.getFullPathNoEndSeparator("//server/a/b/c.txt")); 340 assertEquals("~/a/b", FilenameUtils.getFullPathNoEndSeparator("~/a/b/c.txt")); 341 assertEquals("~user/a/b", FilenameUtils.getFullPathNoEndSeparator("~user/a/b/c.txt")); 342 } 343 344 /** 345 * Test for https://issues.apache.org/jira/browse/IO-248 346 */ 347 @Test testGetFullPathNoEndSeparator_IO_248()348 public void testGetFullPathNoEndSeparator_IO_248() { 349 350 // Test single separator 351 assertEquals("/", FilenameUtils.getFullPathNoEndSeparator("/")); 352 assertEquals("\\", FilenameUtils.getFullPathNoEndSeparator("\\")); 353 354 // Test one level directory 355 assertEquals("/", FilenameUtils.getFullPathNoEndSeparator("/abc")); 356 assertEquals("\\", FilenameUtils.getFullPathNoEndSeparator("\\abc")); 357 358 // Test one level directory 359 assertEquals("/abc", FilenameUtils.getFullPathNoEndSeparator("/abc/xyz")); 360 assertEquals("\\abc", FilenameUtils.getFullPathNoEndSeparator("\\abc\\xyz")); 361 } 362 363 @Test testGetName()364 public void testGetName() { 365 assertNull(FilenameUtils.getName(null)); 366 assertEquals("noseparator.inthispath", FilenameUtils.getName("noseparator.inthispath")); 367 assertEquals("c.txt", FilenameUtils.getName("a/b/c.txt")); 368 assertEquals("c", FilenameUtils.getName("a/b/c")); 369 assertEquals("", FilenameUtils.getName("a/b/c/")); 370 assertEquals("c", FilenameUtils.getName("a\\b\\c")); 371 } 372 373 @Test testGetPath()374 public void testGetPath() { 375 assertNull(FilenameUtils.getPath(null)); 376 assertEquals("", FilenameUtils.getPath("noseparator.inthispath")); 377 assertEquals("", FilenameUtils.getPath("/noseparator.inthispath")); 378 assertEquals("", FilenameUtils.getPath("\\noseparator.inthispath")); 379 assertEquals("a/b/", FilenameUtils.getPath("a/b/c.txt")); 380 assertEquals("a/b/", FilenameUtils.getPath("a/b/c")); 381 assertEquals("a/b/c/", FilenameUtils.getPath("a/b/c/")); 382 assertEquals("a\\b\\", FilenameUtils.getPath("a\\b\\c")); 383 384 assertNull(FilenameUtils.getPath(":")); 385 assertNull(FilenameUtils.getPath("1:/a/b/c.txt")); 386 assertNull(FilenameUtils.getPath("1:")); 387 assertNull(FilenameUtils.getPath("1:a")); 388 assertNull(FilenameUtils.getPath("///a/b/c.txt")); 389 assertNull(FilenameUtils.getPath("//a")); 390 391 assertEquals("", FilenameUtils.getPath("")); 392 assertEquals("", FilenameUtils.getPath("C:")); 393 assertEquals("", FilenameUtils.getPath("C:/")); 394 assertEquals("", FilenameUtils.getPath("//server/")); 395 assertEquals("", FilenameUtils.getPath("~")); 396 assertEquals("", FilenameUtils.getPath("~/")); 397 assertEquals("", FilenameUtils.getPath("~user")); 398 assertEquals("", FilenameUtils.getPath("~user/")); 399 400 assertEquals("a/b/", FilenameUtils.getPath("a/b/c.txt")); 401 assertEquals("a/b/", FilenameUtils.getPath("/a/b/c.txt")); 402 assertEquals("", FilenameUtils.getPath("C:a")); 403 assertEquals("a/b/", FilenameUtils.getPath("C:a/b/c.txt")); 404 assertEquals("a/b/", FilenameUtils.getPath("C:/a/b/c.txt")); 405 assertEquals("a/b/", FilenameUtils.getPath("//server/a/b/c.txt")); 406 assertEquals("a/b/", FilenameUtils.getPath("~/a/b/c.txt")); 407 assertEquals("a/b/", FilenameUtils.getPath("~user/a/b/c.txt")); 408 } 409 410 411 @Test testGetPath_with_null_character()412 public void testGetPath_with_null_character() { 413 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getPath("~user/a/\u0000b/c.txt")); 414 } 415 416 @Test testGetPathNoEndSeparator()417 public void testGetPathNoEndSeparator() { 418 assertNull(FilenameUtils.getPath(null)); 419 assertEquals("", FilenameUtils.getPath("noseparator.inthispath")); 420 assertEquals("", FilenameUtils.getPathNoEndSeparator("/noseparator.inthispath")); 421 assertEquals("", FilenameUtils.getPathNoEndSeparator("\\noseparator.inthispath")); 422 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c.txt")); 423 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c")); 424 assertEquals("a/b/c", FilenameUtils.getPathNoEndSeparator("a/b/c/")); 425 assertEquals("a\\b", FilenameUtils.getPathNoEndSeparator("a\\b\\c")); 426 427 assertNull(FilenameUtils.getPathNoEndSeparator(":")); 428 assertNull(FilenameUtils.getPathNoEndSeparator("1:/a/b/c.txt")); 429 assertNull(FilenameUtils.getPathNoEndSeparator("1:")); 430 assertNull(FilenameUtils.getPathNoEndSeparator("1:a")); 431 assertNull(FilenameUtils.getPathNoEndSeparator("///a/b/c.txt")); 432 assertNull(FilenameUtils.getPathNoEndSeparator("//a")); 433 434 assertEquals("", FilenameUtils.getPathNoEndSeparator("")); 435 assertEquals("", FilenameUtils.getPathNoEndSeparator("C:")); 436 assertEquals("", FilenameUtils.getPathNoEndSeparator("C:/")); 437 assertEquals("", FilenameUtils.getPathNoEndSeparator("//server/")); 438 assertEquals("", FilenameUtils.getPathNoEndSeparator("~")); 439 assertEquals("", FilenameUtils.getPathNoEndSeparator("~/")); 440 assertEquals("", FilenameUtils.getPathNoEndSeparator("~user")); 441 assertEquals("", FilenameUtils.getPathNoEndSeparator("~user/")); 442 443 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c.txt")); 444 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("/a/b/c.txt")); 445 assertEquals("", FilenameUtils.getPathNoEndSeparator("C:a")); 446 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("C:a/b/c.txt")); 447 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("C:/a/b/c.txt")); 448 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("//server/a/b/c.txt")); 449 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("~/a/b/c.txt")); 450 assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("~user/a/b/c.txt")); 451 } 452 453 @Test testGetPathNoEndSeparator_with_null_character()454 public void testGetPathNoEndSeparator_with_null_character() { 455 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getPathNoEndSeparator("~user/a\u0000/b/c.txt")); 456 } 457 458 @Test testGetPrefix()459 public void testGetPrefix() { 460 assertNull(FilenameUtils.getPrefix(null)); 461 assertNull(FilenameUtils.getPrefix(":")); 462 assertNull(FilenameUtils.getPrefix("1:\\a\\b\\c.txt")); 463 assertNull(FilenameUtils.getPrefix("1:")); 464 assertNull(FilenameUtils.getPrefix("1:a")); 465 assertNull(FilenameUtils.getPrefix("\\\\\\a\\b\\c.txt")); 466 assertNull(FilenameUtils.getPrefix("\\\\a")); 467 468 assertEquals("", FilenameUtils.getPrefix("")); 469 assertEquals("\\", FilenameUtils.getPrefix("\\")); 470 471 if (SystemUtils.IS_OS_WINDOWS) { 472 assertEquals("C:", FilenameUtils.getPrefix("C:")); 473 } 474 if (SystemUtils.IS_OS_LINUX) { 475 assertEquals("", FilenameUtils.getPrefix("C:")); 476 } 477 478 assertEquals("C:\\", FilenameUtils.getPrefix("C:\\")); 479 assertEquals("//server/", FilenameUtils.getPrefix("//server/")); 480 assertEquals("~/", FilenameUtils.getPrefix("~")); 481 assertEquals("~/", FilenameUtils.getPrefix("~/")); 482 assertEquals("~user/", FilenameUtils.getPrefix("~user")); 483 assertEquals("~user/", FilenameUtils.getPrefix("~user/")); 484 485 assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt")); 486 assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt")); 487 assertEquals("C:\\", FilenameUtils.getPrefix("C:\\a\\b\\c.txt")); 488 assertEquals("\\\\server\\", FilenameUtils.getPrefix("\\\\server\\a\\b\\c.txt")); 489 490 assertEquals("", FilenameUtils.getPrefix("a/b/c.txt")); 491 assertEquals("/", FilenameUtils.getPrefix("/a/b/c.txt")); 492 assertEquals("C:/", FilenameUtils.getPrefix("C:/a/b/c.txt")); 493 assertEquals("//server/", FilenameUtils.getPrefix("//server/a/b/c.txt")); 494 assertEquals("~/", FilenameUtils.getPrefix("~/a/b/c.txt")); 495 assertEquals("~user/", FilenameUtils.getPrefix("~user/a/b/c.txt")); 496 497 assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt")); 498 assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt")); 499 assertEquals("~\\", FilenameUtils.getPrefix("~\\a\\b\\c.txt")); 500 assertEquals("~user\\", FilenameUtils.getPrefix("~user\\a\\b\\c.txt")); 501 } 502 503 @Test testGetPrefix_with_null_character()504 public void testGetPrefix_with_null_character() { 505 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getPrefix("~u\u0000ser\\a\\b\\c.txt")); 506 } 507 508 @Test testGetPrefixLength()509 public void testGetPrefixLength() { 510 assertEquals(-1, FilenameUtils.getPrefixLength(null)); 511 assertEquals(-1, FilenameUtils.getPrefixLength(":")); 512 assertEquals(-1, FilenameUtils.getPrefixLength("1:\\a\\b\\c.txt")); 513 assertEquals(-1, FilenameUtils.getPrefixLength("1:")); 514 assertEquals(-1, FilenameUtils.getPrefixLength("1:a")); 515 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\\\a\\b\\c.txt")); 516 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\a")); 517 518 assertEquals(0, FilenameUtils.getPrefixLength("")); 519 assertEquals(1, FilenameUtils.getPrefixLength("\\")); 520 521 if (SystemUtils.IS_OS_WINDOWS) { 522 assertEquals(2, FilenameUtils.getPrefixLength("C:")); 523 } 524 if (SystemUtils.IS_OS_LINUX) { 525 assertEquals(0, FilenameUtils.getPrefixLength("C:")); 526 } 527 528 assertEquals(3, FilenameUtils.getPrefixLength("C:\\")); 529 assertEquals(9, FilenameUtils.getPrefixLength("//server/")); 530 assertEquals(2, FilenameUtils.getPrefixLength("~")); 531 assertEquals(2, FilenameUtils.getPrefixLength("~/")); 532 assertEquals(6, FilenameUtils.getPrefixLength("~user")); 533 assertEquals(6, FilenameUtils.getPrefixLength("~user/")); 534 535 assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt")); 536 assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt")); 537 assertEquals(2, FilenameUtils.getPrefixLength("C:a\\b\\c.txt")); 538 assertEquals(3, FilenameUtils.getPrefixLength("C:\\a\\b\\c.txt")); 539 assertEquals(9, FilenameUtils.getPrefixLength("\\\\server\\a\\b\\c.txt")); 540 541 assertEquals(0, FilenameUtils.getPrefixLength("a/b/c.txt")); 542 assertEquals(1, FilenameUtils.getPrefixLength("/a/b/c.txt")); 543 assertEquals(3, FilenameUtils.getPrefixLength("C:/a/b/c.txt")); 544 assertEquals(9, FilenameUtils.getPrefixLength("//server/a/b/c.txt")); 545 assertEquals(2, FilenameUtils.getPrefixLength("~/a/b/c.txt")); 546 assertEquals(6, FilenameUtils.getPrefixLength("~user/a/b/c.txt")); 547 548 assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt")); 549 assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt")); 550 assertEquals(2, FilenameUtils.getPrefixLength("~\\a\\b\\c.txt")); 551 assertEquals(6, FilenameUtils.getPrefixLength("~user\\a\\b\\c.txt")); 552 553 assertEquals(9, FilenameUtils.getPrefixLength("//server/a/b/c.txt")); 554 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\\\a\\b\\c.txt")); 555 assertEquals(-1, FilenameUtils.getPrefixLength("///a/b/c.txt")); 556 557 assertEquals(1, FilenameUtils.getPrefixLength("/:foo")); 558 assertEquals(1, FilenameUtils.getPrefixLength("/:/")); 559 assertEquals(1, FilenameUtils.getPrefixLength("/:::::::.txt")); 560 561 assertEquals(12, FilenameUtils.getPrefixLength("\\\\127.0.0.1\\a\\b\\c.txt")); 562 assertEquals(6, FilenameUtils.getPrefixLength("\\\\::1\\a\\b\\c.txt")); 563 assertEquals(21, FilenameUtils.getPrefixLength("\\\\server.example.org\\a\\b\\c.txt")); 564 assertEquals(10, FilenameUtils.getPrefixLength("\\\\server.\\a\\b\\c.txt")); 565 566 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\-server\\a\\b\\c.txt")); 567 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\.\\a\\b\\c.txt")); 568 assertEquals(-1, FilenameUtils.getPrefixLength("\\\\..\\a\\b\\c.txt")); 569 } 570 571 @Test testIndexOfExtension()572 public void testIndexOfExtension() { 573 assertEquals(-1, FilenameUtils.indexOfExtension(null)); 574 assertEquals(-1, FilenameUtils.indexOfExtension("file")); 575 assertEquals(4, FilenameUtils.indexOfExtension("file.txt")); 576 assertEquals(13, FilenameUtils.indexOfExtension("a.txt/b.txt/c.txt")); 577 assertEquals(-1, FilenameUtils.indexOfExtension("a/b/c")); 578 assertEquals(-1, FilenameUtils.indexOfExtension("a\\b\\c")); 579 assertEquals(-1, FilenameUtils.indexOfExtension("a/b.notextension/c")); 580 assertEquals(-1, FilenameUtils.indexOfExtension("a\\b.notextension\\c")); 581 582 if (FilenameUtils.isSystemWindows()) { 583 // Special case handling for NTFS ADS names 584 final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> FilenameUtils.indexOfExtension("foo.exe:bar.txt")); 585 assertEquals("NTFS ADS separator (':') in file name is forbidden.", e.getMessage()); 586 } else { 587 // Upwards compatibility on other systems 588 assertEquals(11, FilenameUtils.indexOfExtension("foo.exe:bar.txt")); 589 } 590 591 } 592 593 @Test testIndexOfLastSeparator()594 public void testIndexOfLastSeparator() { 595 assertEquals(-1, FilenameUtils.indexOfLastSeparator(null)); 596 assertEquals(-1, FilenameUtils.indexOfLastSeparator("noseparator.inthispath")); 597 assertEquals(3, FilenameUtils.indexOfLastSeparator("a/b/c")); 598 assertEquals(3, FilenameUtils.indexOfLastSeparator("a\\b\\c")); 599 } 600 601 @Test testInjectionFailure()602 public void testInjectionFailure() { 603 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.getName("a\\b\\\u0000c")); 604 } 605 606 @Test testIsExtension()607 public void testIsExtension() { 608 assertFalse(FilenameUtils.isExtension(null, (String) null)); 609 assertFalse(FilenameUtils.isExtension("file.txt", (String) null)); 610 assertTrue(FilenameUtils.isExtension("file", (String) null)); 611 assertFalse(FilenameUtils.isExtension("file.txt", "")); 612 assertTrue(FilenameUtils.isExtension("file", "")); 613 assertTrue(FilenameUtils.isExtension("file.txt", "txt")); 614 assertFalse(FilenameUtils.isExtension("file.txt", "rtf")); 615 616 assertFalse(FilenameUtils.isExtension("a/b/file.txt", (String) null)); 617 assertFalse(FilenameUtils.isExtension("a/b/file.txt", "")); 618 assertTrue(FilenameUtils.isExtension("a/b/file.txt", "txt")); 619 assertFalse(FilenameUtils.isExtension("a/b/file.txt", "rtf")); 620 621 assertFalse(FilenameUtils.isExtension("a.b/file.txt", (String) null)); 622 assertFalse(FilenameUtils.isExtension("a.b/file.txt", "")); 623 assertTrue(FilenameUtils.isExtension("a.b/file.txt", "txt")); 624 assertFalse(FilenameUtils.isExtension("a.b/file.txt", "rtf")); 625 626 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", (String) null)); 627 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", "")); 628 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", "txt")); 629 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", "rtf")); 630 631 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", (String) null)); 632 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "")); 633 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", "txt")); 634 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "rtf")); 635 636 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "TXT")); 637 } 638 639 @Test testIsExtension_injection()640 public void testIsExtension_injection() { 641 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.isExtension("a.b\\fi\u0000le.txt", "TXT")); 642 } 643 644 @Test testIsExtensionArray()645 public void testIsExtensionArray() { 646 assertFalse(FilenameUtils.isExtension(null, (String[]) null)); 647 assertFalse(FilenameUtils.isExtension("file.txt", (String[]) null)); 648 assertTrue(FilenameUtils.isExtension("file", (String[]) null)); 649 assertFalse(FilenameUtils.isExtension("file.txt")); 650 assertTrue(FilenameUtils.isExtension("file.txt", new String[]{"txt"})); 651 assertFalse(FilenameUtils.isExtension("file.txt", new String[]{"rtf"})); 652 assertTrue(FilenameUtils.isExtension("file", "rtf", "")); 653 assertTrue(FilenameUtils.isExtension("file.txt", "rtf", "txt")); 654 655 assertFalse(FilenameUtils.isExtension("a/b/file.txt", (String[]) null)); 656 assertFalse(FilenameUtils.isExtension("a/b/file.txt")); 657 assertTrue(FilenameUtils.isExtension("a/b/file.txt", new String[]{"txt"})); 658 assertFalse(FilenameUtils.isExtension("a/b/file.txt", new String[]{"rtf"})); 659 assertTrue(FilenameUtils.isExtension("a/b/file.txt", "rtf", "txt")); 660 661 assertFalse(FilenameUtils.isExtension("a.b/file.txt", (String[]) null)); 662 assertFalse(FilenameUtils.isExtension("a.b/file.txt")); 663 assertTrue(FilenameUtils.isExtension("a.b/file.txt", new String[]{"txt"})); 664 assertFalse(FilenameUtils.isExtension("a.b/file.txt", new String[]{"rtf"})); 665 assertTrue(FilenameUtils.isExtension("a.b/file.txt", "rtf", "txt")); 666 667 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", (String[]) null)); 668 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt")); 669 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", new String[]{"txt"})); 670 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", new String[]{"rtf"})); 671 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", "rtf", "txt")); 672 673 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", (String[]) null)); 674 assertFalse(FilenameUtils.isExtension("a.b\\file.txt")); 675 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", new String[]{"txt"})); 676 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new String[]{"rtf"})); 677 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", "rtf", "txt")); 678 679 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new String[]{"TXT"})); 680 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "TXT", "RTF")); 681 } 682 683 @Test testIsExtensionCollection()684 public void testIsExtensionCollection() { 685 assertFalse(FilenameUtils.isExtension(null, (Collection<String>) null)); 686 assertFalse(FilenameUtils.isExtension("file.txt", (Collection<String>) null)); 687 assertTrue(FilenameUtils.isExtension("file", (Collection<String>) null)); 688 assertFalse(FilenameUtils.isExtension("file.txt", new ArrayList<>())); 689 assertTrue(FilenameUtils.isExtension("file.txt", new ArrayList<>(Arrays.asList("txt")))); 690 assertFalse(FilenameUtils.isExtension("file.txt", new ArrayList<>(Arrays.asList("rtf")))); 691 assertTrue(FilenameUtils.isExtension("file", new ArrayList<>(Arrays.asList("rtf", "")))); 692 assertTrue(FilenameUtils.isExtension("file.txt", new ArrayList<>(Arrays.asList("rtf", "txt")))); 693 694 assertFalse(FilenameUtils.isExtension("a/b/file.txt", (Collection<String>) null)); 695 assertFalse(FilenameUtils.isExtension("a/b/file.txt", new ArrayList<>())); 696 assertTrue(FilenameUtils.isExtension("a/b/file.txt", new ArrayList<>(Arrays.asList("txt")))); 697 assertFalse(FilenameUtils.isExtension("a/b/file.txt", new ArrayList<>(Arrays.asList("rtf")))); 698 assertTrue(FilenameUtils.isExtension("a/b/file.txt", new ArrayList<>(Arrays.asList("rtf", "txt")))); 699 700 assertFalse(FilenameUtils.isExtension("a.b/file.txt", (Collection<String>) null)); 701 assertFalse(FilenameUtils.isExtension("a.b/file.txt", new ArrayList<>())); 702 assertTrue(FilenameUtils.isExtension("a.b/file.txt", new ArrayList<>(Arrays.asList("txt")))); 703 assertFalse(FilenameUtils.isExtension("a.b/file.txt", new ArrayList<>(Arrays.asList("rtf")))); 704 assertTrue(FilenameUtils.isExtension("a.b/file.txt", new ArrayList<>(Arrays.asList("rtf", "txt")))); 705 706 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", (Collection<String>) null)); 707 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList<>())); 708 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList<>(Arrays.asList("txt")))); 709 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList<>(Arrays.asList("rtf")))); 710 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList<>(Arrays.asList("rtf", "txt")))); 711 712 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", (Collection<String>) null)); 713 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>())); 714 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("txt")))); 715 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("rtf")))); 716 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("rtf", "txt")))); 717 718 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT")))); 719 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT", "RTF")))); 720 } 721 722 @Test testIsExtensionVarArgs()723 public void testIsExtensionVarArgs() { 724 assertTrue(FilenameUtils.isExtension("file.txt", "txt")); 725 assertFalse(FilenameUtils.isExtension("file.txt", "rtf")); 726 assertTrue(FilenameUtils.isExtension("file", "rtf", "")); 727 assertTrue(FilenameUtils.isExtension("file.txt", "rtf", "txt")); 728 729 assertTrue(FilenameUtils.isExtension("a/b/file.txt", "txt")); 730 assertFalse(FilenameUtils.isExtension("a/b/file.txt", "rtf")); 731 assertTrue(FilenameUtils.isExtension("a/b/file.txt", "rtf", "txt")); 732 733 assertTrue(FilenameUtils.isExtension("a.b/file.txt", "txt")); 734 assertFalse(FilenameUtils.isExtension("a.b/file.txt", "rtf")); 735 assertTrue(FilenameUtils.isExtension("a.b/file.txt", "rtf", "txt")); 736 737 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", "txt")); 738 assertFalse(FilenameUtils.isExtension("a\\b\\file.txt", "rtf")); 739 assertTrue(FilenameUtils.isExtension("a\\b\\file.txt", "rtf", "txt")); 740 741 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", "txt")); 742 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "rtf")); 743 assertTrue(FilenameUtils.isExtension("a.b\\file.txt", "rtf", "txt")); 744 745 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "TXT")); 746 assertFalse(FilenameUtils.isExtension("a.b\\file.txt", "TXT", "RTF")); 747 } 748 749 @Test testNormalize()750 public void testNormalize() { 751 assertNull(FilenameUtils.normalize(null)); 752 assertNull(FilenameUtils.normalize(":")); 753 assertNull(FilenameUtils.normalize("1:\\a\\b\\c.txt")); 754 assertNull(FilenameUtils.normalize("1:")); 755 assertNull(FilenameUtils.normalize("1:a")); 756 assertNull(FilenameUtils.normalize("\\\\\\a\\b\\c.txt")); 757 assertNull(FilenameUtils.normalize("\\\\a")); 758 759 assertEquals("a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("a\\b/c.txt")); 760 assertEquals("" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\a\\b/c.txt")); 761 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("C:\\a\\b/c.txt")); 762 assertEquals("" + SEP + "" + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server\\a\\b/c.txt")); 763 assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("~\\a\\b/c.txt")); 764 assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("~user\\a\\b/c.txt")); 765 766 assertEquals("a" + SEP + "c", FilenameUtils.normalize("a/b/../c")); 767 assertEquals("c", FilenameUtils.normalize("a/b/../../c")); 768 assertEquals("c" + SEP, FilenameUtils.normalize("a/b/../../c/")); 769 assertNull(FilenameUtils.normalize("a/b/../../../c")); 770 assertEquals("a" + SEP, FilenameUtils.normalize("a/b/..")); 771 assertEquals("a" + SEP, FilenameUtils.normalize("a/b/../")); 772 assertEquals("", FilenameUtils.normalize("a/b/../..")); 773 assertEquals("", FilenameUtils.normalize("a/b/../../")); 774 assertNull(FilenameUtils.normalize("a/b/../../..")); 775 assertEquals("a" + SEP + "d", FilenameUtils.normalize("a/b/../c/../d")); 776 assertEquals("a" + SEP + "d" + SEP, FilenameUtils.normalize("a/b/../c/../d/")); 777 assertEquals("a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("a/b//d")); 778 assertEquals("a" + SEP + "b" + SEP, FilenameUtils.normalize("a/b/././.")); 779 assertEquals("a" + SEP + "b" + SEP, FilenameUtils.normalize("a/b/./././")); 780 assertEquals("a" + SEP, FilenameUtils.normalize("./a/")); 781 assertEquals("a", FilenameUtils.normalize("./a")); 782 assertEquals("", FilenameUtils.normalize("./")); 783 assertEquals("", FilenameUtils.normalize(".")); 784 assertNull(FilenameUtils.normalize("../a")); 785 assertNull(FilenameUtils.normalize("..")); 786 assertEquals("", FilenameUtils.normalize("")); 787 788 assertEquals(SEP + "a", FilenameUtils.normalize("/a")); 789 assertEquals(SEP + "a" + SEP, FilenameUtils.normalize("/a/")); 790 assertEquals(SEP + "a" + SEP + "c", FilenameUtils.normalize("/a/b/../c")); 791 assertEquals(SEP + "c", FilenameUtils.normalize("/a/b/../../c")); 792 assertNull(FilenameUtils.normalize("/a/b/../../../c")); 793 assertEquals(SEP + "a" + SEP, FilenameUtils.normalize("/a/b/..")); 794 assertEquals(SEP + "", FilenameUtils.normalize("/a/b/../..")); 795 assertNull(FilenameUtils.normalize("/a/b/../../..")); 796 assertEquals(SEP + "a" + SEP + "d", FilenameUtils.normalize("/a/b/../c/../d")); 797 assertEquals(SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("/a/b//d")); 798 assertEquals(SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("/a/b/././.")); 799 assertEquals(SEP + "a", FilenameUtils.normalize("/./a")); 800 assertEquals(SEP + "", FilenameUtils.normalize("/./")); 801 assertEquals(SEP + "", FilenameUtils.normalize("/.")); 802 assertNull(FilenameUtils.normalize("/../a")); 803 assertNull(FilenameUtils.normalize("/..")); 804 assertEquals(SEP + "", FilenameUtils.normalize("/")); 805 806 assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/a")); 807 assertEquals("~" + SEP + "a" + SEP, FilenameUtils.normalize("~/a/")); 808 assertEquals("~" + SEP + "a" + SEP + "c", FilenameUtils.normalize("~/a/b/../c")); 809 assertEquals("~" + SEP + "c", FilenameUtils.normalize("~/a/b/../../c")); 810 assertNull(FilenameUtils.normalize("~/a/b/../../../c")); 811 assertEquals("~" + SEP + "a" + SEP, FilenameUtils.normalize("~/a/b/..")); 812 assertEquals("~" + SEP + "", FilenameUtils.normalize("~/a/b/../..")); 813 assertNull(FilenameUtils.normalize("~/a/b/../../..")); 814 assertEquals("~" + SEP + "a" + SEP + "d", FilenameUtils.normalize("~/a/b/../c/../d")); 815 assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("~/a/b//d")); 816 assertEquals("~" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("~/a/b/././.")); 817 assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/./a")); 818 assertEquals("~" + SEP, FilenameUtils.normalize("~/./")); 819 assertEquals("~" + SEP, FilenameUtils.normalize("~/.")); 820 assertNull(FilenameUtils.normalize("~/../a")); 821 assertNull(FilenameUtils.normalize("~/..")); 822 assertEquals("~" + SEP, FilenameUtils.normalize("~/")); 823 assertEquals("~" + SEP, FilenameUtils.normalize("~")); 824 825 assertEquals("~user" + SEP + "a", FilenameUtils.normalize("~user/a")); 826 assertEquals("~user" + SEP + "a" + SEP, FilenameUtils.normalize("~user/a/")); 827 assertEquals("~user" + SEP + "a" + SEP + "c", FilenameUtils.normalize("~user/a/b/../c")); 828 assertEquals("~user" + SEP + "c", FilenameUtils.normalize("~user/a/b/../../c")); 829 assertNull(FilenameUtils.normalize("~user/a/b/../../../c")); 830 assertEquals("~user" + SEP + "a" + SEP, FilenameUtils.normalize("~user/a/b/..")); 831 assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/a/b/../..")); 832 assertNull(FilenameUtils.normalize("~user/a/b/../../..")); 833 assertEquals("~user" + SEP + "a" + SEP + "d", FilenameUtils.normalize("~user/a/b/../c/../d")); 834 assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("~user/a/b//d")); 835 assertEquals("~user" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("~user/a/b/././.")); 836 assertEquals("~user" + SEP + "a", FilenameUtils.normalize("~user/./a")); 837 assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/./")); 838 assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/.")); 839 assertNull(FilenameUtils.normalize("~user/../a")); 840 assertNull(FilenameUtils.normalize("~user/..")); 841 assertEquals("~user" + SEP, FilenameUtils.normalize("~user/")); 842 assertEquals("~user" + SEP, FilenameUtils.normalize("~user")); 843 844 assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/a")); 845 assertEquals("C:" + SEP + "a" + SEP, FilenameUtils.normalize("C:/a/")); 846 assertEquals("C:" + SEP + "a" + SEP + "c", FilenameUtils.normalize("C:/a/b/../c")); 847 assertEquals("C:" + SEP + "c", FilenameUtils.normalize("C:/a/b/../../c")); 848 assertNull(FilenameUtils.normalize("C:/a/b/../../../c")); 849 assertEquals("C:" + SEP + "a" + SEP, FilenameUtils.normalize("C:/a/b/..")); 850 assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/a/b/../..")); 851 assertNull(FilenameUtils.normalize("C:/a/b/../../..")); 852 assertEquals("C:" + SEP + "a" + SEP + "d", FilenameUtils.normalize("C:/a/b/../c/../d")); 853 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("C:/a/b//d")); 854 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("C:/a/b/././.")); 855 assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/./a")); 856 assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/./")); 857 assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/.")); 858 assertNull(FilenameUtils.normalize("C:/../a")); 859 assertNull(FilenameUtils.normalize("C:/..")); 860 assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/")); 861 862 assertEquals("C:" + "a", FilenameUtils.normalize("C:a")); 863 assertEquals("C:" + "a" + SEP, FilenameUtils.normalize("C:a/")); 864 assertEquals("C:" + "a" + SEP + "c", FilenameUtils.normalize("C:a/b/../c")); 865 assertEquals("C:" + "c", FilenameUtils.normalize("C:a/b/../../c")); 866 assertNull(FilenameUtils.normalize("C:a/b/../../../c")); 867 assertEquals("C:" + "a" + SEP, FilenameUtils.normalize("C:a/b/..")); 868 assertEquals("C:" + "", FilenameUtils.normalize("C:a/b/../..")); 869 assertNull(FilenameUtils.normalize("C:a/b/../../..")); 870 assertEquals("C:" + "a" + SEP + "d", FilenameUtils.normalize("C:a/b/../c/../d")); 871 assertEquals("C:" + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("C:a/b//d")); 872 assertEquals("C:" + "a" + SEP + "b" + SEP, FilenameUtils.normalize("C:a/b/././.")); 873 assertEquals("C:" + "a", FilenameUtils.normalize("C:./a")); 874 assertEquals("C:" + "", FilenameUtils.normalize("C:./")); 875 assertEquals("C:" + "", FilenameUtils.normalize("C:.")); 876 assertNull(FilenameUtils.normalize("C:../a")); 877 assertNull(FilenameUtils.normalize("C:..")); 878 assertEquals("C:" + "", FilenameUtils.normalize("C:")); 879 880 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalize("//server/a")); 881 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP, FilenameUtils.normalize("//server/a/")); 882 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "c", FilenameUtils.normalize("//server/a/b/../c")); 883 assertEquals(SEP + SEP + "server" + SEP + "c", FilenameUtils.normalize("//server/a/b/../../c")); 884 assertNull(FilenameUtils.normalize("//server/a/b/../../../c")); 885 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP, FilenameUtils.normalize("//server/a/b/..")); 886 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/a/b/../..")); 887 assertNull(FilenameUtils.normalize("//server/a/b/../../..")); 888 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "d", FilenameUtils.normalize("//server/a/b/../c/../d")); 889 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("//server/a/b//d")); 890 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("//server/a/b/././.")); 891 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalize("//server/./a")); 892 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/./")); 893 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/.")); 894 assertNull(FilenameUtils.normalize("//server/../a")); 895 assertNull(FilenameUtils.normalize("//server/..")); 896 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/")); 897 898 assertEquals(SEP + SEP + "127.0.0.1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\127.0.0.1\\a\\b\\c.txt")); 899 assertEquals(SEP + SEP + "::1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\::1\\a\\b\\c.txt")); 900 assertEquals(SEP + SEP + "1::" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\1::\\a\\b\\c.txt")); 901 assertEquals(SEP + SEP + "server.example.org" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.example.org\\a\\b\\c.txt")); 902 assertEquals(SEP + SEP + "server.sub.example.org" + SEP + "a" + SEP + "b" + SEP + "c.txt", 903 FilenameUtils.normalize("\\\\server.sub.example.org\\a\\b\\c.txt")); 904 assertEquals(SEP + SEP + "server." + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.\\a\\b\\c.txt")); 905 assertEquals(SEP + SEP + "1::127.0.0.1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\1::127.0.0.1\\a\\b\\c.txt")); 906 907 // not valid IPv4 addresses but technically a valid "reg-name"s according to RFC1034 908 assertEquals(SEP + SEP + "127.0.0.256" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\127.0.0.256\\a\\b\\c.txt")); 909 assertEquals(SEP + SEP + "127.0.0.01" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\127.0.0.01\\a\\b\\c.txt")); 910 911 assertNull(FilenameUtils.normalize("\\\\-server\\a\\b\\c.txt")); 912 assertNull(FilenameUtils.normalize("\\\\.\\a\\b\\c.txt")); 913 assertNull(FilenameUtils.normalize("\\\\..\\a\\b\\c.txt")); 914 assertNull(FilenameUtils.normalize("\\\\127.0..1\\a\\b\\c.txt")); 915 assertNull(FilenameUtils.normalize("\\\\::1::2\\a\\b\\c.txt")); 916 assertNull(FilenameUtils.normalize("\\\\:1\\a\\b\\c.txt")); 917 assertNull(FilenameUtils.normalize("\\\\1:\\a\\b\\c.txt")); 918 assertNull(FilenameUtils.normalize("\\\\1:2:3:4:5:6:7:8:9\\a\\b\\c.txt")); 919 assertNull(FilenameUtils.normalize("\\\\g:2:3:4:5:6:7:8\\a\\b\\c.txt")); 920 assertNull(FilenameUtils.normalize("\\\\1ffff:2:3:4:5:6:7:8\\a\\b\\c.txt")); 921 assertNull(FilenameUtils.normalize("\\\\1:2\\a\\b\\c.txt")); 922 // IO-556 923 assertNull(FilenameUtils.normalize("//../foo")); 924 assertNull(FilenameUtils.normalize("\\\\..\\foo")); 925 } 926 927 /** 928 */ 929 @Test testNormalize_with_null_character()930 public void testNormalize_with_null_character() { 931 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.normalize("a\\b/c\u0000.txt")); 932 assertThrows(IllegalArgumentException.class, () -> FilenameUtils.normalize("\u0000a\\b/c.txt")); 933 } 934 935 @Test testNormalizeFromJavaDoc()936 public void testNormalizeFromJavaDoc() { 937 // Examples from javadoc 938 assertEquals(SEP + "foo" + SEP, FilenameUtils.normalize("/foo//")); 939 assertEquals(SEP + "foo" + SEP, FilenameUtils.normalize(SEP + "foo" + SEP + "." + SEP)); 940 assertEquals(SEP + "bar", FilenameUtils.normalize(SEP + "foo" + SEP + ".." + SEP + "bar")); 941 assertEquals(SEP + "bar" + SEP, FilenameUtils.normalize(SEP + "foo" + SEP + ".." + SEP + "bar" + SEP)); 942 assertEquals(SEP + "baz", FilenameUtils.normalize(SEP + "foo" + SEP + ".." + SEP + "bar" + SEP + ".." + SEP + "baz")); 943 assertEquals(SEP + SEP + "foo" + SEP + "bar", FilenameUtils.normalize("//foo//./bar")); 944 assertNull(FilenameUtils.normalize(SEP + ".." + SEP)); 945 assertNull(FilenameUtils.normalize(".." + SEP + "foo")); 946 assertEquals("foo" + SEP, FilenameUtils.normalize("foo" + SEP + "bar" + SEP + "..")); 947 assertNull(FilenameUtils.normalize("foo" + SEP + ".." + SEP + ".." + SEP + "bar")); 948 assertEquals("bar", FilenameUtils.normalize("foo" + SEP + ".." + SEP + "bar")); 949 assertEquals(SEP + SEP + "server" + SEP + "bar", FilenameUtils.normalize(SEP + SEP + "server" + SEP + "foo" + SEP + ".." + SEP + "bar")); 950 assertNull(FilenameUtils.normalize(SEP + SEP + "server" + SEP + ".." + SEP + "bar")); 951 assertEquals("C:" + SEP + "bar", FilenameUtils.normalize("C:" + SEP + "foo" + SEP + ".." + SEP + "bar")); 952 assertNull(FilenameUtils.normalize("C:" + SEP + ".." + SEP + "bar")); 953 assertEquals("~" + SEP + "bar" + SEP, FilenameUtils.normalize("~" + SEP + "foo" + SEP + ".." + SEP + "bar" + SEP)); 954 assertNull(FilenameUtils.normalize("~" + SEP + ".." + SEP + "bar")); 955 956 assertEquals(SEP + SEP + "foo" + SEP + "bar", FilenameUtils.normalize("//foo//./bar")); 957 assertEquals(SEP + SEP + "foo" + SEP + "bar", FilenameUtils.normalize("\\\\foo\\\\.\\bar")); 958 } 959 960 @Test testNormalizeNoEndSeparator()961 public void testNormalizeNoEndSeparator() { 962 assertNull(FilenameUtils.normalizeNoEndSeparator(null)); 963 assertNull(FilenameUtils.normalizeNoEndSeparator(":")); 964 assertNull(FilenameUtils.normalizeNoEndSeparator("1:\\a\\b\\c.txt")); 965 assertNull(FilenameUtils.normalizeNoEndSeparator("1:")); 966 assertNull(FilenameUtils.normalizeNoEndSeparator("1:a")); 967 assertNull(FilenameUtils.normalizeNoEndSeparator("\\\\\\a\\b\\c.txt")); 968 assertNull(FilenameUtils.normalizeNoEndSeparator("\\\\a")); 969 970 assertEquals("a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("a\\b/c.txt")); 971 assertEquals("" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("\\a\\b/c.txt")); 972 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("C:\\a\\b/c.txt")); 973 assertEquals("" + SEP + "" + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("\\\\server\\a\\b/c.txt")); 974 assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("~\\a\\b/c.txt")); 975 assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("~user\\a\\b/c.txt")); 976 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("C:\\\\a\\\\b\\\\c.txt")); 977 978 assertEquals("a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("a/b/../c")); 979 assertEquals("c", FilenameUtils.normalizeNoEndSeparator("a/b/../../c")); 980 assertEquals("c", FilenameUtils.normalizeNoEndSeparator("a/b/../../c/")); 981 assertNull(FilenameUtils.normalizeNoEndSeparator("a/b/../../../c")); 982 assertEquals("a", FilenameUtils.normalizeNoEndSeparator("a/b/..")); 983 assertEquals("a", FilenameUtils.normalizeNoEndSeparator("a/b/../")); 984 assertEquals("", FilenameUtils.normalizeNoEndSeparator("a/b/../..")); 985 assertEquals("", FilenameUtils.normalizeNoEndSeparator("a/b/../../")); 986 assertNull(FilenameUtils.normalizeNoEndSeparator("a/b/../../..")); 987 assertEquals("a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b/../c/../d")); 988 assertEquals("a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b/../c/../d/")); 989 assertEquals("a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b//d")); 990 assertEquals("a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("a/b/././.")); 991 assertEquals("a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("a/b/./././")); 992 assertEquals("a", FilenameUtils.normalizeNoEndSeparator("./a/")); 993 assertEquals("a", FilenameUtils.normalizeNoEndSeparator("./a")); 994 assertEquals("", FilenameUtils.normalizeNoEndSeparator("./")); 995 assertEquals("", FilenameUtils.normalizeNoEndSeparator(".")); 996 assertNull(FilenameUtils.normalizeNoEndSeparator("../a")); 997 assertNull(FilenameUtils.normalizeNoEndSeparator("..")); 998 assertEquals("", FilenameUtils.normalizeNoEndSeparator("")); 999 1000 assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a")); 1001 assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a/")); 1002 assertEquals(SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("/a/b/../c")); 1003 assertEquals(SEP + "c", FilenameUtils.normalizeNoEndSeparator("/a/b/../../c")); 1004 assertNull(FilenameUtils.normalizeNoEndSeparator("/a/b/../../../c")); 1005 assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a/b/..")); 1006 assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/a/b/../..")); 1007 assertNull(FilenameUtils.normalizeNoEndSeparator("/a/b/../../..")); 1008 assertEquals(SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("/a/b/../c/../d")); 1009 assertEquals(SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("/a/b//d")); 1010 assertEquals(SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("/a/b/././.")); 1011 assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/./a")); 1012 assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/./")); 1013 assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/.")); 1014 assertNull(FilenameUtils.normalizeNoEndSeparator("/../a")); 1015 assertNull(FilenameUtils.normalizeNoEndSeparator("/..")); 1016 assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/")); 1017 1018 assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a")); 1019 assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a/")); 1020 assertEquals("~" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~/a/b/../c")); 1021 assertEquals("~" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~/a/b/../../c")); 1022 assertNull(FilenameUtils.normalizeNoEndSeparator("~/a/b/../../../c")); 1023 assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a/b/..")); 1024 assertEquals("~" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~/a/b/../..")); 1025 assertNull(FilenameUtils.normalizeNoEndSeparator("~/a/b/../../..")); 1026 assertEquals("~" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~/a/b/../c/../d")); 1027 assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~/a/b//d")); 1028 assertEquals("~" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("~/a/b/././.")); 1029 assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/./a")); 1030 assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/./")); 1031 assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/.")); 1032 assertNull(FilenameUtils.normalizeNoEndSeparator("~/../a")); 1033 assertNull(FilenameUtils.normalizeNoEndSeparator("~/..")); 1034 assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/")); 1035 assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~")); 1036 1037 assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a")); 1038 assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a/")); 1039 assertEquals("~user" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../c")); 1040 assertEquals("~user" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../c")); 1041 assertNull(FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../../c")); 1042 assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a/b/..")); 1043 assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../..")); 1044 assertNull(FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../..")); 1045 assertEquals("~user" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../c/../d")); 1046 assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~user/a/b//d")); 1047 assertEquals("~user" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("~user/a/b/././.")); 1048 assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/./a")); 1049 assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/./")); 1050 assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/.")); 1051 assertNull(FilenameUtils.normalizeNoEndSeparator("~user/../a")); 1052 assertNull(FilenameUtils.normalizeNoEndSeparator("~user/..")); 1053 assertEquals("~user" + SEP, FilenameUtils.normalizeNoEndSeparator("~user/")); 1054 assertEquals("~user" + SEP, FilenameUtils.normalizeNoEndSeparator("~user")); 1055 1056 assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a")); 1057 assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a/")); 1058 assertEquals("C:" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../c")); 1059 assertEquals("C:" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../c")); 1060 assertNull(FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../../c")); 1061 assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a/b/..")); 1062 assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../..")); 1063 assertNull(FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../..")); 1064 assertEquals("C:" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../c/../d")); 1065 assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:/a/b//d")); 1066 assertEquals("C:" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("C:/a/b/././.")); 1067 assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/./a")); 1068 assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/./")); 1069 assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/.")); 1070 assertNull(FilenameUtils.normalizeNoEndSeparator("C:/../a")); 1071 assertNull(FilenameUtils.normalizeNoEndSeparator("C:/..")); 1072 assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/")); 1073 1074 assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a")); 1075 assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a/")); 1076 assertEquals("C:" + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:a/b/../c")); 1077 assertEquals("C:" + "c", FilenameUtils.normalizeNoEndSeparator("C:a/b/../../c")); 1078 assertNull(FilenameUtils.normalizeNoEndSeparator("C:a/b/../../../c")); 1079 assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a/b/..")); 1080 assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:a/b/../..")); 1081 assertNull(FilenameUtils.normalizeNoEndSeparator("C:a/b/../../..")); 1082 assertEquals("C:" + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:a/b/../c/../d")); 1083 assertEquals("C:" + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:a/b//d")); 1084 assertEquals("C:" + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("C:a/b/././.")); 1085 assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:./a")); 1086 assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:./")); 1087 assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:.")); 1088 assertNull(FilenameUtils.normalizeNoEndSeparator("C:../a")); 1089 assertNull(FilenameUtils.normalizeNoEndSeparator("C:..")); 1090 assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:")); 1091 1092 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a")); 1093 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a/")); 1094 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../c")); 1095 assertEquals(SEP + SEP + "server" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../c")); 1096 assertNull(FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../../c")); 1097 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a/b/..")); 1098 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../..")); 1099 assertNull(FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../..")); 1100 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../c/../d")); 1101 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("//server/a/b//d")); 1102 assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("//server/a/b/././.")); 1103 assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/./a")); 1104 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/./")); 1105 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/.")); 1106 assertNull(FilenameUtils.normalizeNoEndSeparator("//server/../a")); 1107 assertNull(FilenameUtils.normalizeNoEndSeparator("//server/..")); 1108 assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/")); 1109 } 1110 1111 @Test testNormalizeNoEndSeparatorUnixWin()1112 public void testNormalizeNoEndSeparatorUnixWin() { 1113 1114 // Normalize (Unix Separator) 1115 assertEquals("/a/c", FilenameUtils.normalizeNoEndSeparator("/a/b/../c/", true)); 1116 assertEquals("/a/c", FilenameUtils.normalizeNoEndSeparator("\\a\\b\\..\\c\\", true)); 1117 1118 // Normalize (Windows Separator) 1119 assertEquals("\\a\\c", FilenameUtils.normalizeNoEndSeparator("/a/b/../c/", false)); 1120 assertEquals("\\a\\c", FilenameUtils.normalizeNoEndSeparator("\\a\\b\\..\\c\\", false)); 1121 } 1122 1123 @Test testNormalizeUnixWin()1124 public void testNormalizeUnixWin() { 1125 1126 // Normalize (Unix Separator) 1127 assertEquals("/a/c/", FilenameUtils.normalize("/a/b/../c/", true)); 1128 assertEquals("/a/c/", FilenameUtils.normalize("\\a\\b\\..\\c\\", true)); 1129 1130 // Normalize (Windows Separator) 1131 assertEquals("\\a\\c\\", FilenameUtils.normalize("/a/b/../c/", false)); 1132 assertEquals("\\a\\c\\", FilenameUtils.normalize("\\a\\b\\..\\c\\", false)); 1133 } 1134 1135 @Test testRemoveExtension()1136 public void testRemoveExtension() { 1137 assertNull(FilenameUtils.removeExtension(null)); 1138 assertEquals("file", FilenameUtils.removeExtension("file.ext")); 1139 assertEquals("README", FilenameUtils.removeExtension("README")); 1140 assertEquals("domain.dot", FilenameUtils.removeExtension("domain.dot.com")); 1141 assertEquals("image", FilenameUtils.removeExtension("image.jpeg")); 1142 assertEquals("a.b/c", FilenameUtils.removeExtension("a.b/c")); 1143 assertEquals("a.b/c", FilenameUtils.removeExtension("a.b/c.txt")); 1144 assertEquals("a/b/c", FilenameUtils.removeExtension("a/b/c")); 1145 assertEquals("a.b\\c", FilenameUtils.removeExtension("a.b\\c")); 1146 assertEquals("a.b\\c", FilenameUtils.removeExtension("a.b\\c.txt")); 1147 assertEquals("a\\b\\c", FilenameUtils.removeExtension("a\\b\\c")); 1148 assertEquals("C:\\temp\\foo.bar\\README", FilenameUtils.removeExtension("C:\\temp\\foo.bar\\README")); 1149 assertEquals("../filename", FilenameUtils.removeExtension("../filename.ext")); 1150 } 1151 1152 @Test testSeparatorsToSystem()1153 public void testSeparatorsToSystem() { 1154 if (WINDOWS) { 1155 assertNull(FilenameUtils.separatorsToSystem(null)); 1156 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("\\a\\b\\c")); 1157 assertEquals("\\a\\b\\c.txt", FilenameUtils.separatorsToSystem("\\a\\b\\c.txt")); 1158 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("\\a\\b/c")); 1159 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("/a/b/c")); 1160 assertEquals("D:\\a\\b\\c", FilenameUtils.separatorsToSystem("D:/a/b/c")); 1161 } else { 1162 assertNull(FilenameUtils.separatorsToSystem(null)); 1163 assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("/a/b/c")); 1164 assertEquals("/a/b/c.txt", FilenameUtils.separatorsToSystem("/a/b/c.txt")); 1165 assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("/a/b\\c")); 1166 assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("\\a\\b\\c")); 1167 assertEquals("D:/a/b/c", FilenameUtils.separatorsToSystem("D:\\a\\b\\c")); 1168 } 1169 } 1170 1171 @Test testSeparatorsToUnix()1172 public void testSeparatorsToUnix() { 1173 assertNull(FilenameUtils.separatorsToUnix(null)); 1174 assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("/a/b/c")); 1175 assertEquals("/a/b/c.txt", FilenameUtils.separatorsToUnix("/a/b/c.txt")); 1176 assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("/a/b\\c")); 1177 assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("\\a\\b\\c")); 1178 assertEquals("D:/a/b/c", FilenameUtils.separatorsToUnix("D:\\a\\b\\c")); 1179 } 1180 1181 @Test testSeparatorsToWindows()1182 public void testSeparatorsToWindows() { 1183 assertNull(FilenameUtils.separatorsToWindows(null)); 1184 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("\\a\\b\\c")); 1185 assertEquals("\\a\\b\\c.txt", FilenameUtils.separatorsToWindows("\\a\\b\\c.txt")); 1186 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("\\a\\b/c")); 1187 assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("/a/b/c")); 1188 assertEquals("D:\\a\\b\\c", FilenameUtils.separatorsToWindows("D:/a/b/c")); 1189 } 1190 } 1191