/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.citrus.util;
import static com.alibaba.citrus.test.TestUtil.*;
import static org.junit.Assert.*;
import com.alibaba.citrus.util.FileUtil.FileNameAndExtension;
import org.junit.Test;
public class FileUtilTests {
@Test
public void normalizeAbsolutePath() {
// Illegal path
assertIllegalAbsolutePath("/..");
assertIllegalAbsolutePath("/../");
assertIllegalAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\..\\..");
assertIllegalAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..");
assertIllegalAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\..");
assertIllegalAbsolutePath("..");
assertIllegalAbsolutePath("../");
assertIllegalAbsolutePath("aaa\\bbb\\ccc\\..\\..\\..\\..");
assertIllegalAbsolutePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\..");
assertIllegalAbsolutePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\..");
// 空值
assertEquals("", FileUtil.normalizeAbsolutePath(null));
assertEquals("", FileUtil.normalizeAbsolutePath(""));
assertEquals("", FileUtil.normalizeAbsolutePath(" "));
// Absolute path
assertEquals("/", FileUtil.normalizeAbsolutePath("\\\\"));
assertEquals("", FileUtil.normalizeAbsolutePath("\\\\path\\subpath\\..\\.."));
assertEquals("/path", FileUtil.normalizeAbsolutePath("\\\\path\\subpath\\.\\.."));
assertEquals("/path", FileUtil.normalizeAbsolutePath("\\\\path"));
assertEquals("/path/subpath", FileUtil.normalizeAbsolutePath("\\\\path\\subpath\\."));
assertEquals("/path/subpath/", FileUtil.normalizeAbsolutePath("\\\\path\\subpath\\.\\"));
assertEquals("/", FileUtil.normalizeAbsolutePath("/"));
assertEquals("", FileUtil.normalizeAbsolutePath("/aaa/.."));
assertEquals("/aaa/bbb", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\.\\.."));
assertEquals("/aaa/bbb/", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("/aaa/", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("/aaa/ddd/", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\\\ddd//"));
assertEquals("/", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\..\\..\\..\\"));
// Relative path
assertEquals("/", FileUtil.normalizeAbsolutePath("aaa/../"));
assertEquals("/aaa/bbb", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\.\\.."));
assertEquals("/aaa/bbb/", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("/aaa/", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("/aaa", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\..\\.."));
assertEquals("/", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\..\\..\\..\\"));
// remove trailing slash
assertEquals("/aaa/bbb", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\.\\..", true));
assertEquals("/aaa/bbb", FileUtil.normalizeAbsolutePath("\\aaa\\bbb\\ccc\\.\\..\\", true));
assertEquals("/aaa", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\..\\..\\", true));
assertEquals("/aaa/ddd", FileUtil.normalizeAbsolutePath("aaa\\bbb\\ccc\\..\\..\\\\ddd//", true));
assertEquals("", FileUtil.normalizeAbsolutePath("\\", true));
assertEquals("", FileUtil.normalizeAbsolutePath("/a/../", true));
}
private void assertIllegalAbsolutePath(String path) {
try {
FileUtil.normalizeAbsolutePath(path);
} catch (IllegalPathException e) {
assertThat(e, exception(path));
}
}
@Test
public void normalizeRelativePath() {
// Illegal path
assertEquals("..", FileUtil.normalizeRelativePath("/.."));
assertEquals("../", FileUtil.normalizeRelativePath("/../"));
assertEquals("..", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\.."));
assertEquals("..", FileUtil.normalizeRelativePath(".."));
assertEquals("../", FileUtil.normalizeRelativePath("../"));
assertEquals("..", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\.."));
// 空值
assertEquals("", FileUtil.normalizeRelativePath(null));
assertEquals("", FileUtil.normalizeRelativePath(""));
assertEquals("", FileUtil.normalizeRelativePath(" "));
// Absolute path
assertEquals("", FileUtil.normalizeRelativePath("\\\\"));
assertEquals("", FileUtil.normalizeRelativePath("\\\\path\\subpath\\..\\.."));
assertEquals("path", FileUtil.normalizeRelativePath("\\\\path\\subpath\\.\\.."));
assertEquals("path", FileUtil.normalizeRelativePath("\\\\path"));
assertEquals("path/subpath", FileUtil.normalizeRelativePath("\\\\path\\subpath\\."));
assertEquals("path/subpath/", FileUtil.normalizeRelativePath("\\\\path\\subpath\\.\\"));
assertEquals("", FileUtil.normalizeRelativePath("/"));
assertEquals("", FileUtil.normalizeRelativePath("/aaa/.."));
assertEquals("aaa/bbb", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\.\\.."));
assertEquals("aaa/bbb/", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("aaa/", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("aaa/ddd/", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\\\ddd//"));
assertEquals("", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\..\\..\\..\\"));
// Relative path
assertEquals("", FileUtil.normalizeRelativePath("aaa/../"));
assertEquals("aaa/bbb", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\.\\.."));
assertEquals("aaa/bbb/", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("aaa/", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("aaa", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\.."));
assertEquals("", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\..\\"));
// remove trailing slash
assertEquals("aaa/bbb", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\.\\..", true));
assertEquals("aaa/bbb", FileUtil.normalizeRelativePath("\\aaa\\bbb\\ccc\\.\\..\\", true));
assertEquals("aaa", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\", true));
assertEquals("aaa/ddd", FileUtil.normalizeRelativePath("aaa\\bbb\\ccc\\..\\..\\\\ddd//", true));
assertEquals("", FileUtil.normalizeRelativePath("\\", true));
assertEquals("", FileUtil.normalizeRelativePath("/a/../", true));
}
@Test
public void normalizePath() {
// Illegal path
assertIllegalPath("/..");
assertIllegalPath("/../");
assertIllegalPath("\\aaa\\bbb\\ccc\\..\\..\\..\\..");
assertIllegalPath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..");
assertIllegalPath("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\..");
// 空值
assertEquals("", FileUtil.normalizePath(null));
assertEquals("", FileUtil.normalizePath(""));
assertEquals("", FileUtil.normalizePath(" "));
// Absolute path
assertEquals("/", FileUtil.normalizePath("\\\\"));
assertEquals("", FileUtil.normalizePath("\\\\path\\subpath\\..\\.."));
assertEquals("/path", FileUtil.normalizePath("\\\\path\\subpath\\.\\.."));
assertEquals("/path/", FileUtil.normalizePath("\\\\path/"));
assertEquals("/path/subpath", FileUtil.normalizePath("\\\\path\\subpath\\."));
assertEquals("/path/subpath/", FileUtil.normalizePath("\\\\path\\subpath\\.\\"));
assertEquals("/", FileUtil.normalizePath("/"));
assertEquals("", FileUtil.normalizePath("/aaa/.."));
assertEquals("/aaa/bbb", FileUtil.normalizePath("\\aaa\\bbb\\ccc\\.\\.."));
assertEquals("/aaa/bbb/", FileUtil.normalizePath("\\aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("/aaa/", FileUtil.normalizePath("\\aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("/aaa/ddd/", FileUtil.normalizePath("\\aaa\\bbb\\ccc\\..\\..\\\\ddd//"));
assertEquals("/", FileUtil.normalizePath("\\aaa\\bbb\\ccc\\..\\..\\..\\"));
// Relative path
assertEquals("", FileUtil.normalizePath("aaa/../"));
assertEquals("..", FileUtil.normalizePath(".."));
assertEquals("../", FileUtil.normalizePath("../"));
assertEquals("aaa/bbb", FileUtil.normalizePath("aaa\\bbb\\ccc\\.\\.."));
assertEquals("aaa/bbb/", FileUtil.normalizePath("aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("aaa/", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("aaa", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\.."));
assertEquals("", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\..\\..\\"));
assertEquals("..", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\.."));
assertEquals("../..", FileUtil.normalizePath("aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\.."));
// Removing trailing slash
assertEquals("", FileUtil.normalizePath("aaa/../", true));
assertEquals("", FileUtil.normalizePath("", true));
assertEquals("", FileUtil.normalizePath("/aaa/../", true));
assertEquals("", FileUtil.normalizePath("/", true));
assertEquals("/path", FileUtil.normalizePath("\\\\path\\subpath\\.\\..", true));
assertEquals("path", FileUtil.normalizePath("path//", true));
assertEquals("/path/subpath", FileUtil.normalizePath("\\\\path\\subpath\\.", true));
assertEquals("/path/subpath", FileUtil.normalizePath("\\\\path\\subpath\\.\\", true));
assertEquals("path/subpath", FileUtil.normalizePath("path\\subpath\\.\\", true));
}
private void assertIllegalPath(String path) {
try {
FileUtil.normalizePath(path);
} catch (IllegalPathException e) {
assertThat(e, exception(path));
}
}
@Test
public void getAbsolutePathBasedOn() {
// Illegal path
assertIllegalPathBasedOn("/..", null);
assertIllegalPathBasedOn("/../", null);
assertIllegalPathBasedOn("\\aaa\\bbb\\ccc\\..\\..\\..\\..", null);
assertIllegalPathBasedOn("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..", null);
assertIllegalPathBasedOn("\\aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\..", null);
assertIllegalPathBasedOn("..", "/");
assertIllegalPathBasedOn("../", "/");
assertIllegalPathBasedOn("aaa\\bbb\\ccc\\..\\..\\..\\..", "/");
assertIllegalPathBasedOn("aaa\\bbb\\ccc\\..\\..\\..\\..\\..", "/");
assertIllegalPathBasedOn("aaa\\bbb\\ccc\\..\\..\\..\\..\\..\\ddd\\..", "/");
assertIllegalPathBasedOn("aaa\\../..\\..", "/bbb/");
assertIllegalPathBasedOn("aaa\\bbb\\ccc\\..\\..\\..\\..\\..", "/");
assertIllegalPathBasedOn("..\\..\\..\\..\\..\\ddd\\..", "/aaa\\bbb\\ccc");
// Empty path
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", null));
assertEquals("", FileUtil.getAbsolutePathBasedOn(null, null));
assertEquals("", FileUtil.getAbsolutePathBasedOn(null, "."));
assertEquals("/", FileUtil.getAbsolutePathBasedOn(null, "/"));
assertEquals("/", FileUtil.getAbsolutePathBasedOn(" / ", " "));
assertEquals("", FileUtil.getAbsolutePathBasedOn(" ", " "));
assertEquals("", FileUtil.getAbsolutePathBasedOn(" ", " . "));
assertEquals("/", FileUtil.getAbsolutePathBasedOn(" ", " / "));
// Absolute path
assertEquals("", FileUtil.getAbsolutePathBasedOn("/", "/."));
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", "\\\\"));
assertEquals("", FileUtil.getAbsolutePathBasedOn("/", "\\\\path\\subpath\\..\\.."));
assertEquals("/path", FileUtil.getAbsolutePathBasedOn(null, "\\\\path\\subpath\\.\\.."));
assertEquals("/path", FileUtil.getAbsolutePathBasedOn(null, "\\\\path"));
assertEquals("/path/subpath", FileUtil.getAbsolutePathBasedOn(null, "\\\\path\\subpath\\."));
assertEquals("/path/subpath/", FileUtil.getAbsolutePathBasedOn(null, "\\\\path\\subpath\\.\\"));
assertEquals("/", FileUtil.getAbsolutePathBasedOn(null, "/"));
assertEquals("", FileUtil.getAbsolutePathBasedOn(null, "/aaa/.."));
assertEquals("/aaa/bbb", FileUtil.getAbsolutePathBasedOn(null, "\\aaa\\bbb\\ccc\\.\\.."));
assertEquals("/aaa/bbb/", FileUtil.getAbsolutePathBasedOn(null, "\\aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("/aaa/", FileUtil.getAbsolutePathBasedOn(null, "\\aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("/", FileUtil.getAbsolutePathBasedOn(null, "\\aaa\\bbb\\ccc\\..\\..\\..\\"));
// Relative path
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", ""));
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", " "));
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", "aaa/../"));
assertEquals("/aaa/bbb", FileUtil.getAbsolutePathBasedOn("/", "aaa\\bbb\\ccc\\.\\.."));
assertEquals("/aaa/bbb/", FileUtil.getAbsolutePathBasedOn("/", "aaa\\bbb\\ccc\\.\\..\\"));
assertEquals("/aaa/", FileUtil.getAbsolutePathBasedOn("/", "aaa\\bbb\\ccc\\..\\..\\"));
assertEquals("/", FileUtil.getAbsolutePathBasedOn("/", "aaa\\bbb\\ccc\\..\\..\\..\\"));
assertEquals("/aaa/", FileUtil.getAbsolutePathBasedOn("/aaa/bbb/ccc", "..\\..\\"));
assertEquals("/aaa/bbb", FileUtil.getAbsolutePathBasedOn("/aaa/bbb", ""));
assertEquals("/aaa/bbb/", FileUtil.getAbsolutePathBasedOn("/aaa/bbb", "./"));
}
private void assertIllegalPathBasedOn(String path, String basedir) {
try {
FileUtil.getAbsolutePathBasedOn(basedir, path);
} catch (IllegalPathException e) {
assertThat(e, exception(path));
}
}
@Test
public void getSystemDependentAbsolutePathBasedOn() {
if (SystemUtil.getOsInfo().isWindows()) {
getWindowsAbsPathBasedOn();
} else {
getUnixAbsPathBasedOn();
}
try {
FileUtil.getSystemDependentAbsolutePathBasedOn(null, "test.txt");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("Basedir is not absolute path: "));
}
try {
FileUtil.getSystemDependentAbsolutePathBasedOn("aa/bb", "test.txt");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("Basedir is not absolute path: "));
}
}
private void getWindowsAbsPathBasedOn() {
// path is absolute
assertEquals("c:/aa/bb.txt", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "c:/aa/bb.txt"));
assertEquals("c:/aa/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "c:/aa/bb/"));
// path is relative
assertEquals("c:/base/aa/bb.txt", FileUtil.getSystemDependentAbsolutePathBasedOn("c:/base", "aa/bb.txt"));
assertEquals("c:/base/aa/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("c:/base", "aa/bb/"));
assertEquals("c:/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("c:/base", "../bb/"));
// path is empty
assertEquals("c:/base", FileUtil.getSystemDependentAbsolutePathBasedOn("c:/base", ""));
assertEquals("c:/base", FileUtil.getSystemDependentAbsolutePathBasedOn("c:/base/", null));
}
private void getUnixAbsPathBasedOn() {
// path is absolute
assertEquals("/aa/bb.txt", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "/aa/bb.txt"));
assertEquals("/aa/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "/aa/bb/"));
// path is relative
assertEquals("/base/aa/bb.txt", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "aa/bb.txt"));
assertEquals("/base/aa/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "aa/bb/"));
assertEquals("/bb/", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", "../bb/"));
// path is empty
assertEquals("/base", FileUtil.getSystemDependentAbsolutePathBasedOn("/base", ""));
assertEquals("/base", FileUtil.getSystemDependentAbsolutePathBasedOn("/base/", null));
}
@Test
public void getRelativePath() {
// Illegal path
assertIllegalRelativePath("..", "/");
assertIllegalRelativePath("/", "../");
// empty path
assertEquals("", FileUtil.getRelativePath("/", null));
assertEquals("", FileUtil.getRelativePath(null, null));
assertEquals("", FileUtil.getRelativePath(null, "."));
assertEquals("", FileUtil.getRelativePath(".", "."));
// 绝对路径
assertEquals("../../aaa/bbb", FileUtil.getRelativePath("/ddd/eee", "/aaa/bbb"));
assertEquals("../../aaa/bbb/", FileUtil.getRelativePath("/ddd/eee", "/aaa/bbb/"));
// 相对路径
assertEquals("aaa/bbb", FileUtil.getRelativePath("/ddd/eee", "aaa/bbb"));
assertEquals("aaa/bbb/", FileUtil.getRelativePath("/ddd/eee", "aaa/bbb/"));
assertEquals("", FileUtil.getRelativePath("/ddd/eee", ""));
assertEquals("", FileUtil.getRelativePath("/ddd/eee", "./"));
}
private void assertIllegalRelativePath(String path, String basedir) {
try {
FileUtil.getRelativePath(basedir, path);
} catch (IllegalPathException e) {
assertThat(e, exception(path));
}
}
@Test
public void getExtension() {
// null
assertEquals(null, FileUtil.getExtension(" "));
assertEquals(null, FileUtil.getExtension(null));
assertEquals(null, FileUtil.getExtension(" ", "null"));
assertEquals(null, FileUtil.getExtension(null, "null"));
// no extension
assertEquals(null, FileUtil.getExtension(" test. ", null));
assertEquals(null, FileUtil.getExtension(" test. "));
assertEquals("null", FileUtil.getExtension(" test. ", "null"));
// simple
assertEquals("htm", FileUtil.getExtension(" test.htm "));
assertEquals("HTM", FileUtil.getExtension(" test.HTM "));
// with path
assertEquals(null, FileUtil.getExtension("/a.b/test ", null));
assertEquals(null, FileUtil.getExtension("/a.b/test "));
assertEquals("jsp", FileUtil.getExtension("/a.b/test.jsp "));
assertEquals("Jsp", FileUtil.getExtension("/a.b/test.Jsp "));
assertEquals(null, FileUtil.getExtension("/a.b\\test ", null));
assertEquals(null, FileUtil.getExtension("/a.b\\test "));
assertEquals("jsp", FileUtil.getExtension("/a.b\\test.jsp "));
assertEquals("Jsp", FileUtil.getExtension("/a.b\\test.Jsp "));
}
@Test
public void getExtension_toLowerCase() {
// null
assertEquals(null, FileUtil.getExtension(" ", true));
assertEquals(null, FileUtil.getExtension(null, true));
assertEquals(null, FileUtil.getExtension(" ", "null", true));
assertEquals(null, FileUtil.getExtension(null, "null", true));
// no extension
assertEquals(null, FileUtil.getExtension(" test. ", null, true));
assertEquals(null, FileUtil.getExtension(" test. ", true));
assertEquals("null", FileUtil.getExtension(" test. ", "null", true));
// simple
assertEquals("htm", FileUtil.getExtension(" test.htm ", true));
assertEquals("htm", FileUtil.getExtension(" test.HTM ", true));
// with path
assertEquals(null, FileUtil.getExtension("/a.b/test ", null, true));
assertEquals(null, FileUtil.getExtension("/a.b/test ", true));
assertEquals("jsp", FileUtil.getExtension("/a.b/test.jsp ", true));
assertEquals("jsp", FileUtil.getExtension("/a.b/test.Jsp ", true));
assertEquals(null, FileUtil.getExtension("/a.b\\test ", null, true));
assertEquals(null, FileUtil.getExtension("/a.b\\test ", true));
assertEquals("jsp", FileUtil.getExtension("/a.b\\test.jsp ", true));
assertEquals("jsp", FileUtil.getExtension("/a.b\\test.Jsp ", true));
}
@Test
public void normalizeExtension() {
assertEquals(null, FileUtil.normalizeExtension(" "));
assertEquals(null, FileUtil.normalizeExtension(null));
assertEquals("exe", FileUtil.normalizeExtension(" .EXE "));
assertEquals("jpg", FileUtil.normalizeExtension(" jpg"));
}
@Test
public void getFileNameAndExtension() {
assertExts("", null, FileUtil.getFileNameAndExtension(null), "");
assertExts("", null, FileUtil.getFileNameAndExtension(""), "");
assertExts("", null, FileUtil.getFileNameAndExtension("."), "");
assertExts("aa", null, FileUtil.getFileNameAndExtension("aa."), "aa");
assertExts("", "bb", FileUtil.getFileNameAndExtension(".bb"), ".bb");
assertExts("aa/bb/", null, FileUtil.getFileNameAndExtension("aa/bb/"), "aa/bb/");
assertExts("/aaa/bbb/ccc", "jsp", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.jsp"), "/aaa/bbb/ccc.jsp");
assertExts("/aaa/bbb/ccc", "Jsp", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.Jsp"), "/aaa/bbb/ccc.Jsp");
assertExts("/aaa/bbb/ccc", "vm", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.vm"), "/aaa/bbb/ccc.vm");
assertExts("/aaa/bbb/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc."), "/aaa/bbb/ccc");
assertExts("/aaa/bbb/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc"), "/aaa/bbb/ccc");
assertExts("/aaa/bbb/ccc", "ABC", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.ABC"), "/aaa/bbb/ccc.ABC");
assertExts("/aaa/bbb.bak/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb.bak/ccc"), "/aaa/bbb.bak/ccc");
assertExts("/aaa/bbb/ccc/", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc/"), "/aaa/bbb/ccc/");
}
@Test
public void getFileNameAndExtension_toLowerCase() {
assertExts("", null, FileUtil.getFileNameAndExtension(null, true), "");
assertExts("", null, FileUtil.getFileNameAndExtension("", true), "");
assertExts("", null, FileUtil.getFileNameAndExtension(".", true), "");
assertExts("aa", null, FileUtil.getFileNameAndExtension("aa.", true), "aa");
assertExts("", "bb", FileUtil.getFileNameAndExtension(".bb", true), ".bb");
assertExts("aa/bb/", null, FileUtil.getFileNameAndExtension("aa/bb/", true), "aa/bb/");
assertExts("/aaa/bbb/ccc", "jsp", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.jsp", true),
"/aaa/bbb/ccc.jsp");
assertExts("/aaa/bbb/ccc", "jsp", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.Jsp", true),
"/aaa/bbb/ccc.jsp");
assertExts("/aaa/bbb/ccc", "vm", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.vm", true), "/aaa/bbb/ccc.vm");
assertExts("/aaa/bbb/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.", true), "/aaa/bbb/ccc");
assertExts("/aaa/bbb/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc", true), "/aaa/bbb/ccc");
assertExts("/aaa/bbb/ccc", "abc", FileUtil.getFileNameAndExtension("/aaa/bbb/ccc.ABC", true),
"/aaa/bbb/ccc.abc");
assertExts("/aaa/bbb.bak/ccc", null, FileUtil.getFileNameAndExtension("/aaa/bbb.bak/ccc", true),
"/aaa/bbb.bak/ccc");
assertExts("/aaa/bbb/ccc/", null, FileUtil.getFileNameAndExtension("/aaa/bbb/ccc/", true), "/aaa/bbb/ccc/");
}
private void assertExts(String path, String ext, FileNameAndExtension result, String toString) {
assertEquals(path, result.getFileName());
assertEquals(ext, result.getExtension());
assertEquals(toString, result.toString());
}
@Test
public void resolve() {
// form1: file:/c:...
assertEquals("file:c:/aa/bb/xx/yy", FileUtil.resolve("file:c:aa/bb/cc", "xx/yy"));
assertEquals("file:/z:/aa/xx/yy", FileUtil.resolve("file:/z:aa/bb/cc", "../xx/yy"));
assertEquals("file://z:/aa/xx/yy", FileUtil.resolve("file://z:aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("file:h:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("file:/z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("file://z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("file:///z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
// form2: http://server/...
assertEquals("http://www.taobao.com:8080/aa/bb/xx/yy",
FileUtil.resolve("http://www.taobao.com:8080/aa/bb/cc", "xx/yy"));
assertEquals("http://www.taobao.com:8080/aa/xx/yy",
FileUtil.resolve("http://www.taobao.com:8080/aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("http://www.taobao.com:8080/aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("/aa/bb/cc/../../../../xx/yy"));
}
// form3: jar:url!/...
assertEquals("jar:http://www.taobao.com:8080/my.jar!/aa/bb/xx/yy",
FileUtil.resolve("jar:http://www.taobao.com:8080/my.jar!/aa/bb/cc", "xx/yy"));
assertEquals("jar:http://www.taobao.com:8080/my.jar!/aa/xx/yy",
FileUtil.resolve("jar:http://www.taobao.com:8080/my.jar!/aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("zip:http://www.taobao.com:8080/my.jar!/aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("/aa/bb/cc/../../../../xx/yy"));
}
// form4: file:/...
assertEquals("file:/aa/bb/xx/yy", FileUtil.resolve("file:aa/bb/cc", "xx/yy"));
assertEquals("file:/aa/xx/yy", FileUtil.resolve("file:aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("file:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
}
@Test
public void resolve_uppercase() {
// form1: FILE:/C:...
assertEquals("FILE:C:/aa/bb/xx/yy", FileUtil.resolve("FILE:C:aa/bb/cc", "xx/yy"));
assertEquals("FILE:/Z:/aa/xx/yy", FileUtil.resolve("FILE:/Z:aa/bb/cc", "../xx/yy"));
assertEquals("FILE://Z:/aa/xx/yy", FileUtil.resolve("FILE://Z:aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("FILE:H:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("FILE:/Z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("FILE://Z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
try {
FileUtil.resolve("FILE:///Z:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
// form2: HTTP://server/...
assertEquals("HTTP://www.taobao.com:8080/aa/bb/xx/yy",
FileUtil.resolve("HTTP://www.taobao.com:8080/aa/bb/cc", "xx/yy"));
assertEquals("HTTP://www.taobao.com:8080/aa/xx/yy",
FileUtil.resolve("HTTP://www.taobao.com:8080/aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("HTTP://www.taobao.com:8080/aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("/aa/bb/cc/../../../../xx/yy"));
}
// form3: JAR:url!/...
assertEquals("JAR:HTTP://www.taobao.com:8080/my.jar!/aa/bb/xx/yy",
FileUtil.resolve("JAR:HTTP://www.taobao.com:8080/my.jar!/aa/bb/cc", "xx/yy"));
assertEquals("JAR:HTTP://www.taobao.com:8080/my.jar!/aa/xx/yy",
FileUtil.resolve("JAR:HTTP://www.taobao.com:8080/my.jar!/aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("zip:HTTP://www.taobao.com:8080/my.jar!/aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("/aa/bb/cc/../../../../xx/yy"));
}
// form4: FILE:/...
assertEquals("FILE:/aa/bb/xx/yy", FileUtil.resolve("FILE:aa/bb/cc", "xx/yy"));
assertEquals("FILE:/aa/xx/yy", FileUtil.resolve("FILE:aa/bb/cc", "../xx/yy"));
try {
FileUtil.resolve("FILE:aa/bb/cc", "../../../xx/yy");
fail();
} catch (IllegalPathException e) {
assertThat(e, exception("aa/bb/cc/../../../../xx/yy"));
}
}
}