From 3ac0b0c2de86a0ec6a3c4f22576f4ed74ea04193 Mon Sep 17 00:00:00 2001 From: John Lees-Miller Date: Sun, 26 Apr 2015 21:00:28 -0400 Subject: [PATCH] avoid NPE if project directory does not exist; fixes #10 --- .../java/uk/ac/ic/wlgitbridge/util/Util.java | 13 +++-- .../WLGitBridgeIntegrationTest.java | 51 +++++++++++++++++++ .../invalidState/state.json | 34 +++++++++++++ .../invalidState/testproj/main.tex | 1 + .../validState/state.json | 29 +++++++++++ .../validState/testproj/main.tex | 1 + 6 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj/main.tex create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/testproj/main.tex diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Util.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Util.java index d36b36fb09..2502e0157e 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Util.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Util.java @@ -138,12 +138,15 @@ public class Util { public static void deleteInDirectoryApartFrom(File directory, String... apartFrom) { if (directory != null) { Set excluded = new HashSet(Arrays.asList(apartFrom)); - for (File file : directory.listFiles()) { - if (!excluded.contains(file.getName())) { - if (file.isDirectory()) { - deleteInDirectory(file); + File [] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + if (!excluded.contains(file.getName())) { + if (file.isDirectory()) { + deleteInDirectory(file); + } + file.delete(); } - file.delete(); } } } diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java index 7d7061634b..9c8f548957 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java @@ -82,6 +82,10 @@ public class WLGitBridgeIntegrationTest { put("pushFailsOnUnexpectedError", new HashMap() {{ put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/pushFailsOnUnexpectedError/state/state.json")).build()); }}); + put("pushSucceedsAfterRemovingInvalidFiles", new HashMap() {{ + put("invalidState", new SnapshotAPIStateBuilder(getResourceAsStream("/pushSucceedsAfterRemovingInvalidFiles/invalidState/state.json")).build()); + put("validState", new SnapshotAPIStateBuilder(getResourceAsStream("/pushSucceedsAfterRemovingInvalidFiles/validState/state.json")).build()); + }}); }}; @Rule @@ -497,6 +501,53 @@ public class WLGitBridgeIntegrationTest { assertEquals(EXPECTED_OUT_PUSH_UNEXPECTED_ERROR, actual); } + private static final List EXPECTED_OUT_PUSH_INVALID_EXE_FILE = + Arrays.asList( + "remote: error: invalid files", + "remote: hint: You have 1 invalid files in your Overleaf project:", + "remote: hint: file1.exe (invalid file extension)", + "To http://127.0.0.1:33872/testproj.git", + "! [remote rejected] master -> master (invalid files)", + "error: failed to push some refs to 'http://127.0.0.1:33872/testproj.git'" + ); + + @Test + public void pushSucceedsAfterRemovingInvalidFiles() throws IOException, GitAPIException, InterruptedException { + MockSnapshotServer server = new MockSnapshotServer(3872, getResource("/pushSucceedsAfterRemovingInvalidFiles").toFile()); + server.start(); + server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("invalidState")); + GitBridgeApp wlgb = new GitBridgeApp(new String[] { + makeConfigFile(33872, 3872) + }); + wlgb.run(); + File dir = folder.newFolder(); + Process git = runtime.exec("git clone http://127.0.0.1:33872/testproj.git", null, dir); + int exitCode = git.waitFor(); + File testprojDir = new File(dir, "testproj"); + assertEquals(0, exitCode); + + // try to push invalid file; it should fail + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj"), testprojDir.toPath())); + assertEquals(0, runtime.exec("touch file1.exe", null, testprojDir).waitFor()); + assertEquals(0, runtime.exec("git add -A", null, testprojDir).waitFor()); + assertEquals(0, runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor()); + Process gitPush = runtime.exec("git push", null, testprojDir); + int pushExitCode = gitPush.waitFor(); + assertEquals(1, pushExitCode); + List actual = Util.linesFromStream(gitPush.getErrorStream(), 0, "[K"); + assertEquals(EXPECTED_OUT_PUSH_INVALID_EXE_FILE, actual); + + // remove invalid file and push again; it should succeed this time + assertEquals(0, runtime.exec("git rm file1.exe", null, testprojDir).waitFor()); + assertEquals(0, runtime.exec("git commit -m remove_invalid_file", null, testprojDir).waitFor()); + server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("validState")); + gitPush = runtime.exec("git push", null, testprojDir); + pushExitCode = gitPush.waitFor(); + wlgb.stop(); + assertEquals(0, pushExitCode); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/validState/testproj"), testprojDir.toPath())); + } + private String makeConfigFile(int port, int apiPort) throws IOException { File wlgb = folder.newFolder(); File config = folder.newFile(); diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/state.json new file mode 100644 index 0000000000..a885a9747e --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/state.json @@ -0,0 +1,34 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 1, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "test@example.com", + "name": "Test User" + }, + "getSavedVers": [], + "getForVers": [ + { + "versionID": 1, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + } + ], + "atts": [] + } + ], + "push": "success", + "postback": { + "type": "invalidFiles", + "errors": [ + { + "file": "file1.exe", + "state": "disallowed" + } + ] + } + } +] \ No newline at end of file diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj/main.tex new file mode 100644 index 0000000000..d95f3ad14d --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj/main.tex @@ -0,0 +1 @@ +content diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/state.json new file mode 100644 index 0000000000..fdad80ba96 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/state.json @@ -0,0 +1,29 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 1, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "test@example.com", + "name": "Test User" + }, + "getSavedVers": [], + "getForVers": [ + { + "versionID": 1, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + } + ], + "atts": [] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 2 + } + } +] \ No newline at end of file diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/testproj/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/testproj/main.tex new file mode 100644 index 0000000000..d95f3ad14d --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/pushSucceedsAfterRemovingInvalidFiles/validState/testproj/main.tex @@ -0,0 +1 @@ +content