package au.edu.uq.cmm.paul.queue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import au.edu.uq.cmm.paul.PaulConfiguration; import au.edu.uq.cmm.paul.PaulException; public abstract class QueueFileManagerTestBase { protected static Path archiveDir; protected static Path captureDir; private static Path sourceDir; protected static File[] sourceFiles; @BeforeClass public static void setup() throws IOException { archiveDir = Files.createTempDirectory("archive"); captureDir = Files.createTempDirectory("capture"); sourceDir = Files.createTempDirectory("source"); sourceFiles = new File[4]; for (int i = 0; i < sourceFiles.length; i++) { sourceFiles[i] = new File(sourceDir.toFile(), "test-" + (i + 1) + ".txt"); try (OutputStream os = new FileOutputStream(sourceFiles[i])) { os.write(("Test file #" + (i + 1) + "\n").getBytes()); } } } @AfterClass public static void teardown() throws IOException { removeTree(archiveDir); removeTree(captureDir); removeTree(sourceDir); } private static void removeTree(Path dir) throws IOException { Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } public QueueFileManagerTestBase() { super(); } protected PaulConfiguration buildConfig() { PaulConfiguration config = new PaulConfiguration(); config.setCaptureDirectory(captureDir.toString()); config.setArchiveDirectory(archiveDir.toString()); return config; } @Test public final void testFileStatus() throws QueueFileException { QueueFileManager qfm = instantiate(); assertEquals(QueueFileManager.FileStatus.NOT_OURS, qfm.getFileStatus(sourceFiles[0])); } @Test public final void testEnqueueText() throws QueueFileException, InterruptedException { QueueFileManager qfm = instantiate(); File file = qfm.generateUniqueFile("foop", false); qfm.enqueueFile("content\n", file, false); assertEquals(QueueFileManager.FileStatus.CAPTURED_FILE, qfm.getFileStatus(file)); assertEquals(8L, file.length()); try { qfm.enqueueFile("content\n", file, false); fail("no exception thrown"); } catch (QueueFileException ex) { /**/ } try { qfm.enqueueFile("content\n", file, true); } catch (QueueFileException ex) { fail("exception thrown"); } } public final QueueFileManager instantiate() { return instantiate(buildConfig()); } public abstract QueueFileManager instantiate(PaulConfiguration config); @Test public final void instantiateTest() { PaulConfiguration config = buildConfig(); instantiate(config); try { config.setArchiveDirectory("/fubar"); instantiate(config); fail("Missing directory not diagnosed"); } catch (PaulException ex) { assertTrue(ex.getMessage().contains("archive")); } finally { config.setArchiveDirectory(archiveDir.toString()); } try { config.setCaptureDirectory("/fubar"); instantiate(config); fail("Missing directory not diagnosed"); } catch (PaulException ex) { assertTrue(ex.getMessage().contains("capture")); } finally { config.setArchiveDirectory(captureDir.toString()); } } }