package org.codehaus.mojo.jaxb2.shared; import org.codehaus.mojo.jaxb2.BufferingLog; import org.codehaus.mojo.jaxb2.shared.filters.Filter; import org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import se.jguru.nazgul.test.xmlbinding.XmlTestUtils; import java.io.File; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.SortedMap; /** * @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>, jGuru Europe AB * @since 2.0 */ public class FileSystemUtilitiesTest { // Shared state private File fsUtilitiesDirectory; private File canonicalsDirectory; private File testFile1; private File testFile2; private File srcTestResources; private BufferingLog log; @Before public void setupSharedState() { this.log = new BufferingLog(BufferingLog.LogLevel.DEBUG); final URL fsUtilitiesDirUrl = getClass().getClassLoader().getResource("testdata/shared/filesystemutilities"); fsUtilitiesDirectory = new File(fsUtilitiesDirUrl.getPath()); canonicalsDirectory = new File(fsUtilitiesDirectory, "canonicals"); Assert.assertTrue(FileSystemUtilities.EXISTING_DIRECTORY.accept(fsUtilitiesDirectory)); Assert.assertTrue(FileSystemUtilities.EXISTING_DIRECTORY.accept(canonicalsDirectory)); testFile2 = new File(fsUtilitiesDirectory, "TestFile2.txt"); testFile1 = new File(canonicalsDirectory, "TestFile1.txt"); Assert.assertTrue(FileSystemUtilities.EXISTING_FILE.accept(testFile1)); Assert.assertTrue(FileSystemUtilities.EXISTING_FILE.accept(testFile2)); final URL testdataDir = getClass().getClassLoader().getResource("testdata"); srcTestResources = new File(testdataDir.getPath()).getParentFile(); Assert.assertTrue(FileSystemUtilities.EXISTING_DIRECTORY.accept(srcTestResources)); } @Test public void validateGettingUrlForFile() { // Assemble final String relativePath = "testdata/shared/filesystemutilities/canonicals/TestFile1.txt"; final URL expected = getClass().getClassLoader().getResource(relativePath); // Act final URL result = FileSystemUtilities.getUrlFor(testFile1); // Assert Assert.assertEquals(expected, result); } @Test public void validateCanonicalFileAndPath() { // Assemble final File unitUnderTest = new File(canonicalsDirectory, "../TestFile2.txt"); // Act final String cPath1 = FileSystemUtilities.getCanonicalPath(unitUnderTest); final String cPath2 = FileSystemUtilities.getCanonicalPath(testFile2); final File cFile1 = FileSystemUtilities.getCanonicalFile(unitUnderTest); final File cFile2 = FileSystemUtilities.getCanonicalFile(testFile2); // Assert Assert.assertEquals(cPath1, cPath2); Assert.assertEquals(cFile1, cFile2); } @Test(expected = NullPointerException.class) public void validateExceptionOnGettingExistingFileWithRelativePathAndNullBasedir() { // Assemble final String relativePath = "testdata/shared/filesystemutilities/TestFile2.txt"; final File incorrectNullBaseDir = null; // Act & Assert FileSystemUtilities.getExistingFile(relativePath, incorrectNullBaseDir); } @Test public void validateSimplifiedFileExistenceRetrieval() { // Assemble final String absolutePath = FileSystemUtilities.getCanonicalPath(testFile2); final String aNonExistentAbsolutePath = new File(canonicalsDirectory, "nonExistent.txt").getAbsolutePath(); final String relativePath = "canonicals/TestFile1.txt"; final String aNonExistentRelativePath = "canonicals/doesNotExist.pdf"; // Act final File absoluteFile = FileSystemUtilities.getExistingFile(absolutePath, null); final File nonExistentAbsoluteFile = FileSystemUtilities.getExistingFile(aNonExistentAbsolutePath, null); final File relativeFile = FileSystemUtilities.getExistingFile(relativePath, fsUtilitiesDirectory); final File nonExistentRelativeFile = FileSystemUtilities.getExistingFile( aNonExistentRelativePath, fsUtilitiesDirectory); // Assert Assert.assertNotNull(absoluteFile); Assert.assertNull(nonExistentAbsoluteFile); Assert.assertNotNull(relativeFile); Assert.assertNull(nonExistentRelativeFile); } @Test(expected = NullPointerException.class) public void validateExceptionOnNullFileListWhenResolvingFilesAndRemovingExclusions() { // Assemble final List<File> incorrectNullFileList = null; // Act & Assert FileSystemUtilities.resolveRecursively(incorrectNullFileList, null, log); } @Test public void validateFilteredDirectoryListingUsingIncludeFilters() { // Assemble final URL aDirURL = getClass().getClassLoader().getResource("testdata/shared/filefilter/exclusion"); final File dir = new File(aDirURL.getPath()); final List<Filter<File>> textFiles = PatternFileFilter.createIncludeFilterList(log, "\\.txt"); final List<Filter<File>> xmlFiles = PatternFileFilter.createIncludeFilterList(log, "\\.xml"); final List<Filter<File>> allFiles = PatternFileFilter.createIncludeFilterList(log, "\\.*"); // Act & Assert Assert.assertEquals(2, FileSystemUtilities.listFiles(dir, allFiles, log).size()); final List<File> textFilesList = FileSystemUtilities.listFiles(dir, textFiles, log); Assert.assertEquals(1, textFilesList.size()); Assert.assertEquals("TextFile.txt", textFilesList.get(0).getName()); final List<File> xmlFilesList = FileSystemUtilities.listFiles(dir, xmlFiles, log); Assert.assertEquals(1, xmlFilesList.size()); Assert.assertEquals("AnXmlFile.xml", xmlFilesList.get(0).getName()); } @Test @SuppressWarnings("all") public void validateFilteredDirectoryListingUsingExcludeFilters() { // Assemble final URL aDirURL = getClass().getClassLoader().getResource("testdata/shared/filefilter/exclusion"); final File exclusionDir = new File(aDirURL.getPath()); final List<Filter<File>> noTextFiles = PatternFileFilter.createExcludeFilterList(log, "\\.txt"); final List<Filter<File>> noXmlFiles = PatternFileFilter.createExcludeFilterList(log, "\\.xml"); final List<Filter<File>> noFiles = PatternFileFilter.createExcludeFilterList(log, "\\.*"); // Act & Assert Assert.assertEquals(0, FileSystemUtilities.listFiles(exclusionDir, noFiles, log).size()); final List<File> noXmlFilesList = FileSystemUtilities.listFiles(exclusionDir, noXmlFiles, log); Assert.assertEquals(1, noXmlFilesList.size()); Assert.assertEquals("TextFile.txt", noXmlFilesList.get(0).getName()); final List<File> noTextFilesList = FileSystemUtilities.listFiles(exclusionDir, noTextFiles, log); Assert.assertEquals(1, noTextFilesList.size()); Assert.assertEquals("AnXmlFile.xml", noTextFilesList.get(0).getName()); } @Test public void validateResolveRecursively() { // Assemble final URL fileFilterDirUrl = getClass().getClassLoader().getResource("testdata/shared/filefilter"); final File fileFilterDir = new File(fileFilterDirUrl.getPath()); final List<File> fileList = new ArrayList<File>(); fileList.add(fsUtilitiesDirectory); fileList.add(fileFilterDir); final List<Filter<File>> noTextFilesPattern = PatternFileFilter.createIncludeFilterList(log, "\\.txt"); // Act final List<File> result = FileSystemUtilities.resolveRecursively(fileList, noTextFilesPattern, log); // Assert Assert.assertEquals(1, result.size()); Assert.assertEquals("AnXmlFile.xml", result.get(0).getName()); } @Test public void validateResolvingFilesAndRemovingExclusions() { // Assemble final URL fileFilterDirUrl = getClass().getClassLoader().getResource("testdata/shared/filefilter"); final File fileFilterDir = new File(fileFilterDirUrl.getPath()); final File depsPropertiesFile = new File(fileFilterDir.getParentFile(), "deps1.properties"); final List<File> fileList = new ArrayList<File>(); fileList.add(fsUtilitiesDirectory); fileList.add(fileFilterDir); fileList.add(depsPropertiesFile); final List<Filter<File>> matchTextFiles = PatternFileFilter.createIncludeFilterList(log, "\\.txt"); final List<Filter<File>> matchXmlFiles = PatternFileFilter.createIncludeFilterList(log, "\\.xml"); final List<Filter<File>> matchNonexistentFiles = PatternFileFilter.createIncludeFilterList( log, "\\.nonexistent"); // Act final List<File> noTextFiles = FileSystemUtilities.resolveRecursively(fileList, matchTextFiles, log); final List<File> noXmlFiles = FileSystemUtilities.resolveRecursively(fileList, matchXmlFiles, log); final List<File> allFiles = FileSystemUtilities.resolveRecursively(fileList, matchNonexistentFiles, log); final List<File> noFilterFiles = FileSystemUtilities.resolveRecursively(fileList, null, log); // Assert Assert.assertEquals(2, noTextFiles.size()); Assert.assertEquals(4, noXmlFiles.size()); Assert.assertEquals(5, allFiles.size()); Assert.assertEquals(5, noFilterFiles.size()); final List<String> canonicalPathsForExplicitlyAddedFiles = getRelativeCanonicalPaths( noFilterFiles, depsPropertiesFile.getParentFile()); Assert.assertTrue(canonicalPathsForExplicitlyAddedFiles.contains("/deps1.properties")); final List<String> canonicalPathsForNoTextFiles = getRelativeCanonicalPaths( noTextFiles, depsPropertiesFile.getParentFile()); Assert.assertTrue(canonicalPathsForNoTextFiles.contains("/deps1.properties")); Assert.assertTrue(canonicalPathsForNoTextFiles.contains("/filefilter/exclusion/AnXmlFile.xml")); final List<String> canonicalPathsForNoXmlFiles = getRelativeCanonicalPaths( noXmlFiles, depsPropertiesFile.getParentFile()); Assert.assertTrue(canonicalPathsForNoXmlFiles.contains("/deps1.properties")); Assert.assertTrue(canonicalPathsForNoXmlFiles.contains("/filefilter/exclusion/TextFile.txt")); Assert.assertTrue(canonicalPathsForNoXmlFiles.contains("/filesystemutilities/TestFile2.txt")); Assert.assertTrue(canonicalPathsForNoXmlFiles.contains("/filesystemutilities/canonicals/TestFile1.txt")); final List<String> canonicalPathsForAllFiles = getRelativeCanonicalPaths( allFiles, depsPropertiesFile.getParentFile()); Assert.assertTrue(canonicalPathsForAllFiles.contains("/deps1.properties")); Assert.assertTrue(canonicalPathsForAllFiles.contains("/filefilter/exclusion/TextFile.txt")); Assert.assertTrue(canonicalPathsForAllFiles.contains("/filesystemutilities/TestFile2.txt")); Assert.assertTrue(canonicalPathsForAllFiles.contains("/filesystemutilities/canonicals/TestFile1.txt")); Assert.assertTrue(canonicalPathsForAllFiles.contains("/filefilter/exclusion/AnXmlFile.xml")); } @Test public void validateBufferingLog() { // Assemble final BufferingLog log = new BufferingLog(BufferingLog.LogLevel.INFO); // Act log.debug("debug"); log.info("info", new NullPointerException("Blah!")); log.warn("warn"); log.error(new IllegalArgumentException("Gnat")); // Assert final SortedMap<String, Throwable> logBuffer = log.getLogBuffer(); final List<String> keys = new ArrayList<String>(logBuffer.keySet()); Assert.assertEquals(3, keys.size()); Assert.assertEquals("000: (INFO) info", keys.get(0)); Assert.assertEquals("001: (WARN) warn", keys.get(1)); Assert.assertEquals("002: (ERROR) ", keys.get(2)); Assert.assertEquals("Blah!", logBuffer.get(keys.get(0)).getMessage()); Assert.assertNull(logBuffer.get(keys.get(1))); Assert.assertTrue(logBuffer.get(keys.get(2)) instanceof IllegalArgumentException); } @Test public void validateFilteringFiles() { // Assemble final BufferingLog log = new BufferingLog(BufferingLog.LogLevel.DEBUG); final URL sharedDirUrl = getClass().getClassLoader().getResource("testdata/shared"); final File basedir = new File(sharedDirUrl.getPath()); final List<Filter<File>> excludeTextFiles = PatternFileFilter.createIncludeFilterList(log, "txt"); // Act final List<File> result = FileSystemUtilities.filterFiles( basedir, null, "filefilter/exclusion", log, "testFiles", excludeTextFiles); // Assert Assert.assertEquals(1, result.size()); final File theFile = result.get(0); Assert.assertEquals("AnXmlFile.xml", theFile.getName()); } @Test public void validateFilterFilesWithSuppliedSourcesAndExcludePatterns() { // Assemble final BufferingLog log = new BufferingLog(BufferingLog.LogLevel.DEBUG); final List<String> sources = Arrays.asList( "filefilter/exclusion/AnXmlFile.xml", "filefilter/exclusion/TextFile.txt"); final URL sharedDirUrl = getClass().getClassLoader().getResource("testdata/shared"); final File basedir = new File(sharedDirUrl.getPath()); final List<Filter<File>> excludeTextFiles = PatternFileFilter.createIncludeFilterList(log, "\\.txt"); // Act final List<File> result = FileSystemUtilities.filterFiles(basedir, sources, "filefilter/exclusion", log, "testFiles", excludeTextFiles); // Assert Assert.assertEquals(1, result.size()); final File theFile = result.get(0); Assert.assertEquals("AnXmlFile.xml", theFile.getName()); } @Test public void validateGettingFileForJar() { // Assemble final String jarPath = "testdata/shared/nazgul-tools-validation-aspect-4.0.1.jar"; final URL resource = getClass().getClassLoader().getResource(jarPath); Assert.assertNotNull(resource); // Act final File jarFile = FileSystemUtilities.getFileFor(resource, "UTF-8"); final String relativized = FileSystemUtilities.relativize(jarFile.getPath(), srcTestResources); // Assert Assert.assertTrue(jarFile.exists()); Assert.assertTrue(jarFile.isFile()); Assert.assertEquals(jarPath.replace("/", File.separator), relativized); } @Test public void validateGettingFileForClassURL() { // Assemble final URL streamingDhURL = XmlTestUtils.class.getProtectionDomain().getCodeSource().getLocation(); Assert.assertNotNull(streamingDhURL); // Act final File jarFile = FileSystemUtilities.getFileFor(streamingDhURL, "UTF-8"); // Assert Assert.assertTrue(jarFile.exists()); Assert.assertTrue(jarFile.isFile()); } @Test public void validateGettingFileForClassResourceURL() { // Assemble final String classResource = XmlTestUtils.class.getName().replace(".", "/") + ".class"; final URL resource = getClass().getClassLoader().getResource(classResource); Assert.assertNotNull(resource); // Act final File jarFile = FileSystemUtilities.getFileFor(resource, "UTF-8"); // Assert Assert.assertTrue(jarFile.exists()); Assert.assertTrue(jarFile.isFile()); } @Test public void validateUrlEncodingAndDecoding() throws Exception { // Assemble final String resourcePath = "testdata/shared/urlhandling/file with spaces.txt"; final URL dirUrl = getClass().getClassLoader().getResource(resourcePath); Assert.assertNotNull(dirUrl); // Act final String normalizedPath = dirUrl.toURI().normalize().toURL().getPath(); final String decoded = URLDecoder.decode(normalizedPath, "UTF-8"); // Assert Assert.assertTrue(normalizedPath.endsWith("file%20with%20spaces.txt")); Assert.assertTrue(decoded.endsWith("file with spaces.txt")); } // // Private helpers // private List<String> getRelativeCanonicalPaths(final List<File> fileList, final File cutoff) { final String cutoffPath = FileSystemUtilities.getCanonicalPath(cutoff).replace(File.separator, "/"); final List<String> toReturn = new ArrayList<String>(); for (File current : fileList) { final String canPath = FileSystemUtilities.getCanonicalPath(current).replace(File.separator, "/"); if (!canPath.startsWith(cutoffPath)) { throw new IllegalArgumentException("Illegal cutoff provided. Cutoff: [" + cutoffPath + "] must be a parent to CanonicalPath [" + canPath + "]"); } toReturn.add(canPath.substring(cutoffPath.length())); } Collections.sort(toReturn); return toReturn; } }