package net.ayld.facade.util; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.List; import java.util.Set; import junit.framework.Assert; import static junit.framework.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.io.Resources; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:META-INF/test-contexts/testFilesContext.xml"}) public class TestFiles { private static final String JAVA_CLASS_FILE_EXTENSION = "class"; private static final String SUB_DIR_TEST_NAME = "sub"; @Autowired private String filesWorkDir; @Before public void prepare() throws URISyntaxException, IOException { final File work = new File(filesWorkDir); delete(work); if (!work.mkdirs()) { // recreate work dir throw new IOException("unable to create directory: " + work); } final Joiner pathJoiner = Joiner.on(File.separator); final File subWork = new File(pathJoiner.join(work.getAbsolutePath(), SUB_DIR_TEST_NAME)); if (!subWork.mkdirs()) { throw new IOException("unable to create directory: " + subWork); } // create a 'class' named dir in an attempt to confuse the util into thinking its a file final File classDir = new File(pathJoiner.join(subWork.getAbsolutePath(), "class")); if (!classDir.mkdirs()) { throw new IOException("unable to create directory: " + classDir); } // create a file named 'class' with no extension in the workDir final File fakeClass = new File(pathJoiner.join(classDir.getAbsolutePath(), "class")); if (!fakeClass.createNewFile()) { throw new IOException("unable to create file: " + fakeClass); } final Set<File> testFiles = ImmutableSet.of( new File(Resources.getResource("test-classes/ClassName.class").toURI()), new File(Resources.getResource("test-classes/CoreRenderer.class").toURI()), new File(Resources.getResource("test-classes/PrimePartialViewContext.class").toURI()), new File(Resources.getResource("test-classes/ValidCoffee.java").toURI()) ); for (File testFile : testFiles) { com.google.common.io.Files.copy(testFile, new File(pathJoiner.join(filesWorkDir, testFile.getName()))); com.google.common.io.Files.copy(testFile, new File(pathJoiner.join(subWork.getAbsolutePath(), testFile.getName()))); } } @Test public void withExtensionNonRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).nonRecursive().withExtension(JAVA_CLASS_FILE_EXTENSION).list(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 3); assertThatFoundAreFiles(found); } @Test public void withExtensionRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).withExtension(JAVA_CLASS_FILE_EXTENSION).list(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 6); assertThatFoundAreFiles(found); } @Test public void inclusiveRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).withExtension(JAVA_CLASS_FILE_EXTENSION).named("ValidCoffee").inclusive(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 8); assertThatFoundAreFiles(found); } @Test public void inclusiveNonRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).nonRecursive().withExtension(JAVA_CLASS_FILE_EXTENSION).named("ValidCoffee").inclusive(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 4); assertThatFoundAreFiles(found); } @Test public void exclusiveRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).withExtension(JAVA_CLASS_FILE_EXTENSION).named("ValidCoffee").exclusive(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 2); assertThatFoundAreFiles(found); } @Test public void exclusiveNonRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).nonRecursive().withExtension(JAVA_CLASS_FILE_EXTENSION).named("ValidCoffee").exclusive(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 1); assertThatFoundAreFiles(found); } @Test public void all() throws IOException { final List<File> found = Files.in(filesWorkDir).all(); assertTrue(found != null && !found.isEmpty()); assertTrue(found.size() == 9); assertThatFoundAreFiles(found); } @Test public void allNonRecursive() throws IOException { final List<File> found = Files.in(filesWorkDir).nonRecursive().all(); assertTrue(found != null && !found.isEmpty()); assertThatFoundFilesHaveExtensions(found); assertTrue(found.size() == 4); assertThatFoundAreFiles(found); } @Test public void single() throws IOException { final File found = Files.in(filesWorkDir).nonRecursive().withExtension(JAVA_CLASS_FILE_EXTENSION).named("ValidCoffee").single(); assertTrue(found != null); assertThatFoundAreFiles(Lists.newArrayList(found)); } @Test public void delete() throws IOException { final String tmpDir = String.valueOf(File.createTempFile("probe", "tmp").getParent()); final Joiner pathJoiner = Joiner.on(File.separator); final String testDir = pathJoiner.join(tmpDir, "testDelete"); new File(pathJoiner.join(testDir, "dir1", "subDir")).mkdirs(); Assert.assertTrue(Directories.in(testDir).recursive().list().size() == 2); Files.deleteRecursive(new File(testDir)); try { Directories.in(testDir); } catch (IllegalArgumentException e) { // success return; } Assert.fail(); } private void assertThatFoundFilesHaveExtensions(List<File> found) { for (File f : found) { if (Tokenizer.delimiter(".").tokenize(f.getAbsolutePath()).tokens().size() != 2) { Assert.fail("found file: " + f.getAbsolutePath() + ", doesn't have an extension"); } } } private void assertThatFoundAreFiles(List<File> found) { for (File f : found) { if (!f.isFile()) { Assert.fail("found 'file': " + f.getAbsolutePath() + ", is not a file"); } } } private static void delete(File file) throws IOException { if (file == null || !file.exists()) { return; } if (file.isDirectory()) { for (File sub : file.listFiles()) { delete(sub); } } if (!file.delete()) { throw new IOException("failed to deleteRecursive: " + file); } } }