package co.codewizards.cloudstore.core.oio.nio;
import static org.assertj.core.api.Assertions.*;
import java.io.IOException;
import org.junit.Test;
import co.codewizards.cloudstore.core.oio.File;
import co.codewizards.cloudstore.core.oio.IoFileFactory;
import co.codewizards.cloudstore.core.oio.IoFileUtil;
import co.codewizards.cloudstore.core.oio.nio.NioFileFactory;
/**
* @author Sebastian Schefczyk
*
*/
public class IoFileUtilTest {
@Test
public void newFileName_oneFile() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from");
final File toDir = ioFileFactory.createTempDirectory("to");
final File current = ioFileFactory.createFile(fromDir, "a");
System.out.println("### newFileName_oneFile ###");
System.out.println("fromDir: " + fromDir);
System.out.println("toDir: " + toDir);
System.out.println("current: " + current);
final File newFileName = IoFileUtil.newFileNameForRenameTo(fromDir, toDir, current);
final String expected = toDir.getAbsolutePath() + java.io.File.separator + "a";
assertThat(newFileName.getAbsolutePath()).isEqualTo(expected);
}
@Test
public void newFileName_subdir() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from0-");
final File toDir = ioFileFactory.createTempDirectory("to0-");
final File subDir = ioFileFactory.createFile(fromDir, "s");
System.out.println("### newFileName_subdir ###");
System.out.println("fromDir: " + fromDir);
System.out.println("toDir: " + toDir);
System.out.println("subDir: " + subDir);
final File newFileName = IoFileUtil.newFileNameForRenameTo(fromDir, toDir, subDir);
final String expected = toDir.getAbsolutePath() + java.io.File.separator + "s";
assertThat(newFileName.getAbsolutePath()).isEqualTo(expected);
}
@Test
public void newFileName_subdirFile() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from1-");
final File toDir = ioFileFactory.createTempDirectory("to1-");
final File subDir = ioFileFactory.createFile(fromDir, "s");
final File current = ioFileFactory.createFile(subDir, "a");
// System.out.println("### newFileName_subdirFile ###");
// System.out.println("fromDir: " + fromDir);
// System.out.println("toDir: " + toDir);
// System.out.println("subDir: " + subDir);
// System.out.println("current: " + current);
final File newFileName = IoFileUtil.newFileNameForRenameTo(fromDir, toDir, current);
final String expected = toDir.getAbsolutePath() + java.io.File.separator + "s" + java.io.File.separator + "a";
assertThat(newFileName.getAbsolutePath()).isEqualTo(expected);
}
@Test
public void moveRecursively() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from2-");
final File toDir = ioFileFactory.createTempDirectory("to2-");
final File fromDirSubDir = ioFileFactory.createFile(fromDir, "s");
fromDirSubDir.mkdir();
final File fromDirFile = ioFileFactory.createFile(fromDir, "f");
fromDirFile.createNewFile();
final File current = ioFileFactory.createFile(fromDirSubDir, "a");
current.createNewFile();
IoFileUtil.moveRecursively(fromDir, toDir);
final String expectedToDir = toDir.getAbsolutePath();
final String expectedSubDir = toDir.getAbsolutePath() + java.io.File.separator + "s";
final String expectedFile = toDir.getAbsolutePath() + java.io.File.separator + "f";
final String expectedSubDirChild = toDir.getAbsolutePath() + java.io.File.separator + "s" + java.io.File.separator + "a";
assertThat(fromDirSubDir.exists()).isFalse();
assertThat(fromDirFile.exists()).isFalse();
assertThat(current.exists()).isFalse();
assertThat(fromDir.exists()).isFalse();
assertThat(ioFileFactory.createFile(expectedToDir).exists()).isTrue();
assertThat(ioFileFactory.createFile(expectedSubDir).exists()).isTrue();
assertThat(ioFileFactory.createFile(expectedSubDir).isDirectory()).isTrue();
assertThat(ioFileFactory.createFile(expectedFile).exists()).isTrue();
assertThat(ioFileFactory.createFile(expectedFile).isFile()).isTrue();
assertThat(ioFileFactory.createFile(expectedSubDirChild).exists()).isTrue();
assertThat(ioFileFactory.createFile(expectedSubDirChild).isFile()).isTrue();
}
@Test
public void deleteRecursively() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from2-");
final File fromDirSubDir = ioFileFactory.createFile(fromDir, "s");
fromDirSubDir.mkdir();
final File fromDirFile = ioFileFactory.createFile(fromDir, "f");
fromDirFile.createNewFile();
final File fromDirSubDirChildFile = ioFileFactory.createFile(fromDirSubDir, "a");
fromDirSubDirChildFile.createNewFile();
final File fromDirSubDirEmpty = ioFileFactory.createFile(fromDir, "e");
fromDirSubDirEmpty.mkdir();
fromDir.deleteRecursively();
assertThat(fromDirSubDir.exists()).isFalse();
assertThat(fromDirFile.exists()).isFalse();
assertThat(fromDirSubDirChildFile.exists()).isFalse();
assertThat(fromDirSubDirEmpty.exists()).isFalse();
assertThat(fromDir.exists()).isFalse();
}
/** This test must support symlinks! */
@Test
public void deleteRecursively_noFollowSymLinks() throws IOException {
final IoFileFactory ioFileFactory = new IoFileFactory();
final File fromDir = ioFileFactory.createTempDirectory("from3-");
final File fromDirSubDir = ioFileFactory.createFile(fromDir, "s");
fromDirSubDir.mkdir();
final File fromDirFile = ioFileFactory.createFile(fromDir, "f");
fromDirFile.createNewFile();
final File current = ioFileFactory.createFile(fromDirSubDir, "cf");
current.createNewFile();
//2nd directory, which gets linked and should not be deleted
final File dirTwo = ioFileFactory.createTempDirectory("dirTwo-");
final File dirTwoSubDir = ioFileFactory.createFile(dirTwo, "ss");
dirTwoSubDir.mkdir();
final File dirTwoFile = ioFileFactory.createFile(dirTwo, "ff");
dirTwoFile.createNewFile();
final File dirTwoChildFile = ioFileFactory.createFile(dirTwoSubDir, "cfcf");
dirTwoChildFile.createNewFile();
// to create a symlink, we have to take the NioFileFactory
final NioFileFactory nioFileFactory = new NioFileFactory();
// create the symlink to dirTwo:
final File symlinkTwo = nioFileFactory.createFile(fromDirSubDir.getAbsolutePath(), "symlinkToDirTwo");
symlinkTwo.createSymbolicLink(dirTwo.getAbsolutePath());
assertThat(symlinkTwo.exists()).isTrue();
assertThat(symlinkTwo.isSymbolicLink()).isTrue();
assertThat(symlinkTwo.canWrite()).isTrue();
fromDir.deleteRecursively();
// IOUtil.deleteDirectoryRecursively(fromDir);
// same as in the other test
assertThat(fromDirSubDir.exists()).isFalse();
assertThat(fromDirFile.exists()).isFalse();
assertThat(current.exists()).isFalse();
assertThat(fromDir.exists()).isFalse();
// check the symlink got deleted itself:
assertThat(symlinkTwo.exists()).isFalse();
// check the contents of the dirTwo directory have survived
assertThat(dirTwo.exists()).isTrue();
assertThat(dirTwoSubDir.exists()).isTrue();
assertThat(dirTwoFile.exists()).isTrue();
assertThat(dirTwoChildFile.exists()).isTrue();
}
// /** This test must support symlinks! */
//// @Ignore("Move to IOUtilsTest, assert factories")
// @Test
// public void deleteRecursively_meanSymLink() throws IOException {
// final IoFileFactory ioFileFactory = new IoFileFactory();
//
// final File fromDir = ioFileFactory.createTempDirectory("from3-");
// final File fromDirSubDir = ioFileFactory.createFile(fromDir, "s");
// fromDirSubDir.mkdir();
// final File fromDirFile = ioFileFactory.createFile(fromDir, "f");
// fromDirFile.createNewFile();
// final File fromDirChildFile = ioFileFactory.createFile(fromDirSubDir, "cf");
// fromDirChildFile.createNewFile();
//
// //3nd directory, which gets linked and should not be deleted; but symlink was set to noWrite
// final File dirMean = ioFileFactory.createTempDirectory("dirMean-");
// final dirMean.changeOwnership //yeah, needed for testing
// final File dirMeanSubDir = ioFileFactory.createFile(dirMean, "ss");
// dirMeanSubDir.mkdir();
// final File dirMeanFile = ioFileFactory.createFile(dirMean, "ff");
// dirMeanFile.createNewFile();
// final File dirMeanChildFile = ioFileFactory.createFile(dirMeanSubDir, "cfcf");
// dirMeanChildFile.createNewFile();
//
// // to create a symlink, we have to take the NioFileFactory
// final NioFileFactory nioFileFactory = new NioFileFactory();
//
// // create the symlink to dirTwo:
// final File symlinkMean = nioFileFactory.createFile(fromDirSubDir.getAbsolutePath(), "symlinkToDirMean");
// symlinkMean.createSymbolicLink(dirMean.getAbsolutePath());
// assertThat(symlinkMean.exists()).isTrue();
// assertThat(symlinkMean.isSymbolicLink()).isTrue();
// symlinkMean.deleteOnExit(); //perhaps this will even work after set unwritable ;-)
//
//// IOUtil.deleteDirectoryRecursively(fromDir);
// fromDir.deleteRecursively();
//
// //unwritable symlinkMean is here: ./fromDir/fromDirSubDir/symlinkMean
// assertThat(fromDirSubDir.exists()).isTrue();
// assertThat(fromDirFile.exists()).isFalse();
// assertThat(fromDirChildFile.exists()).isFalse();
// assertThat(fromDir.exists()).isTrue();
// // check the symlink got deleted itself:
// assertThat(symlinkMean.exists()).isTrue();
// // check the contents of the dirMean directory have survived
// assertThat(dirMean.exists()).isTrue();
// assertThat(dirMeanSubDir.exists()).isTrue();
// assertThat(dirMeanFile.exists()).isTrue();
// assertThat(dirMeanChildFile.exists()).isTrue();
// }
}