Sfoglia il codice sorgente

Merge pull request #34467 from overleaf/dp-git-bridge-dynamic-port

[git-bridge] Bind integration test server to a dynamic port

GitOrigin-RevId: 12b570dbb4bc092c05e864c28ff554d672084804
David 4 mesi fa
parent
commit
bfc46c4591

+ 4 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/GitBridgeApp.java

@@ -65,6 +65,10 @@ public class GitBridgeApp implements Runnable {
     server.stop();
     server.stop();
   }
   }
 
 
+  public int getPort() {
+    return server.getPort();
+  }
+
   /* Helper methods */
   /* Helper methods */
 
 
   private void parseArguments(String[] args) throws ArgsException {
   private void parseArguments(String[] args) throws ArgsException {

+ 18 - 2
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java

@@ -48,12 +48,16 @@ public class GitBridgeServer {
 
 
   private final GceMetadataLogLevelChecker logLevelChecker;
   private final GceMetadataLogLevelChecker logLevelChecker;
 
 
+  private ServerConnector connector;
+
   private final int port;
   private final int port;
+  private final String bindIp;
   private String rootGitDirectoryPath;
   private String rootGitDirectoryPath;
   private String apiBaseURL;
   private String apiBaseURL;
 
 
   public GitBridgeServer(Config config) throws ServletException {
   public GitBridgeServer(Config config) throws ServletException {
     this.port = config.getPort();
     this.port = config.getPort();
+    this.bindIp = config.getBindIp();
     this.rootGitDirectoryPath = config.getRootGitDirectory();
     this.rootGitDirectoryPath = config.getRootGitDirectory();
     RepoStore repoStore =
     RepoStore repoStore =
         new FSGitRepoStore(
         new FSGitRepoStore(
@@ -89,10 +93,18 @@ public class GitBridgeServer {
     try {
     try {
       bridge.checkDB();
       bridge.checkDB();
       jettyServer.start();
       jettyServer.start();
+      // Only the integration tests configure port 0, which lets the OS assign a free
+      // port at bind time. Production always configures an explicit non-zero port, so
+      // this branch never runs there.
+      if (port == 0) {
+        int actualPort = connector.getLocalPort();
+        String postbackURL = "http://" + bindIp + ":" + actualPort + "/";
+        Util.setPostbackURL(postbackURL);
+      }
       bridge.startBackgroundJobs();
       bridge.startBackgroundJobs();
       logLevelChecker.start();
       logLevelChecker.start();
       Log.info(Util.getServiceName() + "-Git Bridge server started");
       Log.info(Util.getServiceName() + "-Git Bridge server started");
-      Log.info("Listening on port: " + port);
+      Log.info("Listening on port: " + getPort());
       Log.info("Bridged to: " + apiBaseURL);
       Log.info("Bridged to: " + apiBaseURL);
       Log.info("Postback base URL: " + Util.getPostbackURL());
       Log.info("Postback base URL: " + Util.getPostbackURL());
       Log.info("Root git directory path: " + rootGitDirectoryPath);
       Log.info("Root git directory path: " + rootGitDirectoryPath);
@@ -103,6 +115,10 @@ public class GitBridgeServer {
     }
     }
   }
   }
 
 
+  public int getPort() {
+    return connector.getLocalPort();
+  }
+
   public void stop() {
   public void stop() {
     logLevelChecker.stop();
     logLevelChecker.stop();
     try {
     try {
@@ -114,7 +130,7 @@ public class GitBridgeServer {
 
 
   private void configureJettyServer(Config config, RepoStore repoStore, SnapshotApi snapshotApi)
   private void configureJettyServer(Config config, RepoStore repoStore, SnapshotApi snapshotApi)
       throws ServletException {
       throws ServletException {
-    ServerConnector connector = new ServerConnector(this.jettyServer);
+    this.connector = new ServerConnector(this.jettyServer);
     connector.setPort(config.getPort());
     connector.setPort(config.getPort());
     connector.setHost(config.getBindIp());
     connector.setHost(config.getBindIp());
     connector.setIdleTimeout(config.getIdleTimeout());
     connector.setIdleTimeout(config.getIdleTimeout());

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

@@ -527,9 +527,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3857, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(3857, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33857, 3857)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3857)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33857, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canCloneARepository/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canCloneARepository/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -541,10 +541,10 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3858, getResource("/canCloneMultipleRepositories").toFile());
     server = new MockSnapshotServer(3858, getResource("/canCloneMultipleRepositories").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneMultipleRepositories").get("state"));
     server.setState(states.get("canCloneMultipleRepositories").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33858, 3858)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3858)});
     wlgb.run();
     wlgb.run();
-    File testproj1Dir = gitClone(PROJECT_ID1, 33858, dir);
-    File testproj2Dir = gitClone(PROJECT_ID2, 33858, dir);
+    File testproj1Dir = gitClone(PROJECT_ID1, wlgb.getPort(), dir);
+    File testproj2Dir = gitClone(PROJECT_ID2, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canCloneMultipleRepositories/state/" + PROJECT_ID1),
             getResource("/canCloneMultipleRepositories/state/" + PROJECT_ID1),
@@ -560,9 +560,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3859, getResource("/canPullAModifiedTexFile").toFile());
     server = new MockSnapshotServer(3859, getResource("/canPullAModifiedTexFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullAModifiedTexFile").get("base"));
     server.setState(states.get("canPullAModifiedTexFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33859, 3859)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3859)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33859, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullAModifiedTexFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullAModifiedTexFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -579,9 +579,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3860, getResource("/canPullADeletedTexFile").toFile());
     server = new MockSnapshotServer(3860, getResource("/canPullADeletedTexFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullADeletedTexFile").get("base"));
     server.setState(states.get("canPullADeletedTexFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33860, 3860)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3860)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33860, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullADeletedTexFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullADeletedTexFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -599,9 +599,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3862, getResource("/canPullAModifiedBinaryFile").toFile());
     server = new MockSnapshotServer(3862, getResource("/canPullAModifiedBinaryFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullAModifiedBinaryFile").get("base"));
     server.setState(states.get("canPullAModifiedBinaryFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33862, 3862)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3862)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33862, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullAModifiedBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullAModifiedBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -619,9 +619,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3863, getResource("/canPullADeletedBinaryFile").toFile());
     server = new MockSnapshotServer(3863, getResource("/canPullADeletedBinaryFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullADeletedBinaryFile").get("base"));
     server.setState(states.get("canPullADeletedBinaryFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33863, 3863)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3863)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33863, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullADeletedBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullADeletedBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -639,9 +639,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(4001, getResource("/canPullADuplicateBinaryFile").toFile());
     server = new MockSnapshotServer(4001, getResource("/canPullADuplicateBinaryFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullADuplicateBinaryFile").get("base"));
     server.setState(states.get("canPullADuplicateBinaryFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(44001, 4001)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 4001)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 44001, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullADuplicateBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullADuplicateBinaryFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -659,9 +659,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(4002, getResource("/canCloneDuplicateBinaryFiles").toFile());
     server = new MockSnapshotServer(4002, getResource("/canCloneDuplicateBinaryFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneDuplicateBinaryFiles").get("state"));
     server.setState(states.get("canCloneDuplicateBinaryFiles").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(44002, 4002)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 4002)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 44002, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canCloneDuplicateBinaryFiles/state/" + PROJECT_ID),
             getResource("/canCloneDuplicateBinaryFiles/state/" + PROJECT_ID),
@@ -674,9 +674,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(4003, getResource("/canPullUpdatedBinaryFiles").toFile());
     server = new MockSnapshotServer(4003, getResource("/canPullUpdatedBinaryFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullUpdatedBinaryFiles").get("base"));
     server.setState(states.get("canPullUpdatedBinaryFiles").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(44003, 4003)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 4003)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 44003, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullUpdatedBinaryFiles/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullUpdatedBinaryFiles/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -694,9 +694,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3864, getResource("/canPullAModifiedNestedFile").toFile());
     server = new MockSnapshotServer(3864, getResource("/canPullAModifiedNestedFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullAModifiedNestedFile").get("base"));
     server.setState(states.get("canPullAModifiedNestedFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33864, 3864)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3864)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33864, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullAModifiedNestedFile/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullAModifiedNestedFile/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -714,9 +714,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3865, getResource("/canPullDeletedNestedFiles").toFile());
     server = new MockSnapshotServer(3865, getResource("/canPullDeletedNestedFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullDeletedNestedFiles").get("base"));
     server.setState(states.get("canPullDeletedNestedFiles").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33865, 3865)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3865)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33865, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPullDeletedNestedFiles/base/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPullDeletedNestedFiles/base/" + PROJECT_ID), testprojDir.toPath()));
@@ -732,10 +732,10 @@ public class WLGitBridgeIntegrationTest {
   public void canPushFilesSuccessfully() throws IOException, GitAPIException, InterruptedException {
   public void canPushFilesSuccessfully() throws IOException, GitAPIException, InterruptedException {
     server = new MockSnapshotServer(3866, getResource("/canPushFilesSuccessfully").toFile());
     server = new MockSnapshotServer(3866, getResource("/canPushFilesSuccessfully").toFile());
     server.start();
     server.start();
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33866, 3866)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3866)});
     wlgb.run();
     wlgb.run();
     server.setState(states.get("canPushFilesSuccessfully").get("state"));
     server.setState(states.get("canPushFilesSuccessfully").get("state"));
-    File testprojDir = gitClone(PROJECT_ID, 33866, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canPushFilesSuccessfully/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canPushFilesSuccessfully/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -745,14 +745,19 @@ public class WLGitBridgeIntegrationTest {
     gitPush(testprojDir);
     gitPush(testprojDir);
   }
   }
 
 
-  private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST =
-      "error: failed to push some refs to 'http://127.0.0.1:33867/"
-          + PROJECT_ID
-          + "'\n"
-          + "hint: Updates were rejected because the tip of your current branch is behind\n"
-          + "hint: its remote counterpart. If you want to integrate the remote changes,\n"
-          + "hint: use 'git pull' before pushing again.\n"
-          + "hint: See the 'Note about fast-forwards' in 'git push --help' for details.\n";
+  private static String gitRemoteUrl(int port) {
+    return "http://127.0.0.1:" + port + "/" + PROJECT_ID;
+  }
+
+  private static String expectedPushOutOfDate(int port) {
+    return "error: failed to push some refs to '"
+        + gitRemoteUrl(port)
+        + "'\n"
+        + "hint: Updates were rejected because the tip of your current branch is behind\n"
+        + "hint: its remote counterpart. If you want to integrate the remote changes,\n"
+        + "hint: use 'git pull' before pushing again.\n"
+        + "hint: See the 'Note about fast-forwards' in 'git push --help' for details.\n";
+  }
 
 
   @Test
   @Test
   public void pushFailsOnFirstStageOutOfDate()
   public void pushFailsOnFirstStageOutOfDate()
@@ -760,9 +765,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3867, getResource("/pushFailsOnFirstStageOutOfDate").toFile());
     server = new MockSnapshotServer(3867, getResource("/pushFailsOnFirstStageOutOfDate").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushFailsOnFirstStageOutOfDate").get("state"));
     server.setState(states.get("pushFailsOnFirstStageOutOfDate").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33867, 3867)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3867)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33867, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/pushFailsOnFirstStageOutOfDate/state/" + PROJECT_ID),
             getResource("/pushFailsOnFirstStageOutOfDate/state/" + PROJECT_ID),
@@ -771,27 +776,18 @@ public class WLGitBridgeIntegrationTest {
     gitAdd(testprojDir);
     gitAdd(testprojDir);
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
-    assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_FIRST, Util.fromStream(push.getErrorStream(), 2));
+    assertEquals(expectedPushOutOfDate(wlgb.getPort()), Util.fromStream(push.getErrorStream(), 2));
   }
   }
 
 
-  private static final String EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND =
-      "error: failed to push some refs to 'http://127.0.0.1:33868/"
-          + PROJECT_ID
-          + "'\n"
-          + "hint: Updates were rejected because the tip of your current branch is behind\n"
-          + "hint: its remote counterpart. If you want to integrate the remote changes,\n"
-          + "hint: use 'git pull' before pushing again.\n"
-          + "hint: See the 'Note about fast-forwards' in 'git push --help' for details.\n";
-
   @Test
   @Test
   public void pushFailsOnSecondStageOutOfDate()
   public void pushFailsOnSecondStageOutOfDate()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
     server = new MockSnapshotServer(3868, getResource("/pushFailsOnSecondStageOutOfDate").toFile());
     server = new MockSnapshotServer(3868, getResource("/pushFailsOnSecondStageOutOfDate").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushFailsOnSecondStageOutOfDate").get("state"));
     server.setState(states.get("pushFailsOnSecondStageOutOfDate").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33868, 3868)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3868)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33868, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/pushFailsOnSecondStageOutOfDate/state/" + PROJECT_ID),
             getResource("/pushFailsOnSecondStageOutOfDate/state/" + PROJECT_ID),
@@ -800,28 +796,29 @@ public class WLGitBridgeIntegrationTest {
     gitAdd(testprojDir);
     gitAdd(testprojDir);
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
-    assertEquals(EXPECTED_OUT_PUSH_OUT_OF_DATE_SECOND, Util.fromStream(push.getErrorStream(), 2));
+    assertEquals(expectedPushOutOfDate(wlgb.getPort()), Util.fromStream(push.getErrorStream(), 2));
   }
   }
 
 
-  private static final List<String> EXPECTED_OUT_PUSH_INVALID_FILES =
-      Arrays.asList(
-          "remote: hint: You have 4 invalid files in your Overleaf project:",
-          "remote: hint: file1.invalid (error)",
-          "remote: hint: file2.exe (invalid file extension)",
-          "remote: hint: hello world.png (rename to: hello_world.png)",
-          "remote: hint: an image.jpg (rename to: an_image.jpg)",
-          "To http://127.0.0.1:33869/" + PROJECT_ID,
-          "! [remote rejected] master -> master (invalid files)",
-          "error: failed to push some refs to 'http://127.0.0.1:33869/" + PROJECT_ID + "'");
+  private static List<String> expectedPushInvalidFiles(int port) {
+    return Arrays.asList(
+        "remote: hint: You have 4 invalid files in your Overleaf project:",
+        "remote: hint: file1.invalid (error)",
+        "remote: hint: file2.exe (invalid file extension)",
+        "remote: hint: hello world.png (rename to: hello_world.png)",
+        "remote: hint: an image.jpg (rename to: an_image.jpg)",
+        "To " + gitRemoteUrl(port),
+        "! [remote rejected] master -> master (invalid files)",
+        "error: failed to push some refs to '" + gitRemoteUrl(port) + "'");
+  }
 
 
   @Test
   @Test
   public void pushFailsOnInvalidFiles() throws IOException, GitAPIException, InterruptedException {
   public void pushFailsOnInvalidFiles() throws IOException, GitAPIException, InterruptedException {
     server = new MockSnapshotServer(3869, getResource("/pushFailsOnInvalidFiles").toFile());
     server = new MockSnapshotServer(3869, getResource("/pushFailsOnInvalidFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushFailsOnInvalidFiles").get("state"));
     server.setState(states.get("pushFailsOnInvalidFiles").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33869, 3869)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3869)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33869, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/pushFailsOnInvalidFiles/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/pushFailsOnInvalidFiles/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -830,16 +827,17 @@ public class WLGitBridgeIntegrationTest {
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
-    assertEquals(EXPECTED_OUT_PUSH_INVALID_FILES, actual);
+    assertEquals(expectedPushInvalidFiles(wlgb.getPort()), actual);
   }
   }
 
 
-  private static final List<String> EXPECTED_OUT_PUSH_INVALID_PROJECT =
-      Arrays.asList(
-          "remote: hint: project: no main file",
-          "remote: hint: The project would have no (editable) main .tex file.",
-          "To http://127.0.0.1:33870/" + PROJECT_ID,
-          "! [remote rejected] master -> master (invalid project)",
-          "error: failed to push some refs to 'http://127.0.0.1:33870/" + PROJECT_ID + "'");
+  private static List<String> expectedPushInvalidProject(int port) {
+    return Arrays.asList(
+        "remote: hint: project: no main file",
+        "remote: hint: The project would have no (editable) main .tex file.",
+        "To " + gitRemoteUrl(port),
+        "! [remote rejected] master -> master (invalid project)",
+        "error: failed to push some refs to '" + gitRemoteUrl(port) + "'");
+  }
 
 
   @Test
   @Test
   public void pushFailsOnInvalidProject()
   public void pushFailsOnInvalidProject()
@@ -847,9 +845,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3870, getResource("/pushFailsOnInvalidProject").toFile());
     server = new MockSnapshotServer(3870, getResource("/pushFailsOnInvalidProject").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushFailsOnInvalidProject").get("state"));
     server.setState(states.get("pushFailsOnInvalidProject").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33870, 3870)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3870)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33870, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/pushFailsOnInvalidProject/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/pushFailsOnInvalidProject/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -858,16 +856,17 @@ public class WLGitBridgeIntegrationTest {
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
-    assertEquals(EXPECTED_OUT_PUSH_INVALID_PROJECT, actual);
+    assertEquals(expectedPushInvalidProject(wlgb.getPort()), actual);
   }
   }
 
 
-  private static final List<String> EXPECTED_OUT_PUSH_UNEXPECTED_ERROR =
-      Arrays.asList(
-          "remote: hint: There was an internal error with the Overleaf server.",
-          "remote: hint: Please contact Overleaf.",
-          "To http://127.0.0.1:33871/" + PROJECT_ID,
-          "! [remote rejected] master -> master (Overleaf error)",
-          "error: failed to push some refs to 'http://127.0.0.1:33871/" + PROJECT_ID + "'");
+  private static List<String> expectedPushUnexpectedError(int port) {
+    return Arrays.asList(
+        "remote: hint: There was an internal error with the Overleaf server.",
+        "remote: hint: Please contact Overleaf.",
+        "To " + gitRemoteUrl(port),
+        "! [remote rejected] master -> master (Overleaf error)",
+        "error: failed to push some refs to '" + gitRemoteUrl(port) + "'");
+  }
 
 
   /* this one prints a stack trace */
   /* this one prints a stack trace */
   @Test
   @Test
@@ -876,9 +875,9 @@ public class WLGitBridgeIntegrationTest {
     server = new MockSnapshotServer(3871, getResource("/pushFailsOnUnexpectedError").toFile());
     server = new MockSnapshotServer(3871, getResource("/pushFailsOnUnexpectedError").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushFailsOnUnexpectedError").get("state"));
     server.setState(states.get("pushFailsOnUnexpectedError").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33871, 3871)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3871)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33871, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/pushFailsOnUnexpectedError/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/pushFailsOnUnexpectedError/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -887,18 +886,19 @@ public class WLGitBridgeIntegrationTest {
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
-    assertEquals(EXPECTED_OUT_PUSH_UNEXPECTED_ERROR, actual);
+    assertEquals(expectedPushUnexpectedError(wlgb.getPort()), actual);
   }
   }
 
 
-  private static final List<String> EXPECTED_OUT_PUSH_INVALID_EXE_FILE =
-      Arrays.asList(
-          "remote: error: invalid files",
-          "remote:",
-          "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/" + PROJECT_ID,
-          "! [remote rejected] master -> master (invalid files)",
-          "error: failed to push some refs to 'http://127.0.0.1:33872/" + PROJECT_ID + "'");
+  private static List<String> expectedPushInvalidExeFile(int port) {
+    return Arrays.asList(
+        "remote: error: invalid files",
+        "remote:",
+        "remote: hint: You have 1 invalid files in your Overleaf project:",
+        "remote: hint: file1.exe (invalid file extension)",
+        "To " + gitRemoteUrl(port),
+        "! [remote rejected] master -> master (invalid files)",
+        "error: failed to push some refs to '" + gitRemoteUrl(port) + "'");
+  }
 
 
   @Test
   @Test
   public void pushSucceedsAfterRemovingInvalidFiles()
   public void pushSucceedsAfterRemovingInvalidFiles()
@@ -908,9 +908,9 @@ public class WLGitBridgeIntegrationTest {
             3872, getResource("/pushSucceedsAfterRemovingInvalidFiles").toFile());
             3872, getResource("/pushSucceedsAfterRemovingInvalidFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("invalidState"));
     server.setState(states.get("pushSucceedsAfterRemovingInvalidFiles").get("invalidState"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33872, 3872)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3872)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33872, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
 
 
     // try to push invalid file; it should fail
     // try to push invalid file; it should fail
     assertTrue(
     assertTrue(
@@ -922,7 +922,7 @@ public class WLGitBridgeIntegrationTest {
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 0, "[K");
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 0, "[K");
-    assertEquals(EXPECTED_OUT_PUSH_INVALID_EXE_FILE, actual);
+    assertEquals(expectedPushInvalidExeFile(wlgb.getPort()), 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());
@@ -945,17 +945,16 @@ public class WLGitBridgeIntegrationTest {
     // us to fetch any more. We can however test the access and error conditions, which comprise
     // us to fetch any more. We can however test the access and error conditions, which comprise
     // most of the logic.
     // most of the logic.
     //
     //
-    int gitBridgePort = 33873;
     int mockServerPort = 3873;
     int mockServerPort = 3873;
 
 
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canServePushedFiles").get("state"));
     server.setState(states.get("canServePushedFiles").get("state"));
 
 
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
 
 
-    File testprojDir = gitClone(PROJECT_ID, gitBridgePort, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canServePushedFiles/state/" + PROJECT_ID), testprojDir.toPath()));
             getResource("/canServePushedFiles/state/" + PROJECT_ID), testprojDir.toPath()));
@@ -965,22 +964,22 @@ public class WLGitBridgeIntegrationTest {
     gitPush(testprojDir);
     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:" + wlgb.getPort() + "/api/testproj/push.tex";
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(404, response.getStatusCode());
     assertEquals(404, response.getStatusCode());
 
 
     // With an invalid project and no key, we should get a 404.
     // With an invalid project and no key, we should get a 404.
-    url = "http://127.0.0.1:" + gitBridgePort + "/api/notavalidproject/push.tex";
+    url = "http://127.0.0.1:" + wlgb.getPort() + "/api/notavalidproject/push.tex";
     response = asyncHttpClient().prepareGet(url).execute().get();
     response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(404, response.getStatusCode());
     assertEquals(404, response.getStatusCode());
 
 
     // With a bad key for a valid project, we should get a 404.
     // With a bad key for a valid project, we should get a 404.
-    url = "http://127.0.0.1:" + gitBridgePort + "/api/testproj/push.tex?key=notavalidkey";
+    url = "http://127.0.0.1:" + wlgb.getPort() + "/api/testproj/push.tex?key=notavalidkey";
     response = asyncHttpClient().prepareGet(url).execute().get();
     response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(404, response.getStatusCode());
     assertEquals(404, response.getStatusCode());
 
 
     // With a bad key for an invalid project, we should get a 404.
     // With a bad key for an invalid project, we should get a 404.
-    url = "http://127.0.0.1:" + gitBridgePort + "/api/notavalidproject/push.tex?key=notavalidkey";
+    url = "http://127.0.0.1:" + wlgb.getPort() + "/api/notavalidproject/push.tex?key=notavalidkey";
     response = asyncHttpClient().prepareGet(url).execute().get();
     response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(404, response.getStatusCode());
     assertEquals(404, response.getStatusCode());
   }
   }
@@ -992,37 +991,36 @@ public class WLGitBridgeIntegrationTest {
     server.setState(states.get("wlgbCanSwapProjects").get("state"));
     server.setState(states.get("wlgbCanSwapProjects").get("state"));
     wlgb =
     wlgb =
         new GitBridgeApp(
         new GitBridgeApp(
-            new String[] {
-              makeConfigFile(33874, 3874, new SwapJobConfig(1, 0, 0, 250, null, true))
-            });
+            new String[] {makeConfigFile(0, 3874, new SwapJobConfig(1, 0, 0, 250, null, true))});
     wlgb.run();
     wlgb.run();
     File rootGitDir = new File(wlgb.config.getRootGitDirectory());
     File rootGitDir = new File(wlgb.config.getRootGitDirectory());
     File testProj1ServerDir = new File(rootGitDir, PROJECT_ID1);
     File testProj1ServerDir = new File(rootGitDir, PROJECT_ID1);
     File testProj2ServerDir = new File(rootGitDir, PROJECT_ID2);
     File testProj2ServerDir = new File(rootGitDir, PROJECT_ID2);
-    File testProj1Dir = gitClone(PROJECT_ID1, 33874, dir);
+    File testProj1Dir = gitClone(PROJECT_ID1, wlgb.getPort(), dir);
     assertTrue(testProj1ServerDir.exists());
     assertTrue(testProj1ServerDir.exists());
     assertFalse(testProj2ServerDir.exists());
     assertFalse(testProj2ServerDir.exists());
-    gitClone(PROJECT_ID2, 33874, dir);
+    gitClone(PROJECT_ID2, wlgb.getPort(), 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);
-    gitClone(PROJECT_ID1, 33874, dir);
+    gitClone(PROJECT_ID1, wlgb.getPort(), dir);
     while (testProj2ServerDir.exists())
     while (testProj2ServerDir.exists())
       ;
       ;
     assertTrue(testProj1ServerDir.exists());
     assertTrue(testProj1ServerDir.exists());
     assertFalse(testProj2ServerDir.exists());
     assertFalse(testProj2ServerDir.exists());
   }
   }
 
 
-  private static final List<String> EXPECTED_OUT_PUSH_SUBMODULE =
-      Arrays.asList(
-          "remote: hint: Your Git repository contains a reference we cannot resolve.",
-          "remote: hint: If your project contains a Git submodule,",
-          "remote: hint: please remove it and try again.",
-          "To http://127.0.0.1:33875/" + PROJECT_ID,
-          "! [remote rejected] master -> master (invalid git repo)",
-          "error: failed to push some refs to 'http://127.0.0.1:33875/" + PROJECT_ID + "'");
+  private static List<String> expectedPushSubmodule(int port) {
+    return Arrays.asList(
+        "remote: hint: Your Git repository contains a reference we cannot resolve.",
+        "remote: hint: If your project contains a Git submodule,",
+        "remote: hint: please remove it and try again.",
+        "To " + gitRemoteUrl(port),
+        "! [remote rejected] master -> master (invalid git repo)",
+        "error: failed to push some refs to '" + gitRemoteUrl(port) + "'");
+  }
 
 
   @Test
   @Test
   public void pushSubmoduleFailsWithInvalidGitRepo()
   public void pushSubmoduleFailsWithInvalidGitRepo()
@@ -1031,9 +1029,9 @@ public class WLGitBridgeIntegrationTest {
         new MockSnapshotServer(3875, getResource("/pushSubmoduleFailsWithInvalidGitRepo").toFile());
         new MockSnapshotServer(3875, getResource("/pushSubmoduleFailsWithInvalidGitRepo").toFile());
     server.start();
     server.start();
     server.setState(states.get("pushSubmoduleFailsWithInvalidGitRepo").get("state"));
     server.setState(states.get("pushSubmoduleFailsWithInvalidGitRepo").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(33875, 3875)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, 3875)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, 33875, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), 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();
@@ -1044,26 +1042,25 @@ public class WLGitBridgeIntegrationTest {
     gitCommit(testprojDir, "push");
     gitCommit(testprojDir, "push");
     Process push = gitPush(testprojDir, 1);
     Process push = gitPush(testprojDir, 1);
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
     List<String> actual = Util.linesFromStream(push.getErrorStream(), 2, "[K");
-    assertEquals(EXPECTED_OUT_PUSH_SUBMODULE, actual);
+    assertEquals(expectedPushSubmodule(wlgb.getPort()), actual);
   }
   }
 
 
   @Test
   @Test
   public void usesCustomErrorHandler()
   public void usesCustomErrorHandler()
       throws IOException, ExecutionException, InterruptedException {
       throws IOException, ExecutionException, InterruptedException {
 
 
-    int gitBridgePort = 33873;
     int mockServerPort = 3873;
     int mockServerPort = 3873;
 
 
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canServePushedFiles").get("state"));
     server.setState(states.get("canServePushedFiles").get("state"));
 
 
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
 
 
     // With an invalid project and no key, we should get a 404,
     // With an invalid project and no key, we should get a 404,
     // which is rendered by our custom error handler.
     // which is rendered by our custom error handler.
-    String url = "http://127.0.0.1:" + gitBridgePort + "/api/notavalidproject/main.tex";
+    String url = "http://127.0.0.1:" + wlgb.getPort() + "/api/notavalidproject/main.tex";
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(404, response.getStatusCode());
     assertEquals(404, response.getStatusCode());
     assertEquals("{\"message\":\"HTTP error 404\"}", response.getResponseBody());
     assertEquals("{\"message\":\"HTTP error 404\"}", response.getResponseBody());
@@ -1071,7 +1068,7 @@ public class WLGitBridgeIntegrationTest {
     // With an unsupported URL outside the api, the request is assumed to
     // With an unsupported URL outside the api, the request is assumed to
     // be from a git client and we should get a 401 because the request
     // be from a git client and we should get a 401 because the request
     // does not include basic auth credentials.
     // does not include basic auth credentials.
-    url = "http://127.0.0.1:" + gitBridgePort + "/foo";
+    url = "http://127.0.0.1:" + wlgb.getPort() + "/foo";
     response = asyncHttpClient().prepareGet(url).execute().get();
     response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(401, response.getStatusCode());
     assertEquals(401, response.getStatusCode());
   }
   }
@@ -1079,7 +1076,6 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void cannotCloneAProtectedProjectWithoutAuthentication()
   public void cannotCloneAProtectedProjectWithoutAuthentication()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33883;
     int mockServerPort = 3883;
     int mockServerPort = 3883;
 
 
     server =
     server =
@@ -1088,12 +1084,12 @@ public class WLGitBridgeIntegrationTest {
             getResource("/cannotCloneAProtectedProjectWithoutAuthentication").toFile());
             getResource("/cannotCloneAProtectedProjectWithoutAuthentication").toFile());
     server.start();
     server.start();
     server.setState(states.get("cannotCloneAProtectedProjectWithoutAuthentication").get("state"));
     server.setState(states.get("cannotCloneAProtectedProjectWithoutAuthentication").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
 
 
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/" + PROJECT_ID,
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/" + PROJECT_ID,
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1101,19 +1097,18 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void cannotCloneA4xxProject() throws IOException, GitAPIException, InterruptedException {
   public void cannotCloneA4xxProject() throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33879;
     int mockServerPort = 3879;
     int mockServerPort = 3879;
 
 
     server =
     server =
         new MockSnapshotServer(mockServerPort, getResource("/cannotCloneA4xxProject").toFile());
         new MockSnapshotServer(mockServerPort, getResource("/cannotCloneA4xxProject").toFile());
     server.start();
     server.start();
     server.setState(states.get("cannotCloneA4xxProject").get("state"));
     server.setState(states.get("cannotCloneA4xxProject").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
 
 
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/" + PROJECT_ID,
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/" + PROJECT_ID,
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1122,19 +1117,18 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void cannotCloneAMissingProject()
   public void cannotCloneAMissingProject()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33880;
     int mockServerPort = 3880;
     int mockServerPort = 3880;
 
 
     server =
     server =
         new MockSnapshotServer(mockServerPort, getResource("/cannotCloneAMissingProject").toFile());
         new MockSnapshotServer(mockServerPort, getResource("/cannotCloneAMissingProject").toFile());
     server.start();
     server.start();
     server.setState(states.get("cannotCloneAMissingProject").get("state"));
     server.setState(states.get("cannotCloneAMissingProject").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
 
 
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/" + PROJECT_ID,
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/" + PROJECT_ID,
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1142,15 +1136,14 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void canMigrateRepository() throws IOException, GitAPIException, InterruptedException {
   public void canMigrateRepository() throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33881;
     int mockServerPort = 3881;
     int mockServerPort = 3881;
     server = new MockSnapshotServer(mockServerPort, getResource("/canMigrateRepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canMigrateRepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canMigrateRepository").get("state"));
     server.setState(states.get("canMigrateRepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, gitBridgePort, dir);
-    File testprojDir2 = gitClone(PROJECT_ID2, gitBridgePort, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
+    File testprojDir2 = gitClone(PROJECT_ID2, wlgb.getPort(), dir);
     // Second project content is equal to content of the first
     // Second project content is equal to content of the first
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
@@ -1160,17 +1153,16 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void skipMigrationWhenMigratedFromMissing()
   public void skipMigrationWhenMigratedFromMissing()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33882;
     int mockServerPort = 3882;
     int mockServerPort = 3882;
     server =
     server =
         new MockSnapshotServer(
         new MockSnapshotServer(
             mockServerPort, getResource("/skipMigrationWhenMigratedFromMissing").toFile());
             mockServerPort, getResource("/skipMigrationWhenMigratedFromMissing").toFile());
     server.start();
     server.start();
     server.setState(states.get("skipMigrationWhenMigratedFromMissing").get("state"));
     server.setState(states.get("skipMigrationWhenMigratedFromMissing").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     // don't clone the source project first
     // don't clone the source project first
-    File testprojDir2 = gitClone(PROJECT_ID2, gitBridgePort, dir);
+    File testprojDir2 = gitClone(PROJECT_ID2, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/skipMigrationWhenMigratedFromMissing/state/" + PROJECT_ID2),
             getResource("/skipMigrationWhenMigratedFromMissing/state/" + PROJECT_ID2),
@@ -1180,16 +1172,15 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void canCloneAMigratedRepositoryWithoutChanges()
   public void canCloneAMigratedRepositoryWithoutChanges()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33883;
     int mockServerPort = 3883;
     int mockServerPort = 3883;
     server =
     server =
         new MockSnapshotServer(
         new MockSnapshotServer(
             mockServerPort, getResource("/canCloneAMigratedRepositoryWithoutChanges").toFile());
             mockServerPort, getResource("/canCloneAMigratedRepositoryWithoutChanges").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneAMigratedRepositoryWithoutChanges").get("state"));
     server.setState(states.get("canCloneAMigratedRepositoryWithoutChanges").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
-    File testprojDir = gitClone(PROJECT_ID, gitBridgePort, dir);
+    File testprojDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     assertTrue(
     assertTrue(
         FileUtil.gitDirectoriesAreEqual(
         FileUtil.gitDirectoriesAreEqual(
             getResource("/canCloneAMigratedRepositoryWithoutChanges/state/" + PROJECT_ID),
             getResource("/canCloneAMigratedRepositoryWithoutChanges/state/" + PROJECT_ID),
@@ -1198,16 +1189,15 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void rejectV1Repository() throws IOException, GitAPIException, InterruptedException {
   public void rejectV1Repository() throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33884;
     int mockServerPort = 3884;
     int mockServerPort = 3884;
     server = new MockSnapshotServer(mockServerPort, getResource("/rejectV1Repository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/rejectV1Repository").toFile());
     server.start();
     server.start();
     server.setState(states.get("rejectV1Repository").get("state"));
     server.setState(states.get("rejectV1Repository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/1234bbccddff.git",
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/1234bbccddff.git",
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1216,7 +1206,6 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void cannotCloneAHasDotGitProject()
   public void cannotCloneAHasDotGitProject()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33885;
     int mockServerPort = 3885;
     int mockServerPort = 3885;
 
 
     server =
     server =
@@ -1224,12 +1213,12 @@ public class WLGitBridgeIntegrationTest {
             mockServerPort, getResource("/cannotCloneAHasDotGitProject").toFile());
             mockServerPort, getResource("/cannotCloneAHasDotGitProject").toFile());
     server.start();
     server.start();
     server.setState(states.get("cannotCloneAHasDotGitProject").get("state"));
     server.setState(states.get("cannotCloneAHasDotGitProject").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
 
 
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/conflict.git",
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/conflict.git",
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1239,18 +1228,17 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void cannotCloneProjectWithSlash()
   public void cannotCloneProjectWithSlash()
       throws IOException, GitAPIException, InterruptedException {
       throws IOException, GitAPIException, InterruptedException {
-    int gitBridgePort = 33886;
     int mockServerPort = 3886;
     int mockServerPort = 3886;
 
 
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
 
 
     wlgb.run();
     wlgb.run();
     Process gitProcess =
     Process gitProcess =
         runtime.exec(
         runtime.exec(
-            "git clone http://git:password@127.0.0.1:" + gitBridgePort + "/project/1234abcd",
+            "git clone http://git:password@127.0.0.1:" + wlgb.getPort() + "/project/1234abcd",
             null,
             null,
             dir);
             dir);
     assertNotEquals(0, gitProcess.waitFor());
     assertNotEquals(0, gitProcess.waitFor());
@@ -1260,7 +1248,9 @@ public class WLGitBridgeIntegrationTest {
         Arrays.asList(
         Arrays.asList(
             "Cloning into '1234abcd'...",
             "Cloning into '1234abcd'...",
             "remote: Invalid Project ID (must not have a '/project' prefix)",
             "remote: Invalid Project ID (must not have a '/project' prefix)",
-            "fatal: repository 'http://127.0.0.1:33886/project/1234abcd/' not found"),
+            "fatal: repository 'http://127.0.0.1:"
+                + wlgb.getPort()
+                + "/project/1234abcd/' not found"),
         actual);
         actual);
 
 
     wlgb.stop();
     wlgb.stop();
@@ -1268,15 +1258,14 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void testStatusAndHealthCheckEndpoints() throws ClientProtocolException, IOException {
   public void testStatusAndHealthCheckEndpoints() throws ClientProtocolException, IOException {
-    int gitBridgePort = 33887;
     int mockServerPort = 3887;
     int mockServerPort = 3887;
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     HttpClient client = HttpClients.createDefault();
     HttpClient client = HttpClients.createDefault();
-    String urlBase = "http://127.0.0.1:" + gitBridgePort;
+    String urlBase = "http://127.0.0.1:" + wlgb.getPort();
     // Status
     // Status
     HttpGet statusRequest = new HttpGet(urlBase + "/status");
     HttpGet statusRequest = new HttpGet(urlBase + "/status");
     HttpResponse statusResponse = client.execute(statusRequest);
     HttpResponse statusResponse = client.execute(statusRequest);
@@ -1290,15 +1279,14 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void testStatusAndHealthCheckEndpointsWithTrailingSlash()
   public void testStatusAndHealthCheckEndpointsWithTrailingSlash()
       throws ClientProtocolException, IOException {
       throws ClientProtocolException, IOException {
-    int gitBridgePort = 33888;
     int mockServerPort = 3888;
     int mockServerPort = 3888;
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     HttpClient client = HttpClients.createDefault();
     HttpClient client = HttpClients.createDefault();
-    String urlBase = "http://127.0.0.1:" + gitBridgePort;
+    String urlBase = "http://127.0.0.1:" + wlgb.getPort();
     // Status
     // Status
     HttpGet statusRequest = new HttpGet(urlBase + "/status/");
     HttpGet statusRequest = new HttpGet(urlBase + "/status/");
     HttpResponse statusResponse = client.execute(statusRequest);
     HttpResponse statusResponse = client.execute(statusRequest);
@@ -1312,15 +1300,14 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void testStatusAndHealthCheckEndpointsWithHead()
   public void testStatusAndHealthCheckEndpointsWithHead()
       throws ClientProtocolException, IOException {
       throws ClientProtocolException, IOException {
-    int gitBridgePort = 33889;
     int mockServerPort = 3889;
     int mockServerPort = 3889;
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     HttpClient client = HttpClients.createDefault();
     HttpClient client = HttpClients.createDefault();
-    String urlBase = "http://127.0.0.1:" + gitBridgePort;
+    String urlBase = "http://127.0.0.1:" + wlgb.getPort();
     // Status
     // Status
     HttpHead statusRequest = new HttpHead(urlBase + "/status");
     HttpHead statusRequest = new HttpHead(urlBase + "/status");
     HttpResponse statusResponse = client.execute(statusRequest);
     HttpResponse statusResponse = client.execute(statusRequest);
@@ -1333,15 +1320,14 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void gitLfsBatchEndpoint() throws ClientProtocolException, IOException, ParseException {
   public void gitLfsBatchEndpoint() throws ClientProtocolException, IOException, ParseException {
-    int gitBridgePort = 33890;
     int mockServerPort = 3890;
     int mockServerPort = 3890;
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile());
     server.start();
     server.start();
     server.setState(states.get("canCloneARepository").get("state"));
     server.setState(states.get("canCloneARepository").get("state"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
     HttpClient client = HttpClients.createDefault();
     HttpClient client = HttpClients.createDefault();
-    String urlBase = "http://git:password@127.0.0.1:" + gitBridgePort;
+    String urlBase = "http://git:password@127.0.0.1:" + wlgb.getPort();
     HttpPost gitLfsRequest =
     HttpPost gitLfsRequest =
         new HttpPost(urlBase + "/5f2419407929eb0026641967.git/info/lfs/objects/batch");
         new HttpPost(urlBase + "/5f2419407929eb0026641967.git/info/lfs/objects/batch");
     HttpResponse gitLfsResponse = client.execute(gitLfsRequest);
     HttpResponse gitLfsResponse = client.execute(gitLfsRequest);
@@ -1353,16 +1339,15 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void canPullIgnoredForceAddedFile() throws IOException, InterruptedException {
   public void canPullIgnoredForceAddedFile() throws IOException, InterruptedException {
-    int gitBridgePort = 33891;
     int mockServerPort = 3891;
     int mockServerPort = 3891;
     server =
     server =
         new MockSnapshotServer(
         new MockSnapshotServer(
             mockServerPort, getResource("/canPullIgnoredForceAddedFile").toFile());
             mockServerPort, getResource("/canPullIgnoredForceAddedFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullIgnoredForceAddedFile").get("base"));
     server.setState(states.get("canPullIgnoredForceAddedFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
-    File testProjDir = gitClone(PROJECT_ID, gitBridgePort, dir);
+    File testProjDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     File one = new File(testProjDir, "sub/one.txt");
     File one = new File(testProjDir, "sub/one.txt");
     one.createNewFile();
     one.createNewFile();
     FileWriter fw = new FileWriter(one.getPath());
     FileWriter fw = new FileWriter(one.getPath());
@@ -1379,16 +1364,15 @@ public class WLGitBridgeIntegrationTest {
 
 
   @Test
   @Test
   public void canPullIgnoredFileFromOverleaf() throws IOException, InterruptedException {
   public void canPullIgnoredFileFromOverleaf() throws IOException, InterruptedException {
-    int gitBridgePort = 33892;
     int mockServerPort = 3892;
     int mockServerPort = 3892;
     server =
     server =
         new MockSnapshotServer(
         new MockSnapshotServer(
             mockServerPort, getResource("/canPullIgnoredForceAddedFile").toFile());
             mockServerPort, getResource("/canPullIgnoredForceAddedFile").toFile());
     server.start();
     server.start();
     server.setState(states.get("canPullIgnoredForceAddedFile").get("base"));
     server.setState(states.get("canPullIgnoredForceAddedFile").get("base"));
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
-    File testProjDir = gitClone(PROJECT_ID, gitBridgePort, dir);
+    File testProjDir = gitClone(PROJECT_ID, wlgb.getPort(), dir);
     server.setState(states.get("canPullIgnoredForceAddedFile").get("withUpdatedMainFile"));
     server.setState(states.get("canPullIgnoredForceAddedFile").get("withUpdatedMainFile"));
     gitPull(testProjDir);
     gitPull(testProjDir);
     File f = new File(testProjDir.getPath() + "/sub/one.txt");
     File f = new File(testProjDir.getPath() + "/sub/one.txt");
@@ -1398,17 +1382,16 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void noCors() throws IOException, ExecutionException, InterruptedException {
   public void noCors() throws IOException, ExecutionException, InterruptedException {
 
 
-    int gitBridgePort = 33893;
     int mockServerPort = 3893;
     int mockServerPort = 3893;
 
 
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canServePushedFiles").get("state"));
     server.setState(states.get("canServePushedFiles").get("state"));
 
 
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
 
 
-    String url = "http://127.0.0.1:" + gitBridgePort + "/status";
+    String url = "http://127.0.0.1:" + wlgb.getPort() + "/status";
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     Response response = asyncHttpClient().prepareGet(url).execute().get();
     assertEquals(200, response.getStatusCode());
     assertEquals(200, response.getStatusCode());
     assertEquals("ok\n", response.getResponseBody());
     assertEquals("ok\n", response.getResponseBody());
@@ -1418,17 +1401,16 @@ public class WLGitBridgeIntegrationTest {
   @Test
   @Test
   public void cors() throws IOException, ExecutionException, InterruptedException {
   public void cors() throws IOException, ExecutionException, InterruptedException {
 
 
-    int gitBridgePort = 33894;
     int mockServerPort = 3894;
     int mockServerPort = 3894;
 
 
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
     server.start();
     server.start();
     server.setState(states.get("canServePushedFiles").get("state"));
     server.setState(states.get("canServePushedFiles").get("state"));
 
 
-    wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+    wlgb = new GitBridgeApp(new String[] {makeConfigFile(0, mockServerPort)});
     wlgb.run();
     wlgb.run();
 
 
-    String url = "http://127.0.0.1:" + gitBridgePort + "/status";
+    String url = "http://127.0.0.1:" + wlgb.getPort() + "/status";
 
 
     // Success
     // Success
     Response response =
     Response response =