/*
* Syncany, www.syncany.org
* Copyright (C) 2011-2015 Philipp C. Heckel <philipp.heckel@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.syncany.tests.unit.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.syncany.util.EnvironmentUtil;
import org.syncany.util.EnvironmentUtil.OperatingSystem;
import org.syncany.util.FileUtil;
import org.syncany.util.NormalizedPath;
public class NormalizedPathTest {
private OperatingSystem originalOperatingSystem;
@Before
public void storeOperatingSystem() {
originalOperatingSystem = EnvironmentUtil.getOperatingSystem();
}
@After
public void resetOperatingSystem() {
// Important: Restore the actual operating systems,
// or other tests might fail.
EnvironmentUtil.setOperatingSystem(originalOperatingSystem);
}
@Test
public void testGetRelativeFilePath() {
String expectedResult = "somefile";
File[] rootFolders = new File[] {
new File("/home/user/Syncany"),
new File("/home/user/Syncany/"),
new File("/home/user/Syncany//"),
new File("/home/user//Syncany"),
new File("/home/user//Syncany/"),
new File("/home/user//Syncany//")
};
File[] files = new File[] {
new File("/home/user/Syncany/somefile"),
new File("/home/user/Syncany/somefile/"),
new File("/home/user/Syncany/somefile//"),
new File("/home/user/Syncany//somefile"),
new File("/home/user/Syncany//somefile/"),
new File("/home/user/Syncany//somefile//")
};
for (File rootFolder : rootFolders) {
for (File file : files) {
String actualResult = FileUtil.getRelativePath(rootFolder, file);
assertEquals("Expected '"+expectedResult+"' for root folder '"+rootFolder+"' and file '"+file+"'", expectedResult, actualResult);
}
}
}
@Test
public void testGetRelativeFilePathSpecialCases() {
assertEquals("", FileUtil.getRelativePath(new File("/home/user/"), new File("/home/user")));
assertEquals("", FileUtil.getRelativePath(new File("/home/user/"), new File("/home/user/")));
assertEquals("", FileUtil.getRelativePath(new File("/home/user/"), new File("/home/user//")));
}
@Test
public void testNameAndParentPathForNormalizedPathsOnWindows() {
testNameAndParentPathForNormalizedPaths(OperatingSystem.WINDOWS);
}
@Test
public void testNameAndParentPathForNormalizedPathsOnUnixLikeSystems() {
testNameAndParentPathForNormalizedPaths(OperatingSystem.UNIX_LIKE);
}
private void testNameAndParentPathForNormalizedPaths(OperatingSystem operatingSystem) {
EnvironmentUtil.setOperatingSystem(operatingSystem);
// Test 1: For a file called 'A black\white telephone ☎.jpg'
// Note: "A black" is NOT a directory, it's part of the filename (invalid on Windows!)
String alreadyNormalizedRelativePathFileStr = "Pictures/A black\\white telephone ☎.jpg";
NormalizedPath normalizedPathFile = new NormalizedPath(null, alreadyNormalizedRelativePathFileStr);
assertEquals("Pictures/A black\\white telephone ☎.jpg", normalizedPathFile.toString());
assertEquals("Pictures", normalizedPathFile.getParent().toString());
// Test 2: For directory called 'black\\white telephones ☎'
String alreadyNormalizedRelativePathDirStr = "Pictures/black\\white telephones ☎";
NormalizedPath normalizedPathDir = new NormalizedPath(null, alreadyNormalizedRelativePathDirStr);
assertEquals("Pictures/black\\white telephones ☎", normalizedPathDir.toString());
assertEquals("Pictures", normalizedPathDir.getParent().toString());
// Test 3: For directory called 'black\\white telephones ☎'
String alreadyNormalizedRelativePathFileWithBackslashesDirStr = "Pictures/Black\\White Pictures/Mostly\\Black Pictures/blacky.jpg";
NormalizedPath normalizedPathWithBackslashesDir = new NormalizedPath(null, alreadyNormalizedRelativePathFileWithBackslashesDirStr);
assertEquals("Pictures/Black\\White Pictures/Mostly\\Black Pictures/blacky.jpg", normalizedPathWithBackslashesDir.toString());
assertEquals("Pictures/Black\\White Pictures/Mostly\\Black Pictures", normalizedPathWithBackslashesDir.getParent().toString());
}
@Test
public void testNameAndParentPathForNormalizedPathsMoreTests() {
// Does not depend on OS
assertEquals("", new NormalizedPath(null, "Philipp").getParent().toString());
}
@Test
public void testNormalizationOnWindows() {
EnvironmentUtil.setOperatingSystem(OperatingSystem.WINDOWS);
assertEquals("C:/Philipp", NormalizedPath.get(null, "C:\\Philipp\\").toString());
assertEquals("C:/Philipp", NormalizedPath.get(null, "C:\\Philipp").toString());
assertEquals("C:/Philipp/image.jpg", NormalizedPath.get(null, "C:\\Philipp\\image.jpg").toString());
assertEquals("C:/Philipp/image", NormalizedPath.get(null, "C:\\Philipp\\image").toString());
assertEquals("C:/Philipp/file:with:colons.txt", NormalizedPath.get(null, "C:\\Philipp\\file:with:colons.txt").toString()); // Cannot happen on Windows
assertEquals("C:/Philipp/file/with/backslashes.txt", NormalizedPath.get(null, "C:\\Philipp\\file\\with\\backslashes.txt").toString());
assertEquals("C:/Philipp/folder/with/backslashes", NormalizedPath.get(null, "C:\\Philipp\\folder\\with\\backslashes\\").toString());
}
@Test
public void testCreatablizationOnWindows() throws Exception {
EnvironmentUtil.setOperatingSystem(OperatingSystem.WINDOWS);
File root = new File("C:\\Philipp");
assertEquals("Philipp", new NormalizedPath(root, "Philipp").toCreatable("filename conflict", true).toString());
assertEquals("Philipp", new NormalizedPath(root, "Philipp").toCreatable("filename conflict", true).toString());
assertEquals("Philipp/image.jpg", new NormalizedPath(root, "Philipp/image.jpg").toCreatable("filename conflict", true).toString());
assertEquals("Philipp/image", new NormalizedPath(root, "Philipp/image").toCreatable("filename conflict", true).toString());
assertEquals("Philipp/filewithcolons (filename conflict).txt", new NormalizedPath(root, "Philipp/file:with:colons.txt").toCreatable("filename conflict", true).toString()); // Cannot happen on Windows
assertEquals("Philipp/filewithbackslashes (filename conflict).txt", new NormalizedPath(root, "Philipp/file\\with\\backslashes.txt").toCreatable("filename conflict", true).toString());
assertEquals("Philipp/folderwithbackslashes (filename conflict)", new NormalizedPath(root, "Philipp/folder\\with\\backslashes").toCreatable("filename conflict", true).toString());
}
@Test
public void testNormalizationOnUnixLikeSystems() {
EnvironmentUtil.setOperatingSystem(OperatingSystem.UNIX_LIKE);
assertEquals("/home/philipp", NormalizedPath.get(null, "/home/philipp/").toString());
assertEquals("/home/philipp", NormalizedPath.get(null, "/home/philipp").toString());
assertEquals("/home/philipp/image.jpg", NormalizedPath.get(null, "/home/philipp/image.jpg").toString());
assertEquals("/home/philipp/image", NormalizedPath.get(null, "/home/philipp/image").toString());
assertEquals("/home/philipp/file:with:colons", NormalizedPath.get(null, "/home/philipp/file:with:colons").toString());
assertEquals("/home/philipp/file\\with\\backslashes.txt", NormalizedPath.get(null, "/home/philipp/file\\with\\backslashes.txt").toString());
assertEquals("/home/philipp/folder\\with\\backslashes", NormalizedPath.get(null, "/home/philipp/folder\\with\\backslashes/").toString());
}
@Test
public void testNormalizationHasIllegalChars() {
EnvironmentUtil.setOperatingSystem(OperatingSystem.UNIX_LIKE);
assertFalse(NormalizedPath.get(null, "/home/philipp/").hasIllegalChars());
assertFalse(NormalizedPath.get(null, "/home/black\\white telephones ☎.txt").hasIllegalChars());
assertTrue(NormalizedPath.get(null, "/home/philipp/\0.txt").hasIllegalChars());
EnvironmentUtil.setOperatingSystem(OperatingSystem.WINDOWS);
assertFalse(NormalizedPath.get(null, "C:\\home\\philipp\\").hasIllegalChars());
assertFalse(NormalizedPath.get(null, "C:\\home\\black-white telephones ☎.txt").hasIllegalChars());
assertTrue(NormalizedPath.get(null, "C:\\home\\\0.txt").hasIllegalChars());
}
}