Просмотр исходного кода

Tests: fix config for git init and factor all git commands into method calls

Winston Li 9 лет назад
Родитель
Сommit
f29c7395d2

+ 156 - 154
services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java

@@ -5,6 +5,7 @@ import com.ning.http.client.Response;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.IOUtils;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TemporaryFolder;
@@ -115,6 +116,91 @@ public class WLGitBridgeIntegrationTest {
     @Rule
     @Rule
     public TemporaryFolder folder = new TemporaryFolder();
     public TemporaryFolder folder = new TemporaryFolder();
 
 
+    private File dir;
+
+    @Before
+    public void setUp() throws Exception {
+        dir = folder.newFolder();
+    }
+
+    private void gitConfig(File dir) throws IOException, InterruptedException {
+        assertEquals(0, runtime.exec(
+                "git config user.name TEST", null, dir
+        ).waitFor());
+        assertEquals(0, runtime.exec(
+                "git config user.email test@test.com", null, dir
+        ).waitFor());
+        assertEquals(0, runtime.exec(
+                "git config push.default matching", null, dir
+        ).waitFor());
+    }
+
+    private File gitClone(String repositoryName, int port, File dir) throws IOException, InterruptedException {
+        String repo = "git clone http://127.0.0.1:" + port + "/" + repositoryName + ".git";
+        Process gitProcess = runtime.exec(repo, null, dir);
+        int exitCode = gitProcess.waitFor();
+        if (exitCode != 0) {
+            System.err.println("git clone failed. Dumping stderr and stdout.");
+            System.err.println(
+                    IOUtils.toString(
+                            gitProcess.getErrorStream(),
+                            StandardCharsets.UTF_8
+                    )
+            );
+            System.err.println(
+                    IOUtils.toString(
+                            gitProcess.getInputStream(),
+                            StandardCharsets.UTF_8
+                    )
+            );
+            fail("git clone failed");
+        }
+        File repositoryDir = new File(dir, repositoryName);
+        gitConfig(repositoryDir);
+        return repositoryDir;
+    }
+
+    private void gitInit(File dir) throws IOException, InterruptedException {
+        assertEquals(0, runtime.exec(
+                "git init", null, dir
+        ).waitFor());
+        gitConfig(dir);
+    }
+
+    private void gitAdd(File dir) throws IOException, InterruptedException {
+        assertEquals(0, runtime.exec(
+                "git add -A", null, dir
+        ).waitFor());
+    }
+
+    private void gitCommit(
+            File dir, String msg
+    ) throws IOException, InterruptedException {
+        assertEquals(0, runtime.exec(
+                "git commit -m \"" + msg + "\"", null, dir
+        ).waitFor());
+    }
+
+    private Process gitPush(File dir) throws IOException, InterruptedException {
+        return gitPush(dir, 0);
+    }
+
+    private Process gitPush(
+            File dir, int exit
+    ) throws IOException, InterruptedException {
+        Process ret = runtime.exec(
+                "git push", null, dir
+        );
+        assertEquals(exit, ret.waitFor());
+        return ret;
+    }
+
+    private void gitPull(File dir) throws IOException, InterruptedException {
+        assertEquals(0, runtime.exec(
+                "git pull", null, dir
+        ).waitFor());
+    }
+
     @Test
     @Test
     public void canCloneARepository() throws IOException, GitAPIException, InterruptedException {
     public void canCloneARepository() throws IOException, GitAPIException, InterruptedException {
         MockSnapshotServer server = new MockSnapshotServer(3857, getResource("/canCloneARepository").toFile());
         MockSnapshotServer server = new MockSnapshotServer(3857, getResource("/canCloneARepository").toFile());
@@ -124,8 +210,7 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33857, 3857)
             makeConfigFile(33857, 3857)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33857, dir);
+        File testprojDir = gitClone("testproj", 33857, dir);
         wlgb.stop();
         wlgb.stop();
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneARepository/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneARepository/state/testproj"), testprojDir.toPath()));
     }
     }
@@ -139,9 +224,8 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33858, 3858)
             makeConfigFile(33858, 3858)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testproj1Dir = cloneRepository("testproj1", 33858, dir);
