/*
* #%L
* Nazgul Project: nazgul-core-quickstart-api
* %%
* Copyright (C) 2010 - 2017 jGuru Europe AB
* %%
* Licensed under the jGuru Europe AB license (the "License"), based
* on Apache License, Version 2.0; you may not use this file except
* in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.jguru.se/licenses/jguruCorporateSourceLicense-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*
*/
package se.jguru.nazgul.core.quickstart.api;
import org.apache.maven.model.Model;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import se.jguru.nazgul.core.quickstart.model.SimpleArtifact;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
/**
* @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>, jGuru Europe AB
*/
public class FileUtilsTest {
// Shared state
private File testDataDir;
private File fooReactorRootDir;
@Before
public void setupSharedState() {
final URL testDataURL = getClass().getClassLoader().getResource("testdata");
testDataDir = new File(testDataURL.getPath());
fooReactorRootDir = new File(testDataDir, "foo");
Assert.assertTrue(FileUtils.DIRECTORY_FILTER.accept(testDataDir));
Assert.assertTrue(FileUtils.DIRECTORY_FILTER.accept(fooReactorRootDir));
}
@Test
public void validateExtractingSimpleArtifactFromModel() {
// Assemble
final Model fooModel = FileUtils.getPomModel(new File(fooReactorRootDir, "pom.xml"));
final Model fooPomsReactorModel = FileUtils.getPomModel(new File(fooReactorRootDir, "poms/pom.xml"));
// Act
final SimpleArtifact fooReactorArtifact = FileUtils.getSimpleArtifact(fooModel);
final SimpleArtifact fooPomsReactorArtifact = FileUtils.getSimpleArtifact(fooPomsReactorModel);
// Assert
Assert.assertEquals("se.jguru.nazgul.foo", fooReactorArtifact.getGroupId());
Assert.assertEquals("nazgul-foo-reactor", fooReactorArtifact.getArtifactId());
Assert.assertEquals("1.0.0-SNAPSHOT", fooReactorArtifact.getMavenVersion());
Assert.assertEquals("se.jguru.nazgul.foo.poms", fooPomsReactorArtifact.getGroupId());
Assert.assertEquals("nazgul-foo-poms-reactor", fooPomsReactorArtifact.getArtifactId());
Assert.assertEquals("1.0.0-SNAPSHOT", fooPomsReactorArtifact.getMavenVersion());
}
@Test(expected = IllegalArgumentException.class)
public void validateExceptionOnInvalidPom() {
// Assemble
final File incorrectPom = new File(testDataDir, "invalid_pom/pom.xml");
// Act & Assert
FileUtils.getPomModel(incorrectPom);
}
@Test(expected = IllegalArgumentException.class)
public void validateExceptionOnTryingToReadNonexistentFile() {
// Assemble
final String resourceURL = "a/non/existent/file";
// Act & Assert
FileUtils.readFile(resourceURL);
}
@Test
public void validateReadingTextFile() {
// Assemble
final String expected = "This is row 1 in the simple text file.\n" +
"This is row 2 in the simple text file.\n";
final String filePath = "testdata/directory/simple.txt";
// Act
final String data = FileUtils.readFile(filePath);
// Assert
Assert.assertEquals(expected, data);
}
@Test
public void validateRecursiveListing() {
// Assemble
final String simpleTextFilePath = "simple.txt";
final String anotherSimpleTextFilePath = "subdirectory/anotherSimple.txt";
final String binFilePath = "binary/orange_ball.png";
final List<String> expectedFileNames = Arrays.asList(simpleTextFilePath,
anotherSimpleTextFilePath,
binFilePath);
final String dirPath = "testdata/directory";
final URL resource = getClass().getClassLoader().getResource(dirPath);
final File path = new File(resource.getPath());
// Act
final SortedMap<String, File> files = FileUtils.listFilesRecursively(path);
// Assert
Assert.assertEquals(expectedFileNames.size(), files.size());
for (String current : expectedFileNames) {
if (current.equals(binFilePath)) {
Assert.assertFalse(FileUtils.CHARACTER_DATAFILE_FILTER.accept(files.get(current)));
} else {
Assert.assertTrue(FileUtils.CHARACTER_DATAFILE_FILTER.accept(files.get(current)));
}
Assert.assertTrue(expectedFileNames.contains(current));
}
final File simpleTextFile = files.get(simpleTextFilePath);
final File anotherSimpleTextFile = files.get(anotherSimpleTextFilePath);
Assert.assertEquals(
FileUtils.getCanonicalPath(new File(path, simpleTextFilePath)),
FileUtils.getCanonicalPath(simpleTextFile));
Assert.assertEquals(
FileUtils.getCanonicalPath(new File(path, anotherSimpleTextFilePath)),
FileUtils.getCanonicalPath(anotherSimpleTextFile));
}
@Test
public void validateReadingFiles() {
// Assemble
final String simpleTextFilePath = "simple.txt";
final String anotherSimpleTextFilePath = "subdirectory/anotherSimple.txt";
final File path = new File(getClass().getClassLoader().getResource("testdata/directory").getPath());
final SortedMap<String, File> textFiles = FileUtils.listFilesRecursively(path);
// Act
final String simpleTextFileData = FileUtils.readFile(textFiles.get(simpleTextFilePath));
final String anotherTextFileData = FileUtils.readFile(textFiles.get(anotherSimpleTextFilePath));
// Assert
Assert.assertEquals("This is row 1 in the simple text file.\nThis is row 2 in the simple text file.\n",
simpleTextFileData);
Assert.assertEquals("This is row 1 in another simple text file.\nThis is row 2 in another simple text file.\n",
anotherTextFileData);
}
@Test
public void validateCharDataFileDetection() {
// Assemble
final String binFilePath = "binary/orange_ball.png";
final File path = new File(getClass().getClassLoader().getResource("testdata/directory").getPath());
final SortedMap<String, File> textFiles = FileUtils.listFilesRecursively(path);
final File nonexistent = new File(path, "aNonexistentFile.txt");
// Act & Assert
for (Map.Entry<String, File> current : textFiles.entrySet()) {
final boolean isCharacterFile = !current.getKey().equals(binFilePath);
Assert.assertEquals(isCharacterFile, FileUtils.CHARACTER_DATAFILE_FILTER.accept(current.getValue()));
}
Assert.assertFalse(FileUtils.CHARACTER_DATAFILE_FILTER.accept(nonexistent));
}
@Test
public void validateExistenceRequiredForFilters() {
// Assemble
final File path = new File(getClass().getClassLoader().getResource("testdata/directory").getPath());
final File nonexistent = new File(path, "aNonexistentFile.txt");
// Act & Assert
Assert.assertFalse(FileUtils.MODULE_NAME_FILTER.accept(path));
Assert.assertFalse(FileUtils.MODULE_NAME_FILTER.accept(nonexistent));
}
@Test(expected = IllegalArgumentException.class)
public void validateExceptionOnReadingNonExistentFile() {
// Act & Assert
FileUtils.readFile(new File("/some/nonexistent/file.txt"));
}
@Test
public void validateAcceptingEmptyExistingDirectory() {
// Assemble
final File anEmptyDirectory = createUniqueDirectoryUnderTestData("anEmptyDirectory");
final File aDotFile = new File(anEmptyDirectory, ".someConfigFile");
FileUtils.writeFile(aDotFile, "SomeContent");
// Act & Assert
Assert.assertTrue(FileUtils.NONEXISTENT_OR_EMPTY_DIRECTORY_FILTER.accept(anEmptyDirectory));
}
@Test(expected = IllegalArgumentException.class)
public void validateExceptionOnWritingFileWithoutExistingParent() {
// Assemble
final File nonExistingFile = new File(System.getProperty("java.io.tmpdir"), "a/non/existing/file");
// Act & Assert
FileUtils.writeFile(nonExistingFile, "foobar!");
}
//
// Helpers
//
public static File createUniqueDirectoryUnderTestData(final String name) {
// Get the testdata directory
final URL testdata = Thread.currentThread().getContextClassLoader().getResource("testdata");
final File testdataDir = new File(testdata.getPath());
Assert.assertTrue("Required testdata directory [" + FileUtils.getCanonicalPath(testdataDir)
+ "] nonexistent.", testdataDir.exists());
for (int i = 0; true; i++) {
final String dirName = name + "_" + i;
final File toReturn = new File(testdataDir, dirName);
if (!toReturn.exists()) {
return FileUtils.makeDirectory(testdataDir, dirName);
}
}
}
}