// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.io; import jodd.util.StringUtil; import jodd.util.SystemUtil; import org.junit.Test; import java.io.File; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @SuppressWarnings({"SimplifiableJUnitAssertion"}) public class FileNameUtilTest { @Test public void testPrefixLength() { assertEquals(0, FileNameUtil.getPrefixLength("a\\b\\c.txt")); assertEquals(1, FileNameUtil.getPrefixLength("\\a\\b\\c.txt")); assertEquals(2, FileNameUtil.getPrefixLength("C:a\\b\\c.txt")); assertEquals(3, FileNameUtil.getPrefixLength("C:\\a\\b\\c.txt")); assertEquals(9, FileNameUtil.getPrefixLength("\\\\server\\a\\b\\c.txt")); assertEquals(0, FileNameUtil.getPrefixLength("a/b/c.txt")); assertEquals(1, FileNameUtil.getPrefixLength("/a/b/c.txt")); assertEquals(2, FileNameUtil.getPrefixLength("~/a/b/c.txt")); assertEquals(2, FileNameUtil.getPrefixLength("~")); assertEquals(6, FileNameUtil.getPrefixLength("~user/a/b/c.txt")); assertEquals(6, FileNameUtil.getPrefixLength("~user")); assertEquals(9, FileNameUtil.getPrefixLength("//server/a/b/c.txt")); assertEquals(9, FileNameUtil.getPrefixLength("//server//a/b/c.txt")); assertEquals(9, FileNameUtil.getPrefixLength("//server//./bar")); } @Test public void testNormalizeProblem() { assertEquals("//foo/bar", FileNameUtil.normalize("//foo/.///bar", true)); assertEquals("/bar", FileNameUtil.normalize("/./bar", true)); assertEquals("//foo//", FileNameUtil.normalize("//foo//", true)); assertEquals("//foo//bar", FileNameUtil.normalize("//foo//./bar", true)); assertEquals("/foo/bar", FileNameUtil.normalize("/foo//./bar", true)); } @Test public void testNormalize() { assertEquals("/foo/", FileNameUtil.normalize("/foo//", true)); assertEquals("/foo/", FileNameUtil.normalize("/foo/./", true)); assertEquals("/bar", FileNameUtil.normalize("/foo/../bar", true)); assertEquals("/bar/", FileNameUtil.normalize("/foo/../bar/", true)); assertEquals("/baz", FileNameUtil.normalize("/foo/../bar/../baz", true)); // assertEquals("/foo/bar", FileNameUtil.normalize("//foo//./bar", true)); assertEquals("/foo/bar", FileNameUtil.normalize("/foo//./bar", true)); assertEquals(null, FileNameUtil.normalize("/../", true)); assertEquals(null, FileNameUtil.normalize("../foo", true)); assertEquals("foo/", FileNameUtil.normalize("foo/bar/..", true)); assertEquals(null, FileNameUtil.normalize("foo/../../bar", true)); assertEquals("bar", FileNameUtil.normalize("foo/../bar", true)); assertEquals("//server/bar", FileNameUtil.normalize("//server/foo/../bar", true)); assertEquals(null, FileNameUtil.normalize("//server/../bar", true)); assertEquals("C:\\bar", FileNameUtil.normalize("C:\\foo\\..\\bar", false)); assertEquals(null, FileNameUtil.normalize("C:\\..\\bar", false)); assertEquals("~/bar/", FileNameUtil.normalize("~/foo/../bar/", true)); assertEquals(null, FileNameUtil.normalize("~/../bar", true)); } @Test public void testNormalizeNoEndSeparator() { assertEquals("/foo", FileNameUtil.normalizeNoEndSeparator("/foo//", true)); assertEquals("/foo", FileNameUtil.normalizeNoEndSeparator("/foo/./", true)); assertEquals("/bar", FileNameUtil.normalizeNoEndSeparator("/foo/../bar", true)); assertEquals("/bar", FileNameUtil.normalizeNoEndSeparator("/foo/../bar/", true)); assertEquals("/baz", FileNameUtil.normalizeNoEndSeparator("/foo/../bar/../baz", true)); // assertEquals("/foo/bar", FileNameUtil.normalizeNoEndSeparator("//foo//./bar", true)); assertEquals("/foo/bar", FileNameUtil.normalizeNoEndSeparator("/foo//./bar", true)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("/../", true)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("../foo", true)); assertEquals("foo", FileNameUtil.normalizeNoEndSeparator("foo/bar/..", true)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("foo/../../bar", true)); assertEquals("bar", FileNameUtil.normalizeNoEndSeparator("foo/../bar", true)); assertEquals("//server/bar", FileNameUtil.normalizeNoEndSeparator("//server/foo/../bar", true)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("//server/../bar", true)); assertEquals("C:\\bar", FileNameUtil.normalizeNoEndSeparator("C:\\foo\\..\\bar", false)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("C:\\..\\bar", false)); assertEquals("~/bar", FileNameUtil.normalizeNoEndSeparator("~/foo/../bar/", true)); assertEquals(null, FileNameUtil.normalizeNoEndSeparator("~/../bar", true)); } @Test public void testConcat() { assertEquals("/foo/bar", FileNameUtil.concat("/foo/", "bar", true)); assertEquals("\\foo\\bar", FileNameUtil.concat("/foo/", "bar", false)); assertEquals("/foo/bar", FileNameUtil.concat("/foo", "bar", true)); assertEquals("/bar", FileNameUtil.concat("/foo", "/bar", true)); assertEquals("C:/bar", FileNameUtil.concat("/foo", "C:/bar", true)); assertEquals("C:bar", FileNameUtil.concat("/foo", "C:bar", true)); assertEquals("/foo/bar", FileNameUtil.concat("/foo/a", "../bar", true)); assertEquals(null, FileNameUtil.concat("/foo/", "../../bar", true)); assertEquals("/bar", FileNameUtil.concat("/foo/", "/bar", true)); assertEquals("/bar", FileNameUtil.concat("/foo/..", "/bar", true)); assertEquals("/foo/bar/c.txt", FileNameUtil.concat("/foo", "bar/c.txt", true)); assertEquals("/foo/c.txt/bar", FileNameUtil.concat("/foo/c.txt", "bar", true)); } @Test public void testGetPathNoEndSeparator() { assertEquals("", FileNameUtil.getPathNoEndSeparator("/hello.world.html")); assertEquals("foo", FileNameUtil.getPathNoEndSeparator("/foo/hello.world.html")); assertEquals("foo/bar", FileNameUtil.getPathNoEndSeparator("/foo/bar/hello.world.html")); } @Test public void testExtension() { assertEquals("foo", FileNameUtil.getExtension("/a/b/c.foo")); assertEquals("doo", FileNameUtil.getExtension("/a/b/c.foo.doo")); assertEquals("", FileNameUtil.getExtension("/a/b/c")); assertTrue(FileNameUtil.hasExtension("/a/b/c.foo")); assertTrue(FileNameUtil.hasExtension("/a/b/c.foo.doo")); assertFalse(FileNameUtil.hasExtension("/a/b/c")); } @Test public void testResolveHome() { assertEquals("qwe", FileNameUtil.resolveHome("qwe")); assertEquals("", FileNameUtil.resolveHome("")); assertEquals(SystemUtil.userHome(), FileNameUtil.resolveHome("~")); assertEquals(fixpath(SystemUtil.userHome() + "/"), FileNameUtil.resolveHome(fixpath("~/"))); assertEquals(fixpath(SystemUtil.userHome() + "/foo"), FileNameUtil.resolveHome(fixpath("~/foo"))); } @Test public void testGetRelativePaths() { assertEquals(fixpath("../../b/c"), FileNameUtil.relativePath("/a/b/c", "/a/x/y/")); assertEquals(fixpath("../../b/c"), FileNameUtil.relativePath("/m/n/o/a/b/c", "/m/n/o/a/x/y/")); assertEquals(fixpath("stuff/xyz.dat"), FileNameUtil.relativePath("/var/data/stuff/xyz.dat", "/var/data/")); assertEquals(fixpath("../../../a/b/c"), FileNameUtil.relativePath("/a/b/c", "/m/n/o")); } private static String fixpath(String path) { return StringUtil.replace(path, "/", File.separator); } }