package alma.acs.util; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.List; import java.util.logging.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; import alma.acs.testsupport.TestLogger; public class AcsFileFinderForDirectoriesTest { private Logger logger; private File rootDir1; private File rootDir2; private File rootDir3; private File acsdataDir; @Before public void setUp() throws Exception { logger = TestLogger.getLogger("TestLogger"); File sandboxDir = new File("AcsFileFinderForDirs_Sandbox").getAbsoluteFile(); assertThat("Test must be started in the module's test directory.", sandboxDir.exists(), is(true)); rootDir1 = new File(sandboxDir, "rootDir1"); rootDir2 = new File(sandboxDir, "rootDir2"); rootDir3 = new File(sandboxDir, "rootDir3"); String testSearchPath = rootDir1.getAbsolutePath() + File.pathSeparator + rootDir2.getAbsolutePath() + File.pathSeparator + rootDir3.getAbsolutePath(); System.setProperty(AcsFileFinderForDirectories.SEARCHPATH_PROPERTYNAME, testSearchPath); acsdataDir = new File(sandboxDir, "fakeAcsdata"); String testAcsdataPath = acsdataDir.getAbsolutePath(); System.setProperty(AcsFileFinderForDirectories.ACSDATA_PATH_PROPERTYNAME, testAcsdataPath); } @After public void tearDown() throws Exception { } /** * Tests the basic functionality of correctly finding a single file * in a set of root directories. */ @Test public void testSingleFileDirectoryOverlay() { // test without ACSDATA AcsFileFinderForDirectories fileFinder = new AcsFileFinderForDirectories(logger, false); List<File> rootDirs = fileFinder.getRootDirs(); List<File> expectedRootDirs = Arrays.asList(rootDir1, rootDir2, rootDir3); assertThat(rootDirs, equalTo(expectedRootDirs)); String testFileName = "testFile1.txt"; // exists multiple times under the root and config dirs File testFile = fileFinder.findFile("", testFileName); assertThat("testFile1.txt should come from rootDir1", testFile, equalTo(new File(rootDir1, testFileName))); testFile = fileFinder.findFile("config", testFileName); assertThat("config/testFile1.txt should come from rootDir1", testFile, equalTo(new File(rootDir1, "config" + File.separator + testFileName))); testFileName = "testFile4.txt"; // exists only under rootDir2/config testFile = fileFinder.findFile("config", testFileName); assertThat("config/testFile4.txt should come from rootDir2", testFile, equalTo(new File(rootDir2, "config" + File.separator + testFileName))); testFileName = "testFile5.txt"; // exists only under fakeAcsdata, which should be invisible testFile = fileFinder.findFile("", testFileName); assertThat("testFile5.txt from fakeAcsdata should be invisible", testFile, nullValue()); // repeat test with ACSDATA fileFinder = new AcsFileFinderForDirectories(logger, true); testFileName = "testFile1.txt"; testFile = fileFinder.findFile("", testFileName); assertThat("testFile1.txt should come from rootDir1", testFile, equalTo(new File(rootDir1, testFileName))); testFileName = "testFile5.txt"; // exists only under fakeAcsdata, which should now be visible testFile = fileFinder.findFile("", testFileName); assertThat("testFile5.txt from fakeAcsdata should be visible", testFile, equalTo(new File(acsdataDir, testFileName))); } /** * Tests the basic functionality of correctly finding multiple files * in a set of root directories. */ @Test public void testMultipleFilesDirectoryOverlay() { AcsFileFinderForDirectories fileFinder = new AcsFileFinderForDirectories(logger, true); FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return ( name.endsWith(".txt")); } }; List<File> fileList = fileFinder.findFiles("config", filter); assertThat(fileList, containsInAnyOrder( new File(rootDir1, "config" + File.separator + "testFile1.txt"), new File(rootDir1, "config" + File.separator + "testFile2.txt"), new File(rootDir1, "config" + File.separator + "testFile3.txt"), new File(rootDir2, "config" + File.separator + "testFile4.txt") )); } @Test public void testInputParamHandling() { AcsFileFinderForDirectories fileFinder = new AcsFileFinderForDirectories(logger, true); assertThat("null relative path should be treated like empty relative path", fileFinder.findFile(null, "testFile1.txt"), equalTo(fileFinder.findFile("", "testFile1.txt"))); try { fileFinder.findFile("", null); fail("findFile with null file name should throw NPE"); } catch (NullPointerException ex) { // expected } // TODO: Also for FilenameFilter } }