/*
* Syncany, www.syncany.org
* Copyright (C) 2011-2016 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.*;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermissions;
import org.junit.Test;
import org.syncany.util.EnvironmentUtil;
import org.syncany.util.FileUtil;
import org.syncany.util.StringUtil;
public class FileUtilTest {
@Test
public void testGetRelativePath() {
if (EnvironmentUtil.isUnixLikeOperatingSystem()) {
assertEquals("some/path", FileUtil.getRelativePath(new File("/home"), new File("/home/some/path")));
assertEquals("some/path", FileUtil.getRelativePath(new File("/home/"), new File("/home/some/path")));
assertEquals("path", FileUtil.getRelativePath(new File("/home/some"), new File("/home/some/path")));
assertEquals("path", FileUtil.getRelativePath(new File("/home/some/"), new File("/home/some/path")));
}
else {
assertEquals("some\\path", FileUtil.getRelativePath(new File("C:\\home"), new File("C:\\home\\some\\path")));
assertEquals("some\\path", FileUtil.getRelativePath(new File("C:\\home"), new File("C:\\home\\some\\path")));
assertEquals("path", FileUtil.getRelativePath(new File("C:\\home\\some"), new File("C:\\home\\some\\path")));
assertEquals("path", FileUtil.getRelativePath(new File("C:\\homesome\\"), new File("C:\\home\\some\\path")));
}
}
@Test
public void testFileExistsNormal() throws Exception {
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
TestFileUtil.createRandomFile(new File(tempDir, "file1"), 1234);
assertTrue(FileUtil.exists(new File(tempDir, "file1")));
assertFalse(FileUtil.exists(new File(tempDir, "file2")));
TestFileUtil.deleteDirectory(tempDir);
}
@Test
public void testFileExistsSymlink() throws Exception {
if (!EnvironmentUtil.symlinksSupported()) {
return;
}
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
TestFileUtil.createRandomFile(new File(tempDir, "file1"), 1234);
Files.createSymbolicLink(new File(tempDir, "link-to-file1").toPath(), new File(tempDir, "file1").toPath());
Files.createSymbolicLink(new File(tempDir, "non-existing-target").toPath(), Paths.get("/does/not/exist"));
String linkTargetToFile1 = FileUtil.readSymlinkTarget(new File(tempDir, "link-to-file1"));
String nonExistingSymlinkTarget = FileUtil.readSymlinkTarget(new File(tempDir, "non-existing-target"));
assertEquals(new File(tempDir, "file1").getAbsolutePath(), linkTargetToFile1);
assertEquals("/does/not/exist", nonExistingSymlinkTarget);
assertTrue(FileUtil.exists(new File(tempDir, "link-to-file1")));
assertTrue(FileUtil.exists(new File(tempDir, "non-existing-target")));
assertFalse(FileUtil.exists(new File(tempDir, "actually-non-existing-file-or-link")));
TestFileUtil.deleteDirectory(tempDir);
}
@Test
public void testCreateSymlink() throws Exception {
if (!EnvironmentUtil.symlinksSupported()) {
return;
}
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
TestFileUtil.createRandomFile(new File(tempDir, "file1"), 1234);
FileUtil.createSymlink("/some/target", new File(tempDir, "link-to-non-existing-target"));
FileUtil.createSymlink(new File(tempDir, "file1").getAbsolutePath(), new File(tempDir, "link-to-file1"));;
String linkTargetToFile1 = FileUtil.readSymlinkTarget(new File(tempDir, "link-to-file1"));
String nonExistingSymlinkTarget = FileUtil.readSymlinkTarget(new File(tempDir, "link-to-non-existing-target"));
assertEquals(new File(tempDir, "file1").getAbsolutePath(), linkTargetToFile1);
assertEquals("/some/target", nonExistingSymlinkTarget);
TestFileUtil.deleteDirectory(tempDir);
}
@Test
public void testGetCanonicalFile() throws Exception {
if (EnvironmentUtil.isUnixLikeOperatingSystem()) {
assertEquals(new File("/a"), FileUtil.getCanonicalFile(new File("/tmp/../a")));
}
else {
assertEquals(new File("C:\\a"), FileUtil.getCanonicalFile(new File("C:\\Windows\\..\\a")));
}
}
@Test
public void testCreateChecksum() throws Exception {
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
TestFileUtil.createFileWithContent(new File(tempDir, "file"), "000");
byte[] sha1sum = FileUtil.createChecksum(new File(tempDir, "file"), "SHA1");
byte[] md5sum = FileUtil.createChecksum(new File(tempDir, "file"), "MD5");
assertNotNull(sha1sum);
assertNotNull(md5sum);
assertEquals("8aefb06c426e07a0a671a1e2488b4858d694a730", StringUtil.toHex(sha1sum));
assertEquals("c6f057b86584942e415435ffb1fa93d4", StringUtil.toHex(md5sum));
TestFileUtil.deleteDirectory(tempDir);
}
@Test
public void testIsDirectory() throws Exception {
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
new File(tempDir, "folder").mkdir();
new File(tempDir, "file").createNewFile();
assertTrue(FileUtil.isDirectory(new File(tempDir, "folder")));
assertFalse(FileUtil.isDirectory(new File(tempDir, "file")));
if (EnvironmentUtil.symlinksSupported()) {
FileUtil.createSymlink(new File(tempDir, "folder").getAbsolutePath(), new File(tempDir, "symlink-to-folder"));
assertFalse(FileUtil.isDirectory(new File(tempDir, "symlink-to-folder")));
}
TestFileUtil.deleteDirectory(tempDir);
}
@Test
public void testFileLocked() throws Exception {
// Setup
File tempDir = TestFileUtil.createTempDirectoryInSystemTemp();
// Run
File lockedFile = TestFileUtil.createRandomFileInDirectory(tempDir, 50*1024);
// Test
assertFalse("File should not be locked: "+lockedFile, FileUtil.isFileLocked(lockedFile));
RandomAccessFile fileLock = new RandomAccessFile(lockedFile, "rw");
FileLock lockedFileLock = fileLock.getChannel().lock();
assertTrue("File should be locked: "+lockedFile, FileUtil.isFileLocked(lockedFile));
// Tear down
lockedFileLock.release();
fileLock.close();
Path bFilePath = Paths.get(lockedFile.getAbsolutePath());
if (EnvironmentUtil.isWindows()) {
Files.setAttribute(bFilePath, "dos:readonly", true);
}
else if (EnvironmentUtil.isUnixLikeOperatingSystem()) {
Files.setPosixFilePermissions(bFilePath, PosixFilePermissions.fromString("r--r--r--"));
}
assertFalse("File should not be locked if read-only: "+lockedFile, FileUtil.isFileLocked(lockedFile));
// Tear down
TestFileUtil.deleteDirectory(tempDir);
}
}