-        File testproj2Dir = cloneRepository("testproj2", 33858, dir);
+        File testproj1Dir = gitClone("testproj1", 33858, dir);
+        File testproj2Dir = gitClone("testproj2", 33858, dir);
         wlgb.stop();
         wlgb.stop();
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneMultipleRepositories/state/testproj1"), testproj1Dir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneMultipleRepositories/state/testproj1"), testproj1Dir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneMultipleRepositories/state/testproj2"), testproj2Dir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneMultipleRepositories/state/testproj2"), testproj2Dir.toPath()));
@@ -156,14 +240,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33859, 3859)
             makeConfigFile(33859, 3859)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33859, dir);
+        File testprojDir = gitClone("testproj", 33859, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedTexFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedTexFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullAModifiedTexFile").get("withModifiedTexFile"));
         server.setState(states.get("canPullAModifiedTexFile").get("withModifiedTexFile"));
-        Process gitWithModifiedTexFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithModifiedTexFile = gitWithModifiedTexFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithModifiedTexFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedTexFile/withModifiedTexFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedTexFile/withModifiedTexFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -176,14 +257,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33860, 3860)
             makeConfigFile(33860, 3860)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33860, dir);
+        File testprojDir = gitClone("testproj", 33860, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedTexFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedTexFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullADeletedTexFile").get("withDeletedTexFile"));
         server.setState(states.get("canPullADeletedTexFile").get("withDeletedTexFile"));
-        Process gitWithDeletedTexFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithDeletedTexFile = gitWithDeletedTexFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithDeletedTexFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedTexFile/withDeletedTexFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedTexFile/withDeletedTexFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -196,14 +274,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33862, 3862)
             makeConfigFile(33862, 3862)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33862, dir);
+        File testprojDir = gitClone("testproj", 33862, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedBinaryFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedBinaryFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullAModifiedBinaryFile").get("withModifiedBinaryFile"));
         server.setState(states.get("canPullAModifiedBinaryFile").get("withModifiedBinaryFile"));
-        Process gitWithModifiedBinaryFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithModifiedBinaryFile = gitWithModifiedBinaryFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithModifiedBinaryFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedBinaryFile/withModifiedBinaryFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedBinaryFile/withModifiedBinaryFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -216,14 +291,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33863, 3863)
             makeConfigFile(33863, 3863)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33863, dir);
+        File testprojDir = gitClone("testproj", 33863, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedBinaryFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedBinaryFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullADeletedBinaryFile").get("withDeletedBinaryFile"));
         server.setState(states.get("canPullADeletedBinaryFile").get("withDeletedBinaryFile"));
-        Process gitWithDeletedBinaryFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithDeletedBinaryFile = gitWithDeletedBinaryFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithDeletedBinaryFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedBinaryFile/withDeletedBinaryFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADeletedBinaryFile/withDeletedBinaryFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -236,14 +308,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(44001, 4001)
             makeConfigFile(44001, 4001)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 44001, dir);
+        File testprojDir = gitClone("testproj", 44001, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADuplicateBinaryFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADuplicateBinaryFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullADuplicateBinaryFile").get("withDuplicateBinaryFile"));
         server.setState(states.get("canPullADuplicateBinaryFile").get("withDuplicateBinaryFile"));
-        Process gitWithDeletedBinaryFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithDeletedBinaryFile = gitWithDeletedBinaryFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithDeletedBinaryFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADuplicateBinaryFile/withDuplicateBinaryFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADuplicateBinaryFile/withDuplicateBinaryFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -256,8 +325,7 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(44002, 4002)
             makeConfigFile(44002, 4002)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 44002, dir);
+        File testprojDir = gitClone("testproj", 44002, dir);
         wlgb.stop();
         wlgb.stop();
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneDuplicateBinaryFiles/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneDuplicateBinaryFiles/state/testproj"), testprojDir.toPath()));
     }
     }
@@ -271,14 +339,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(44003, 4003)
             makeConfigFile(44003, 4003)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 44003, dir);
+        File testprojDir = gitClone("testproj", 44003, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullUpdatedBinaryFiles").get("withUpdatedBinaryFiles"));
         server.setState(states.get("canPullUpdatedBinaryFiles").get("withUpdatedBinaryFiles"));
-        Process gitWithDeletedBinaryFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithDeletedBinaryFile = gitWithDeletedBinaryFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithDeletedBinaryFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -291,14 +356,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33864, 3864)
             makeConfigFile(33864, 3864)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33864, dir);
