diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index 9a7ab485a8..e4245649f1 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -644,6 +644,10 @@ scm.home target/scm-it + + scm.stage + ${scm.stage} + diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 2c2efff045..555fb7682c 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -59,6 +59,7 @@ import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; +import sonia.scm.debug.DebugModule; import sonia.scm.repository.HealthCheckContextListener; import sonia.scm.schedule.Scheduler; @@ -198,6 +199,10 @@ public class ScmContextListener extends GuiceServletContextListener moduleList.add(new ScmSecurityModule(servletContext)); moduleList.addAll(pluginLoader.getModuleSet()); moduleList.addAll(overrides.getModules()); + + if (SCMContext.getContext().getStage() == Stage.DEVELOPMENT){ + moduleList.add(new DebugModule()); + } return Guice.createInjector(moduleList); } diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java new file mode 100644 index 0000000000..b225090da0 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.debug; + +import com.google.common.base.Function; +import com.google.common.collect.Collections2; +import com.google.common.eventbus.Subscribe; +import javax.inject.Inject; +import sonia.scm.EagerSingleton; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.PostReceiveRepositoryHookEvent; + +/** + * {@link PostReceiveRepositoryHookEvent} which stores receives data and passes it to the {@link DebugService}. + * + * @author Sebastian Sdorra + */ +@EagerSingleton +public final class DebugHook +{ + + private final DebugService debugService; + + /** + * Constructs a new instance. + * + * @param debugService debug service + */ + @Inject + public DebugHook(DebugService debugService) + { + this.debugService = debugService; + } + + /** + * Processes the received {@link PostReceiveRepositoryHookEvent} and transforms it to a {@link DebugHookData} and + * passes it to the {@link DebugService}. + * + * @param event received event + */ + @Subscribe + public void processEvent(PostReceiveRepositoryHookEvent event){ + debugService.put( + event.getRepository().getId(), + new DebugHookData(Collections2.transform(event.getChangesets(), IDEXTRACTOR)) + ); + } + + private static final Function IDEXTRACTOR = new Function(){ + + @Override + public String apply(Changeset input) + { + return input.getId(); + } + }; +} diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java new file mode 100644 index 0000000000..bb8cfa42e7 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.debug; + +import java.util.Collection; +import java.util.Date; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Received data from repository hook event. + * + * @author Sebastian Sdorra + */ +@XmlRootElement(name = "hook") +@XmlAccessorType(XmlAccessType.FIELD) +public class DebugHookData +{ + private Date date; + private Collection changesets; + + /** + * Constructs a new instance. This constructor should only be used by JAXB. + */ + public DebugHookData() + { + } + + /** + * Constructs a new instance. + * + * @param changesets collection of changeset ids + */ + public DebugHookData(Collection changesets) + { + this.date = new Date(); + this.changesets = changesets; + } + + /** + * Returns the receiving date. + * + * @return receiving date + */ + public Date getDate() + { + return date; + } + + /** + * Return collection of changeset ids. + * + * @return collection of changeset ids + */ + public Collection getChangesets() + { + return changesets; + } + + +} diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java new file mode 100644 index 0000000000..c0dc231341 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.debug; + +import com.google.inject.AbstractModule; + +/** + * DebugModule binds all required classes around the {@link DebugService}. + * + * @author Sebastian Sdorra + */ +public final class DebugModule extends AbstractModule +{ + + @Override + protected void configure() + { + bind(DebugService.class); + bind(DebugHook.class); + bind(DebugResource.class); + } + +} diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java new file mode 100644 index 0000000000..f65e0c7708 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.debug; + +import java.util.Collection; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * Rest api resource for the {@link DebugService}. + * + * @author Sebastian Sdorra + */ +@Path("debug/{repository}/post-receive") +public final class DebugResource +{ + private final DebugService debugService; + + /** + * Constructs a new instance. + * + * @param debugService debug service + */ + @Inject + public DebugResource(DebugService debugService) + { + this.debugService = debugService; + } + + /** + * Returns all received hook data for the given repository. + * + * @param repository repository id + * + * @return all received hook data for the given repository + */ + @GET + @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + public Collection getAll(@PathParam("repository") String repository){ + return debugService.getAll(repository); + } + + /** + * Returns the last received hook data for the given repository. + * + * @param repository repository id + * + * @return the last received hook data for the given repository + */ + @GET + @Path("last") + @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + public DebugHookData getLast(@PathParam("repository") String repository){ + return debugService.getLast(repository); + } + +} diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java new file mode 100644 index 0000000000..807b9c0abc --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.debug; + +import com.google.common.collect.Iterables; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import com.google.inject.Singleton; +import java.util.Collection; +import org.apache.shiro.SecurityUtils; +import sonia.scm.security.Role; + +/** + * The DebugService stores and returns received data from repository hook events. + * + * @author Sebastian Sdorra + */ +@Singleton +public final class DebugService +{ + + private final Multimap receivedHooks = LinkedListMultimap.create(); + + /** + * + * @param repository repository id + * @param hookData received hook data + */ + public void put(String repository, DebugHookData hookData) + { + SecurityUtils.getSubject().checkRole(Role.ADMIN); + receivedHooks.put(repository, hookData); + } + + /** + * Returns the last received hook data for the given repository. + * + * @param repository repository id + * + * @return the last received hook data for the given repository + */ + public DebugHookData getLast(String repository){ + SecurityUtils.getSubject().checkRole(Role.ADMIN); + DebugHookData hookData = null; + Collection receivedHookData = receivedHooks.get(repository); + if (receivedHookData != null && ! receivedHookData.isEmpty()){ + hookData = Iterables.getLast(receivedHookData); + } + return hookData; + } + + /** + * Returns all received hook data for the given repository. + * + * @param repository repository id + * + * @return all received hook data for the given repository + */ + public Collection getAll(String repository){ + SecurityUtils.getSubject().checkRole(Role.ADMIN); + return receivedHooks.get(repository); + } + +} diff --git a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java index 5d4b1fbe48..9bb2b4c16d 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java @@ -76,9 +76,12 @@ public final class IntegrationTestUtil /** Field description */ public static final String ADMIN_USERNAME = "scmadmin"; - - /** Field description */ - public static final String BASE_URL = "http://localhost:8081/scm/api/rest/"; + + /** scm-manager base url */ + public static final String BASE_URL = "http://localhost:8081/scm/"; + + /** scm-manager base url for the rest api */ + public static final String REST_BASE_URL = BASE_URL.concat("api/rest/"); /** Field description */ public static final String EXTENSION = ".xml"; @@ -253,7 +256,7 @@ public final class IntegrationTestUtil */ public static String createResourceUrl(String url) { - return BASE_URL.concat(url).concat(EXTENSION); + return REST_BASE_URL.concat(url).concat(EXTENSION); } /** diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java new file mode 100644 index 0000000000..60bf5d4aa9 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java @@ -0,0 +1,208 @@ +/** + * Copyright (c) 2014, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.it; + +import com.google.common.base.Charsets; +import com.google.common.collect.Lists; +import com.google.common.io.Files; +import com.sun.jersey.api.client.WebResource; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.Matchers.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import sonia.scm.debug.DebugHookData; +import static sonia.scm.it.IntegrationTestUtil.createResource; +import static sonia.scm.it.RepositoryITUtil.createRepository; +import static sonia.scm.it.RepositoryITUtil.deleteRepository; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.Person; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryTestData; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientFactory; + +/** + * Integration tests for repository hooks. + * + * @author Sebastian Sdorra + */ +@RunWith(Parameterized.class) +public class RepositoryHookITCase extends AbstractAdminITCaseBase +{ + + private static final RepositoryClientFactory REPOSITORY_CLIENT_FACTORY = new RepositoryClientFactory(); + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + private final String repositoryType; + private Repository repository; + private File workingCopy; + private RepositoryClient repositoryClient; + + /** + * Constructs a new instance with a repository type. + * + * @param repositoryType repository type + */ + public RepositoryHookITCase(String repositoryType) + { + this.repositoryType = repositoryType; + } + + /** + * Creates a test repository. + * + * @throws IOException + */ + @Before + public void setUpTestRepository() throws IOException + { + repository = RepositoryTestData.createHeartOfGold(repositoryType); + repository = createRepository(client, repository); + workingCopy = tempFolder.newFolder(); + repositoryClient = createRepositoryClient(); + } + + /** + * Removes the tests repository. + */ + @After + public void removeTestRepository() + { + deleteRepository(client, repository.getId()); + } + + /** + * Tests that the debug service has received the commit. + * + * @throws IOException + * @throws InterruptedException + */ + @Test + public void testSimpleHook() throws IOException, InterruptedException + { + // push commit + Files.write("a", new File(workingCopy, "a.txt"), Charsets.UTF_8); + repositoryClient.getAddCommand().add("a.txt"); + Changeset changeset = repositoryClient.getCommitCommand().commit( + new Person("scmadmin", "scmadmin@scm-manager.org"), "added a" + ); + repositoryClient.getPushCommand().push(); + + // wait some time, because the debug hook is asnychron + Thread.sleep(125); + + // check debug servlet for pushed commit + WebResource wr = createResource(client, "debug/" + repository.getId() + "/post-receive/last"); + DebugHookData data = wr.get(DebugHookData.class); + assertNotNull(data); + assertThat(data.getChangesets(), contains(changeset.getId())); + } + + /** + * Tests that the debug service receives only new commits. + * + * @throws IOException + * @throws InterruptedException + */ + @Test + public void testOnlyNewCommit() throws IOException, InterruptedException + { + // push commit + Files.write("a", new File(workingCopy, "a.txt"), Charsets.UTF_8); + repositoryClient.getAddCommand().add("a.txt"); + Changeset a = repositoryClient.getCommitCommand().commit( + new Person("scmadmin", "scmadmin@scm-manager.org"), "added a" + ); + repositoryClient.getPushCommand().push(); + + // create branch, commit and push again + repositoryClient.getBranchCommand().branch("feature/added-b"); + Files.write("b", new File(workingCopy, "b.txt"), Charsets.UTF_8); + repositoryClient.getAddCommand().add("a.txt"); + Changeset b = repositoryClient.getCommitCommand().commit( + new Person("scmadmin", "scmadmin@scm-manager.org"), "added b" + ); + repositoryClient.getPushCommand().push(); + + // wait some time, because the debug hook is asnychron + Thread.sleep(125); + + // check debug servlet that only one commit is present + WebResource wr = createResource(client, "debug/" + repository.getId() + "/post-receive/last"); + DebugHookData data = wr.get(DebugHookData.class); + assertNotNull(data); + assertThat(data.getChangesets(), allOf( + contains(b.getId()), + not( + contains(a.getId()) + ) + )); + } + + private RepositoryClient createRepositoryClient() throws IOException + { + return REPOSITORY_CLIENT_FACTORY.create(repositoryType, + IntegrationTestUtil.BASE_URL + repositoryType + "/" + repository.getName(), + IntegrationTestUtil.ADMIN_USERNAME, IntegrationTestUtil.ADMIN_PASSWORD, workingCopy + ); + } + + + /** + * Returns repository types a test parameter. + * + * @return repository types test parameter + */ + @Parameters + public static Collection createParameters() + { + Collection params = Lists.newArrayList(); + params.add(new String[] { "git" }); + // params.add(new String[] { "svn" }); + // if (IOUtil.search("hg") != null) + // { + // params.add(new String[] { "hg" }); + // } + return params; + } + +}