/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.common;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import org.junit.Test;
/**
* Test cases for {@link CrossPlatformFilenameUtils}.
*
* @author Jan Flink
* @author Tobias Rodehutskors
*/
public class CrossPlatformFilenameUtilsTest {
private static final String PATH_PATTERN = "bla/blu%sb/bla%s1.txt";
private static final String FILENAME_PATTERN = "dum%smy.txt";
private static final int LAST_ASCII_CTRL_INDEX = 31;
private static final int FORBIDDEN_LENGTH = 260;
private static final char ESCAPED_BACKSLASH = '\\';
/** Test. */
@Test
public void testIsFilenameValid() {
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("."));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(".."));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("..."));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("...."));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("a.."));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("a."));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid("..a"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(".a"));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("b?lub.txt"));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid("b*lub.txt"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(" blub.txt"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(" blub.txt"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(" blu b.txt"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(" blu b.txt "));
for (char c : CrossPlatformFilenameUtils.FORBIDDEN_CHARACTERS) {
if (c != ESCAPED_BACKSLASH) {
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(StringUtils.format(FILENAME_PATTERN, String.valueOf(c))));
}
}
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(
StringUtils.format(FILENAME_PATTERN, new String(CrossPlatformFilenameUtils.FORBIDDEN_CHARACTERS))));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid("blub.txt"));
// there is a bunch of filenames which are forbidden, even though they are composed of valid characters...
for (String forbiddenFilename : CrossPlatformFilenameUtils.FORBIDDEN_WINDOWS_FILENAMES) {
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(forbiddenFilename));
}
// ...these names are also not allowed in combination with a file extension...
for (String forbiddenFilename : CrossPlatformFilenameUtils.FORBIDDEN_WINDOWS_FILENAMES) {
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(forbiddenFilename + ".txt"));
}
// ...but they can still be part of a filename
for (String forbiddenFilename : CrossPlatformFilenameUtils.FORBIDDEN_WINDOWS_FILENAMES) {
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(forbiddenFilename + "test"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid(forbiddenFilename + "test.txt"));
assertTrue(CrossPlatformFilenameUtils.isFilenameValid("test" + forbiddenFilename + ".txt"));
}
// there is also a length limitation for filenames on Windows
String longfilename = new String(new char[FORBIDDEN_LENGTH]).replace("\0", "a");
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(longfilename));
// the first characters of the ASCII table are control characters and not allowed either
for (int i = 0; i <= LAST_ASCII_CTRL_INDEX; i++) {
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(StringUtils.format(FILENAME_PATTERN, (char) i)));
}
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(StringUtils.format(FILENAME_PATTERN, "\b")));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(StringUtils.format(FILENAME_PATTERN, "\0")));
assertFalse(CrossPlatformFilenameUtils.isFilenameValid(StringUtils.format(FILENAME_PATTERN, "\t")));
}
/** Test. */
@Test
public void testIsPathValid() {
assertFalse(CrossPlatformFilenameUtils.isPathValid("b?l/ub.txt"));
assertFalse(CrossPlatformFilenameUtils.isPathValid("b*l\\ub.txt"));
assertFalse(CrossPlatformFilenameUtils.isPathValid("c:\\b*l\\ub.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid(" bal/blub.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid(" bla\\blub.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("b la\\blub.txt"));
for (char c : CrossPlatformFilenameUtils.FORBIDDEN_CHARACTERS) {
if (c != ESCAPED_BACKSLASH && c != '/') {
File x = new File(StringUtils.format(PATH_PATTERN, c, c));
assertFalse(CrossPlatformFilenameUtils.isPathValid(x.getAbsolutePath()));
}
}
assertFalse(CrossPlatformFilenameUtils.isPathValid("/i/am/CON/path.txt"));
assertFalse(CrossPlatformFilenameUtils.isPathValid(
StringUtils.format(PATH_PATTERN, org.apache.commons.lang3.StringUtils.join(CrossPlatformFilenameUtils.FORBIDDEN_CHARACTERS),
"*")));
assertTrue(CrossPlatformFilenameUtils.isPathValid("i\\am\\a\\path.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("/i/am/a/path.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("i/am/a/path.txt"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("/i/am/a/path"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("i/am/a/path/"));
assertTrue(CrossPlatformFilenameUtils.isPathValid("c:\\i\\am\\a\\path.txt"));
}
/** Test. */
@Test
public void testIsNFSFile() {
assertTrue(CrossPlatformFilenameUtils.isNFSFile(".nfs1234"));
assertTrue(CrossPlatformFilenameUtils.isNFSFile(".nfs000000000095a01200000e8"));
assertFalse(CrossPlatformFilenameUtils.isNFSFile("test.nfs1234"));
assertFalse(CrossPlatformFilenameUtils.isNFSFile("test.nfs000000000095a01200000e8"));
}
}