From ad687e5f5825dc8c83f2c0261b63c5e0d4c853ae Mon Sep 17 00:00:00 2001 From: Winston Li Date: Wed, 2 Aug 2017 20:51:20 +0100 Subject: [PATCH] Add failing test for #3705 --- .../ac/ic/wlgitbridge/util/BiConsumerT.java | 11 ++++ .../uk/ac/ic/wlgitbridge/util/FunctionT.java | 14 +++++ .../ac/ic/wlgitbridge/util/ResourceUtil.java | 32 ++++++++++ .../uk/ac/ic/wlgitbridge/util/TarTest.java | 60 +++++++++++++------ .../util/TarTest/dir_with_empty_file/empty | 0 5 files changed, 98 insertions(+), 19 deletions(-) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/BiConsumerT.java create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/FunctionT.java create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/ResourceUtil.java create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/util/TarTest/dir_with_empty_file/empty diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/BiConsumerT.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/BiConsumerT.java new file mode 100644 index 0000000000..dae03e46ff --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/BiConsumerT.java @@ -0,0 +1,11 @@ +package uk.ac.ic.wlgitbridge.util; + +/** + * BiConsumer interface that allows checked exceptions. + */ +@FunctionalInterface +public interface BiConsumerT { + + void accept(T t, U u) throws E; + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/FunctionT.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/FunctionT.java new file mode 100644 index 0000000000..8920830f46 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/FunctionT.java @@ -0,0 +1,14 @@ +package uk.ac.ic.wlgitbridge.util; + +/** + * Function interface that allows checked exceptions. + * @param + * @param + * @param + */ +@FunctionalInterface +public interface FunctionT { + + R apply(T t) throws E; + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/ResourceUtil.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/ResourceUtil.java new file mode 100644 index 0000000000..57c22287b8 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/ResourceUtil.java @@ -0,0 +1,32 @@ +package uk.ac.ic.wlgitbridge.util; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; + +public class ResourceUtil { + + /** + * Creates a copy of a resource folder. Mainly used for testing to prevent + * the original folder from being mangled. + * + * It will have the same name as the original. + * @param resource the resource name, e.g. "/uk/ac/ic/wlgitbridge/file.txt" + * @param folderProvider function used to create the folder. + * E.g. TemporaryFolder from junit + * @return + * @throws IOException + */ + public static File copyOfFolderResource( + String resource, + FunctionT folderProvider + ) throws IOException { + File original + = new File(ResourceUtil.class.getResource(resource).getFile()); + File tmp = folderProvider.apply(original.getName()); + FileUtils.copyDirectory(original, tmp); + return tmp; + } + +} diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/util/TarTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/util/TarTest.java index f8833650e5..9834d7999e 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/util/TarTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/util/TarTest.java @@ -1,6 +1,5 @@ package uk.ac.ic.wlgitbridge.util; -import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -8,8 +7,6 @@ import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.nio.file.Path; -import java.nio.file.Paths; import static org.junit.Assert.assertTrue; @@ -18,37 +15,62 @@ import static org.junit.Assert.assertTrue; */ public class TarTest { + private static final String RESOURCE_DIR + = "/uk/ac/ic/wlgitbridge/util/TarTest"; + private File testDir; + private File dirWithEmptyFile; private File tmpDir; @Before public void setup() throws IOException { TemporaryFolder tmpFolder = new TemporaryFolder(); tmpFolder.create(); - testDir = tmpFolder.newFolder("testdir"); - Path resdir = Paths.get( - "src/test/resources/uk/ac/ic/wlgitbridge/util/TarTest/testdir" - ); - FileUtils.copyDirectory(resdir.toFile(), testDir); + testDir = ResourceUtil.copyOfFolderResource( + RESOURCE_DIR + "/testdir", + tmpFolder::newFolder); + dirWithEmptyFile = ResourceUtil.copyOfFolderResource( + RESOURCE_DIR + "/dir_with_empty_file", + tmpFolder::newFolder); tmpDir = tmpFolder.newFolder(); } + /** + * Compresses inputDir and decompresses to outputDir. Checks equality + * between outputDir and inputDir. + * @param inputDir the directory to compress + * @param outputDir the output directory. Must be empty. + * @param compressFunction compression function + * @param decompressFunction decompression function + * @throws IOException + */ + private static void assertCompDecompEqual( + File inputDir, + File outputDir, + FunctionT compressFunction, + BiConsumerT decompressFunction + ) throws IOException { + try (InputStream tarbz2 = compressFunction.apply(inputDir)) { + decompressFunction.accept(tarbz2, outputDir); + File unzipped = new File(outputDir, inputDir.getName()); + assertTrue(Files.contentsAreEqual(inputDir, unzipped)); + } + } + @Test public void tarAndUntarProducesTheSameResult() throws IOException { - try (InputStream tar = Tar.tar(testDir)) { - Tar.untar(tar, tmpDir); - File untarred = new File(tmpDir, "testdir"); - assertTrue(Files.contentsAreEqual(testDir, untarred)); - } + assertCompDecompEqual(testDir, tmpDir, Tar::tar, Tar::untar); } @Test public void tarbz2AndUntarbz2ProducesTheSameResult() throws IOException { - try (InputStream tarbz2 = Tar.bz2.zip(testDir)) { - Tar.bz2.unzip(tarbz2, tmpDir); - File unzipped = new File(tmpDir, "testdir"); - assertTrue(Files.contentsAreEqual(testDir, unzipped)); - } + assertCompDecompEqual(testDir, tmpDir, Tar.bz2::zip, Tar.bz2::unzip); } -} \ No newline at end of file + @Test + public void tarbz2WorksOnDirectoriesWithAnEmptyFile() throws IOException { + assertCompDecompEqual( + dirWithEmptyFile, tmpDir, Tar.bz2::zip, Tar.bz2::unzip); + } + +} diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/util/TarTest/dir_with_empty_file/empty b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/util/TarTest/dir_with_empty_file/empty new file mode 100644 index 0000000000..e69de29bb2