package org.smoothbuild.io.fs.disk;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class RecursiveDeleterTest {
List<File> files;
File root;
@Before
public void before() throws IOException {
files = new ArrayList<>();
root = com.google.common.io.Files.createTempDir();
files.add(root);
}
@After
public void after() {
for (int i = files.size() - 1; 0 <= i; i--) {
File file = files.get(i);
if (file.exists()) {
file.delete();
}
}
}
@Test
public void deleting_non_existent_file_succeeds() throws Exception {
File dir = createDir(root, "dir");
File file = new File(dir, "file");
RecursiveDeleter.deleteRecursively(file.toPath());
assertFalse(file.exists());
}
@Test
public void deleting_sigle_file() throws Exception {
File file = createEmptyFile(root, "file");
RecursiveDeleter.deleteRecursively(file.toPath());
assertFalse(file.exists());
}
@Test
public void deleting_sigle_file_does_not_delete_its_dir() throws Exception {
File dir = createDir(root, "dir");
File file = createEmptyFile(dir, "file");
RecursiveDeleter.deleteRecursively(file.toPath());
assertTrue(dir.exists());
}
@Test
public void deleting_symbolic_link_to_file() throws Exception {
File file = createEmptyFile(root, "file");
File link = new File(root, "link");
Files.createSymbolicLink(link.toPath(), file.toPath());
RecursiveDeleter.deleteRecursively(link.toPath());
assertFalse(link.exists());
assertTrue(file.exists());
}
@Test
public void deleting_symbolic_link_to_dir() throws Exception {
File dir = createDir(root, "dir");
File file = createEmptyFile(dir, "file");
File link = new File(root, "link");
Files.createSymbolicLink(link.toPath(), dir.toPath());
RecursiveDeleter.deleteRecursively(link.toPath());
assertTrue(dir.exists());
assertTrue(file.exists());
assertFalse(link.exists());
}
@Test
public void deleting_recursively_dir() throws Exception {
// given
File fileOutside = createEmptyFile(root, "fileOutsideMain");
String mainDirName = "mainDir";
File mainDir = createDir(root, mainDirName);
String directFileName = "directFile";
File directFile = createEmptyFile(mainDir, directFileName);
String directDirName = "directDir";
File directDir = createDir(mainDir, directDirName);
String notDirectFileName = "notDirectFile";
File notDirectFile = createEmptyFile(directDir, notDirectFileName);
String notDirectDirName = "notDirectDir";
File notDirectDir = createDir(directDir, notDirectDirName);
// when
RecursiveDeleter.deleteRecursively(mainDir.toPath());
// then
assertTrue(fileOutside.exists());
assertFalse(mainDir.exists());
assertFalse(directFile.exists());
assertFalse(directDir.exists());
assertFalse(notDirectFile.exists());
assertFalse(notDirectDir.exists());
}
@Test
public void deleting_recursively_dir_with_symbolic_link_does_not_delete_link_target()
throws Exception {
File file = createEmptyFile(root, "file");
File dir = createDir(root, "dir");
File link = new File(dir, "link");
Files.createSymbolicLink(link.toPath(), file.toPath());
RecursiveDeleter.deleteRecursively(dir.toPath());
assertTrue(file.exists());
assertFalse(dir.exists());
assertFalse(link.exists());
}
private File createDir(File root, String dirName) {
File dir = new File(root, dirName);
dir.mkdirs();
files.add(dir);
return dir;
}
private File createEmptyFile(File root, String fileName) throws IOException {
File file = new File(root, fileName);
new FileOutputStream(file).close();
files.add(file);
return file;
}
}