LoginSystem/src/test/java/fr/xephi/authme/util/FileUtilsTest.java
ljacqu 9dd4039fdd #1467 Create backup before migrating; output newly added message keys
- Extract logic for creating a backup timestamp into FileUtils
2018-02-13 22:15:03 +01:00

226 lines
6.6 KiB
Java

package fr.xephi.authme.util;
import com.google.common.io.Files;
import fr.xephi.authme.TestHelper;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.matchesPattern;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
/**
* Test for {@link FileUtils}.
*/
public class FileUtilsTest {
/** Regex that matches timestamps such as 20180211_1048. */
private static final String BACKUP_TIMESTAMP_PATTERN = "20\\d{6}_\\d{4}";
@BeforeClass
public static void initLogger() {
TestHelper.setupLogger();
}
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void shouldNotCopyFile() throws IOException {
// given
File folder = temporaryFolder.newFolder();
File file = new File(folder, "config.yml");
// purposely don't copy config.yml to verify that config.yml isn't copied by the method
File emailJarFile = TestHelper.getJarFile("/email.html");
Files.copy(emailJarFile, file);
// when
boolean result = FileUtils.copyFileFromResource(file, "config.yml");
// then
assertThat(result, equalTo(true));
assertThat(file.length(), equalTo(emailJarFile.length()));
}
@Test
public void shouldCopyFileFromJar() throws IOException {
// given
File folder = temporaryFolder.newFolder();
File file = new File(folder, "some/folders/welcome.txt");
// when
boolean result = FileUtils.copyFileFromResource(file, "welcome.txt");
// then
assertThat(result, equalTo(true));
assertThat(file.exists(), equalTo(true));
File configJarFile = TestHelper.getJarFile("/welcome.txt");
assertThat(file.length(), equalTo(configJarFile.length()));
}
@Test
public void shouldReturnFalseForInvalidJarFile() throws IOException {
// given
File folder = temporaryFolder.newFolder();
File file = new File(folder, "bogus");
// when
boolean result = FileUtils.copyFileFromResource(file, "does-not-exist");
// then
assertThat(result, equalTo(false));
assertThat(file.exists(), equalTo(false));
}
@Test
public void shouldReturnFalseForParentInvalidParentFolders() throws IOException {
// given
File folder = temporaryFolder.newFolder();
new File(folder, "hello").createNewFile();
File fileToCreate = new File(folder, "hello/test");
// when
boolean result = FileUtils.copyFileFromResource(fileToCreate, "welcome.txt");
// then
assertThat(result, equalTo(false));
}
@Test
public void shouldPurgeDirectory() throws IOException {
// given
File root = temporaryFolder.newFolder();
File file1 = new File(root, "a/b/c/test.html");
File file2 = new File(root, "a/b/f/toast.txt");
File file3 = new File(root, "a/g/rest.png");
File file4 = new File(root, "j/l/roast.tiff");
createFiles(file1, file2, file3, file4);
// when
FileUtils.purgeDirectory(new File(root, "a"));
// then
assertThat(file1.exists(), equalTo(false));
assertThat(file2.exists(), equalTo(false));
assertThat(file3.exists(), equalTo(false));
assertThat(file4.exists(), equalTo(true));
assertThat(new File(root, "a").exists(), equalTo(true));
}
@Test
public void shouldDeleteFile() throws IOException {
// given
File file = temporaryFolder.newFile();
assertThat(file.exists(), equalTo(true));
// when
FileUtils.delete(file);
// then
assertThat(file.exists(), equalTo(false));
}
@Test
public void shouldDoNothingForNullFile() {
// given
File file = null;
// when
FileUtils.delete(file);
// then
// Nothing happens
}
@Test
public void shouldGetResourceFromJar() {
// given / when / then
assertThat(FileUtils.getResourceFromJar("config.yml"), not(nullValue()));
assertThat(FileUtils.getResourceFromJar("does-not-exist"), nullValue());
}
@Test
public void shouldConstructPath() {
// given/when
String result = FileUtils.makePath("path", "to", "test-file.txt");
// then
assertThat(result, equalTo("path" + File.separator + "to" + File.separator + "test-file.txt"));
}
@Test
public void shouldCreateDirectory() throws IOException {
// given
File root = temporaryFolder.newFolder();
File dir = new File(root, "folder/folder2/myFolder");
// when
boolean result = FileUtils.createDirectory(dir);
// then
assertThat(result, equalTo(true));
assertThat(dir.exists(), equalTo(true));
assertThat(dir.isDirectory(), equalTo(true));
}
@Test
public void shouldReturnFalseOnDirectoryCreateFail() throws IOException {
// given
File root = temporaryFolder.newFolder();
File dirAsFile = new File(root, "file");
dirAsFile.createNewFile();
// when
boolean result = FileUtils.createDirectory(dirAsFile);
// then
assertThat(result, equalTo(false));
assertThat(dirAsFile.isFile(), equalTo(true));
}
@Test
public void shouldHaveHiddenConstructor() {
TestHelper.validateHasOnlyPrivateEmptyConstructor(FileUtils.class);
}
@Test
public void shouldCreateCurrentTimestampString() {
// given / when
String currentTimeString = FileUtils.createCurrentTimeString();
// then
assertThat(currentTimeString, matchesPattern(BACKUP_TIMESTAMP_PATTERN));
}
@Test
public void shouldCreateBackupFile() {
// given
File file = new File("some/folders/config.yml");
// when
String backupFile = FileUtils.createBackupFilePath(file);
// then
String folders = String.join(File.separator,"some", "folders", "").replace("\\", "\\\\");
assertThat(backupFile, matchesPattern(folders + "backup_config_" + BACKUP_TIMESTAMP_PATTERN + "\\.yml"));
}
private static void createFiles(File... files) throws IOException {
for (File file : files) {
boolean result = file.getParentFile().mkdirs() & file.createNewFile();
if (!result) {
throw new IllegalStateException("Cannot create file '" + file + "'");
}
}
}
}