+        File testprojDir = gitClone("testproj", 33864, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedNestedFile/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedNestedFile/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullAModifiedNestedFile").get("withModifiedNestedFile"));
         server.setState(states.get("canPullAModifiedNestedFile").get("withModifiedNestedFile"));
-        Process gitWithModifiedNestedFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithModifiedNestedFile = gitWithModifiedNestedFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithModifiedNestedFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedNestedFile/withModifiedNestedFile/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullAModifiedNestedFile/withModifiedNestedFile/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -311,14 +373,11 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33865, 3865)
             makeConfigFile(33865, 3865)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33865, dir);
+        File testprojDir = gitClone("testproj", 33865, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullDeletedNestedFiles/base/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullDeletedNestedFiles/base/testproj"), testprojDir.toPath()));
         server.setState(states.get("canPullDeletedNestedFiles").get("withDeletedNestedFiles"));
         server.setState(states.get("canPullDeletedNestedFiles").get("withDeletedNestedFiles"));
-        Process gitWithDeletedBinaryFile = runtime.exec("git pull", null, testprojDir);
-        int exitCodeWithDeletedBinaryFile = gitWithDeletedBinaryFile.waitFor();
+        gitPull(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, exitCodeWithDeletedBinaryFile);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullDeletedNestedFiles/withDeletedNestedFiles/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullDeletedNestedFiles/withDeletedNestedFiles/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -331,16 +390,13 @@ public class WLGitBridgeIntegrationTest {
         });
         });
         wlgb.run();
         wlgb.run();
         server.setState(states.get("canPushFilesSuccessfully").get("state"));
         server.setState(states.get("canPushFilesSuccessfully").get("state"));
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33866, dir);
+        File testprojDir = gitClone("testproj", 33866, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPushFilesSuccessfully/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPushFilesSuccessfully/state/testproj"), testprojDir.toPath()));
-        runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        assertEquals(0, runtime.exec("touch push.tex", null, testprojDir).waitFor());
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        gitPush(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, pushExitCode);
     }
     }
 
 
     private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST =
     private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST =
@@ -359,17 +415,14 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33867, 3867)
             makeConfigFile(33867, 3867)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33867, dir);
+        File testprojDir = gitClone("testproj", 33867, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnFirstStageOutOfDate/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnFirstStageOutOfDate/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(1, pushExitCode);
-        assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST, Util.fromStream(gitPush.getErrorStream(), 2));
+        assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST, Util.fromStream(push.getErrorStream(), 2));
     }
     }
 
 
     private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND =
     private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND =
@@ -388,17 +441,14 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33868, 3868)
             makeConfigFile(33868, 3868)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33868, dir);
+        File testprojDir = gitClone("testproj", 33868, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnSecondStageOutOfDate/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnSecondStageOutOfDate/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(1, pushExitCode);
-        assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND, Util.fromStream(gitPush.getErrorStream(), 2));
+        assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND, Util.fromStream(push.getErrorStream(), 2));
     }
     }
 
 
     private static final List<String> EXPECTED_OUT_PUSH_INVALID_FILES = Arrays.asList(
     private static final List<String> EXPECTED_OUT_PUSH_INVALID_FILES = Arrays.asList(
@@ -421,17 +471,14 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33869, 3869)
             makeConfigFile(33869, 3869)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33869, dir);
+        File testprojDir = gitClone("testproj", 33869, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnInvalidFiles/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnInvalidFiles/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(1, pushExitCode);
-        List<String> actual = Util.linesFromStream(gitPush.getErrorStream(), 2, "[K");
+        List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
         assertEquals(EXPECTED_OUT_PUSH_INVALID_FILES, actual);
         assertEquals(EXPECTED_OUT_PUSH_INVALID_FILES, actual);
     }
     }
 
 
@@ -452,17 +499,14 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33870, 3870)
             makeConfigFile(33870, 3870)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33870, dir);
+        File testprojDir = gitClone("testproj", 33870, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnInvalidProject/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnInvalidProject/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(1, pushExitCode);
-        List<String> actual = Util.linesFromStream(gitPush.getErrorStream(), 2, "[K");
+        List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
         assertEquals(EXPECTED_OUT_PUSH_INVALID_PROJECT, actual);
         assertEquals(EXPECTED_OUT_PUSH_INVALID_PROJECT, actual);
     }
     }
 
 
