diff --git a/services/git-bridge/src/it/java/TTest.java b/services/git-bridge/src/it/java/TTest.java deleted file mode 100644 index 7eb7e4fec1..0000000000 --- a/services/git-bridge/src/it/java/TTest.java +++ /dev/null @@ -1,21 +0,0 @@ -import org.junit.Test; -import uk.ac.ic.wlgitbridge.test.server.MockSnapshotServer; -import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIState; -import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIStateBuilder; - -/** - * Created by Winston on 11/01/15. - */ -public class TTest { - - @Test - public void testStreamToString() { - SnapshotAPIStateBuilder stateBuilder = new SnapshotAPIStateBuilder(getClass().getResourceAsStream("/state.json")); - SnapshotAPIState state = stateBuilder.build(); - MockSnapshotServer server = new MockSnapshotServer(); - server.setState(state); - server.start(); - while (true); - } - -} diff --git a/services/git-bridge/src/it/java/uk/ac/ic/wlgitbridge/IntegrationTest.java b/services/git-bridge/src/it/java/uk/ac/ic/wlgitbridge/IntegrationTest.java index 8602695b25..f9bf86193d 100644 --- a/services/git-bridge/src/it/java/uk/ac/ic/wlgitbridge/IntegrationTest.java +++ b/services/git-bridge/src/it/java/uk/ac/ic/wlgitbridge/IntegrationTest.java @@ -1,15 +1,96 @@ package uk.ac.ic.wlgitbridge; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import uk.ac.ic.wlgitbridge.application.WLGitBridgeApplication; +import uk.ac.ic.wlgitbridge.test.server.MockSnapshotServer; +import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIState; +import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIStateBuilder; +import uk.ac.ic.wlgitbridge.test.util.FileUtil; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertTrue; /** * Created by Winston on 11/01/15. */ public class IntegrationTest { - @Test - public void canCloneARepository() { + private MockSnapshotServer server; + private Map> states = + new HashMap>() {{ + put("canCloneARepository", new HashMap() {{ + put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/canCloneARepository/state/state.json")).build()); + }}); + }}; + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Before + public void startMockSnapshotAPIServer() throws URISyntaxException { + server = new MockSnapshotServer(Paths.get(getClass().getResource("/uk/ac/ic/wlgitbridge/IntegrationTest/").toURI()).toFile()); + server.start(); + } + + @Test + public void canCloneARepository() throws IOException, GitAPIException { + server.setState(states.get("canCloneARepository").get("state")); + WLGitBridgeApplication wlgb = new WLGitBridgeApplication(new String[] { + makeConfigFile() + }); + wlgb.run(); + folder.create(); + File git = folder.newFolder(); + Git.cloneRepository() + .setURI("http://127.0.0.1:30080/testproj.git") + .setDirectory(git) + .call() + .close(); + wlgb.stop(); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneARepository/state/git"), git.toPath())); + } + + private String makeConfigFile() throws IOException { + File wlgb = folder.newFolder(); + File config = folder.newFile(); + PrintWriter writer = new PrintWriter(config); + writer.println("{\n" + + "\t\"port\": 30080,\n" + + "\t\"rootGitDirectory\": \"" + wlgb.getAbsolutePath() + "\",\n" + + "\t\"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" + + "\t\"username\": \"\",\n" + + "\t\"password\": \"\",\n" + + "\t\"postbackBaseUrl\": \"http://127.0.0.1:30080\",\n" + + "\t\"serviceName\": \"Overleaf\"\n" + + "}\n"); + writer.close(); + return config.getAbsolutePath(); + } + + private Path getResource(String path) { + try { + return Paths.get(getClass().getResource("/uk/ac/ic/wlgitbridge/IntegrationTest" + path).toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + private InputStream getResourceAsStream(String path) { + return getClass().getResourceAsStream("/uk/ac/ic/wlgitbridge/IntegrationTest" + path); } } diff --git a/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/git b/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/git new file mode 160000 index 0000000000..3c01dd67c2 --- /dev/null +++ b/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/git @@ -0,0 +1 @@ +Subproject commit 3c01dd67c26f031763282b1436b91bdb5309cda4 diff --git a/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/state.json b/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/state.json new file mode 100644 index 0000000000..977d874aee --- /dev/null +++ b/services/git-bridge/src/it/resources/uk/ac/ic/wlgitbridge/IntegrationTest/canCloneARepository/state/state.json @@ -0,0 +1,46 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 1, + "createdAt": "2014-11-30T18:40:58Z", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1" + }, + "getSavedVers": [ + { + "versionID": 1, + "comment": "added more info on doc GET and error details", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1", + "createdAt": "2014-11-30T18:47:01Z" + } + ], + "getForVers": [ + { + "versionID": 1, + "srcs": [ + { + "content": "content", + "path": "main.tex" + }, + { + "content": "This text is from another file.", + "path": "foo/bar/test.tex" + } + ], + "atts": [ + { + "url": "http://127.0.0.1:60000/canCloneARepository/state/git/min_mean_wait_evm_7_eps_150dpi.png", + "path": "min_mean_wait_evm_7_eps_150dpi.png" + } + ] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 2 + } + } +] \ No newline at end of file diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/Main.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/Main.java index a7ebbf6255..809d831952 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/Main.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/Main.java @@ -3,13 +3,15 @@ package uk.ac.ic.wlgitbridge.test; import uk.ac.ic.wlgitbridge.test.server.MockSnapshotServer; import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIState; +import java.io.File; + /** * Created by Winston on 10/01/15. */ public class Main { public static void main(String[] args) { - MockSnapshotServer server = new MockSnapshotServer(); + MockSnapshotServer server = new MockSnapshotServer(new File("/Users/Roxy/Code/java/writelatex-git-bridge")); server.setState(new SnapshotAPIState()); server.start(); } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotRequestHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotRequestHandler.java index aec1d9d0b4..9d7ed95da3 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotRequestHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotRequestHandler.java @@ -25,17 +25,19 @@ public class MockSnapshotRequestHandler extends AbstractHandler { @Override public void handle(String target, final Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - + boolean handled; try { final SnapshotResponse snapshotResponse = responseBuilder.buildWithTarget(target, baseRequest.getMethod()); response.getWriter().println(snapshotResponse.respond()); new PostbackThread(baseRequest.getReader(), snapshotResponse.postback()).startIfNotNull(); + handled = true; } catch (InvalidAPICallException e) { - Util.printStackTrace(e); + handled = false; } catch (RuntimeException e) { Util.printStackTrace(e); + handled = true; } - baseRequest.setHandled(true); + baseRequest.setHandled(handled); } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotServer.java index 239a42b8df..5fe55170dc 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/server/MockSnapshotServer.java @@ -2,10 +2,14 @@ package uk.ac.ic.wlgitbridge.test.server; import org.eclipse.jetty.server.NetworkConnector; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.ResourceHandler; import uk.ac.ic.wlgitbridge.test.response.SnapshotResponseBuilder; import uk.ac.ic.wlgitbridge.test.state.SnapshotAPIState; import uk.ac.ic.wlgitbridge.util.Util; +import java.io.File; + /** * Created by Winston on 09/01/15. */ @@ -15,10 +19,23 @@ public class MockSnapshotServer { private final SnapshotResponseBuilder responseBuilder; private int port; - public MockSnapshotServer() { + public MockSnapshotServer(File resourceBase) { server = new Server(60000); responseBuilder = new SnapshotResponseBuilder(); - server.setHandler(new MockSnapshotRequestHandler(responseBuilder)); + server.setHandler(getHandlerForResourceBase(resourceBase)); + } + + private HandlerCollection getHandlerForResourceBase(File resourceBase) { + HandlerCollection handlers = new HandlerCollection(); + handlers.addHandler(new MockSnapshotRequestHandler(responseBuilder)); + handlers.addHandler(resourceHandlerWithBase(resourceBase)); + return handlers; + } + + private ResourceHandler resourceHandlerWithBase(File resourceBase) { + ResourceHandler resourceHandler = new ResourceHandler(); + resourceHandler.setResourceBase(resourceBase.getAbsolutePath()); + return resourceHandler; } public void start() { diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/state/SnapshotAPIStateManager.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/state/SnapshotAPIStateManager.java new file mode 100644 index 0000000000..5eb3611bb7 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/state/SnapshotAPIStateManager.java @@ -0,0 +1,10 @@ +package uk.ac.ic.wlgitbridge.test.state; + +/** + * Created by Winston on 11/01/15. + */ +public class SnapshotAPIStateManager { + + + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/util/FileUtil.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/util/FileUtil.java index 2e0f7d6971..80a9a343b5 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/util/FileUtil.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/test/util/FileUtil.java @@ -1,5 +1,11 @@ package uk.ac.ic.wlgitbridge.test.util; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.NoHeadException; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; + import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -13,6 +19,20 @@ import java.util.Set; */ public class FileUtil { + public static boolean currentCommitsAreEqual(Path dir1, Path dir2) { + try { + RevCommit commit1 = new Git(new FileRepositoryBuilder().setWorkTree(dir1.toFile().getAbsoluteFile()).build()).log().call().iterator().next(); + RevCommit commit2 = new Git(new FileRepositoryBuilder().setWorkTree(dir2.toFile().getAbsoluteFile()).build()).log().call().iterator().next(); + return commit1.equals(commit2); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (NoHeadException e) { + return false; + } catch (GitAPIException e) { + throw new RuntimeException(e); + } + } + public static boolean gitDirectoriesAreEqual(Path dir1, Path dir2) { Set dir1Contents = getAllFilesRecursivelyInDirectoryApartFrom(dir1, dir1.resolve(".git")); Set dir2Contents = getAllFilesRecursivelyInDirectoryApartFrom(dir2, dir2.resolve(".git")); @@ -34,13 +54,19 @@ public class FileUtil { try { byte[] firstContents = Files.readAllBytes(first); byte[] secondContents = Files.readAllBytes(second); - return Arrays.equals(firstContents, secondContents); + boolean equals = Arrays.equals(firstContents, secondContents); + if (!equals) { + System.out.println("Not equal: (" + first + ", " + second + ")"); + System.out.println(first + ": " + new String(firstContents)); + System.out.println(second + ": " + new String(secondContents)); + } + return equals; } catch (IOException e) { throw new RuntimeException(e); } } - static Set getAllFilesRecursivelyInDirectoryApartFrom(Path dir, Path excluded) { + public static Set getAllFilesRecursivelyInDirectoryApartFrom(Path dir, Path excluded) { if (!dir.toFile().isDirectory()) { throw new IllegalArgumentException("need a directory"); } diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq1 b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq1 new file mode 160000 index 0000000000..a970b70202 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq1 @@ -0,0 +1 @@ +Subproject commit a970b70202d8df99e0b42a0498e5df3070976493 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq2 b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq2 new file mode 160000 index 0000000000..e2ed297a27 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsFalseWhenCommitsAreDifferent/neq2 @@ -0,0 +1 @@ +Subproject commit e2ed297a2717598c89ec0b54fe9f748a15509d3b diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq1 b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq1 new file mode 160000 index 0000000000..f5ae5f4aaa --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq1 @@ -0,0 +1 @@ +Subproject commit f5ae5f4aaa838d152da1c1154c199c71e1623188 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq2 b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq2 new file mode 160000 index 0000000000..f5ae5f4aaa --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/test/util/FileUtilTest/returnsTrueWhenCommitsAreTheSame/eq2 @@ -0,0 +1 @@ +Subproject commit f5ae5f4aaa838d152da1c1154c199c71e1623188