@@ -484,17 +528,14 @@ public class WLGitBridgeIntegrationTest {
             makeConfigFile(33871, 3871)
             makeConfigFile(33871, 3871)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33871, dir);
+        File testprojDir = gitClone("testproj", 33871, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnUnexpectedError/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushFailsOnUnexpectedError/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(1, pushExitCode);
-        List<String> actual = Util.linesFromStream(gitPush.getErrorStream(), 2, "[K");
+        List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
         assertEquals(EXPECTED_OUT_PUSH_UNEXPECTED_ERROR, actual);
         assertEquals(EXPECTED_OUT_PUSH_UNEXPECTED_ERROR, actual);
     }
     }
 
 
@@ -517,28 +558,23 @@ public class WLGitBridgeIntegrationTest {
                 makeConfigFile(33872, 3872)
                 makeConfigFile(33872, 3872)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33872, dir);
+        File testprojDir = gitClone("testproj", 33872, dir);
 
 
         // try to push invalid file; it should fail
         // try to push invalid file; it should fail
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/invalidState/testproj"), testprojDir.toPath()));
         assertEquals(0, runtime.exec("touch file1.exe", null, testprojDir).waitFor());
         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<String> actual = Util.linesFromStream(gitPush.getErrorStream(), 0, "[K");
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        Process push = gitPush(testprojDir, 1);
+        List<String> actual = Util.linesFromStream(push.getErrorStream(), 0, "[K");
         assertEquals(EXPECTED_OUT_PUSH_INVALID_EXE_FILE, actual);
         assertEquals(EXPECTED_OUT_PUSH_INVALID_EXE_FILE, actual);
 
 
         // remove invalid file and push again; it should succeed this time
         // 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 rm file1.exe", null, testprojDir).waitFor());
-        assertEquals(0, runtime.exec("git commit -m remove_invalid_file", null, testprojDir).waitFor());
+        gitCommit(testprojDir, "remove_invalid_file");
         server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("validState"));
         server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("validState"));
-        gitPush = runtime.exec("git push", null, testprojDir);
-        pushExitCode = gitPush.waitFor();
+        gitPush(testprojDir);
         wlgb.stop();
         wlgb.stop();
-        assertEquals(0, pushExitCode);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/validState/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/pushSucceedsAfterRemovingInvalidFiles/validState/testproj"), testprojDir.toPath()));
     }
     }
 
 
@@ -562,15 +598,12 @@ public class WLGitBridgeIntegrationTest {
         });
         });
         wlgb.run();
         wlgb.run();
 
 
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", gitBridgePort, dir);
+        File testprojDir = gitClone("testproj", gitBridgePort, dir);
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canServePushedFiles/state/testproj"), testprojDir.toPath()));
         assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canServePushedFiles/state/testproj"), testprojDir.toPath()));
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
         runtime.exec("touch push.tex", null, testprojDir).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
-        Process gitPush = runtime.exec("git push", null, testprojDir);
-        int pushExitCode = gitPush.waitFor();
-        assertEquals(0, pushExitCode);
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
+        gitPush(testprojDir);
 
 
         // With no key, we should get a 404.
         // With no key, we should get a 404.
         String url = "http://127.0.0.1:" + gitBridgePort + "/api/testproj/push.tex";
         String url = "http://127.0.0.1:" + gitBridgePort + "/api/testproj/push.tex";
@@ -608,19 +641,18 @@ public class WLGitBridgeIntegrationTest {
                 makeConfigFile(33874, 3874, new SwapJobConfig(1, 0, 0, 250))
                 makeConfigFile(33874, 3874, new SwapJobConfig(1, 0, 0, 250))
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
         File rootGitDir = new File(wlgb.config.getRootGitDirectory());
         File rootGitDir = new File(wlgb.config.getRootGitDirectory());
         File testProj1ServerDir = new File(rootGitDir, "testproj1");
         File testProj1ServerDir = new File(rootGitDir, "testproj1");
         File testProj2ServerDir = new File(rootGitDir, "testproj2");
         File testProj2ServerDir = new File(rootGitDir, "testproj2");
-        File testProj1Dir = cloneRepository("testproj1", 33874, dir);
+        File testProj1Dir = gitClone("testproj1", 33874, dir);
         assertTrue(testProj1ServerDir.exists());
         assertTrue(testProj1ServerDir.exists());
         assertFalse(testProj2ServerDir.exists());
         assertFalse(testProj2ServerDir.exists());
-        cloneRepository("testproj2", 33874, dir);
+        gitClone("testproj2", 33874, dir);
         while (testProj1ServerDir.exists());
         while (testProj1ServerDir.exists());
         assertFalse(testProj1ServerDir.exists());
         assertFalse(testProj1ServerDir.exists());
         assertTrue(testProj2ServerDir.exists());
         assertTrue(testProj2ServerDir.exists());
         FileUtils.deleteDirectory(testProj1Dir);
         FileUtils.deleteDirectory(testProj1Dir);
-        cloneRepository("testproj1", 33874, dir);
+        gitClone("testproj1", 33874, dir);
         while (testProj2ServerDir.exists());
         while (testProj2ServerDir.exists());
         assertTrue(testProj1ServerDir.exists());
         assertTrue(testProj1ServerDir.exists());
         assertFalse(testProj2ServerDir.exists());
         assertFalse(testProj2ServerDir.exists());
@@ -645,16 +677,15 @@ public class WLGitBridgeIntegrationTest {
                 makeConfigFile(33875, 3875)
                 makeConfigFile(33875, 3875)
         });
         });
         wlgb.run();
         wlgb.run();
-        File dir = folder.newFolder();
-        File testprojDir = cloneRepository("testproj", 33875, dir);
+        File testprojDir = gitClone("testproj", 33875, dir);
         runtime.exec("mkdir sub", null, testprojDir).waitFor();
         runtime.exec("mkdir sub", null, testprojDir).waitFor();
         File sub = new File(testprojDir, "sub");
         File sub = new File(testprojDir, "sub");
         runtime.exec("touch sub.txt", null, sub).waitFor();
         runtime.exec("touch sub.txt", null, sub).waitFor();
-        runtime.exec("git init", null, sub).waitFor();
-        runtime.exec("git add -A", null, sub).waitFor();
-        runtime.exec("git commit -m \"sub\"", null, sub).waitFor();
-        runtime.exec("git add -A", null, testprojDir).waitFor();
-        runtime.exec("git commit -m \"push\"", null, testprojDir).waitFor();
+        gitInit(sub);
+        gitAdd(sub);
+        gitCommit(sub, "sub");
+        gitAdd(testprojDir);
+        gitCommit(testprojDir, "push");
         Process gitPush = runtime.exec("git push -v --progress", null, testprojDir);
         Process gitPush = runtime.exec("git push -v --progress", null, testprojDir);
         int pushExitCode = gitPush.waitFor();
         int pushExitCode = gitPush.waitFor();
         wlgb.stop();
         wlgb.stop();
@@ -678,35 +709,6 @@ public class WLGitBridgeIntegrationTest {
         wlgb.stop();
         wlgb.stop();
     }
     }
 
 
-    private File cloneRepository(String repositoryName, int port, File dir) throws IOException, InterruptedException {
-        String repo = "git clone http://127.0.0.1:" + port + "/" + repositoryName + ".git";
-        Process gitProcess = runtime.exec(repo, null, dir);
-        int exitCode = gitProcess.waitFor();
-        if (exitCode != 0) {
-            System.err.println("git clone failed. Dumping stderr and stdout.");
-            System.err.println(
-                    IOUtils.toString(
-                            gitProcess.getErrorStream(),
-                            StandardCharsets.UTF_8
-                    )
-            );
-            System.err.println(
-                    IOUtils.toString(
-                            gitProcess.getInputStream(),
-                            StandardCharsets.UTF_8
-                    )
-            );
-            fail("git clone failed");
-        }
-        File repositoryDir = new File(dir, repositoryName);
-
-        assertEquals(0, runtime.exec("git config user.name TEST", null, repositoryDir).waitFor());
-        assertEquals(0, runtime.exec("git config user.email test@test.com", null, repositoryDir).waitFor());
-        assertEquals(0, runtime.exec("git config push.default matching", null, repositoryDir).waitFor());
-
-        return repositoryDir;
-    }
-
     private String makeConfigFile(
     private String makeConfigFile(
             int port,
             int port,
             int apiPort
             int apiPort