From c4b34752b495078225e83ccd013504b808b1a5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 4 Sep 2018 20:29:17 +0200 Subject: [PATCH] Fix integration tests by delegating to existing servlets --- .../java/sonia/scm/repository/Repository.java | 12 ---- .../sonia/scm/repository/api/ScmProtocol.java | 4 +- .../spi/DefaultHttpScmProtocol.java | 20 +++++++ .../scm/repository/spi/HttpScmProtocol.java | 4 +- .../sonia/scm/repository/RepositoryTest.java | 60 ------------------- .../repository/api/RepositoryServiceTest.java | 4 +- .../java/sonia/scm/it/RepositoryUtil.java | 2 +- .../spi/GitRepositoryServiceProvider.java | 4 +- .../java/sonia/scm/web/ScmGitServlet.java | 16 ++++- .../spi/HgRepositoryServiceProvider.java | 4 +- .../main/java/sonia/scm/web/HgCGIServlet.java | 15 ++++- .../spi/SvnRepositoryServiceProvider.java | 4 +- .../java/sonia/scm/web/SvnDAVServlet.java | 15 ++++- .../resources/RepositoryRootResource.java | 31 +++------- .../RepositoryToRepositoryDtoMapper.java | 6 +- .../scm/api/v2/resources/MockScmProtocol.java | 3 +- 16 files changed, 90 insertions(+), 114 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java delete mode 100644 scm-core/src/test/java/sonia/scm/repository/RepositoryTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Repository.java b/scm-core/src/main/java/sonia/scm/repository/Repository.java index 0d8c6a6af8..cad36f2d88 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -40,7 +40,6 @@ import com.google.common.base.Objects; import com.google.common.collect.Lists; import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; -import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; @@ -349,17 +348,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per // do not copy health check results } - /** - * Creates the url of the repository. - * - * @param baseUrl base url of the server including the context path - * @return url of the repository - * @since 1.17 - */ - public String createUrl(String baseUrl) { - return HttpUtil.concatenate(baseUrl, type, namespace, name); - } - /** * Returns true if the {@link Repository} is the same as the obj argument. * diff --git a/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java index 0bd1ed77ef..8d44ec19ad 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java @@ -1,5 +1,7 @@ package sonia.scm.repository.api; +import sonia.scm.repository.Repository; + import javax.ws.rs.core.UriInfo; /** @@ -17,5 +19,5 @@ public interface ScmProtocol { /** * The URL to access the repository providing this protocol. */ - String getUrl(UriInfo uriInfo); + String getUrl(Repository repository, UriInfo uriInfo); } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java new file mode 100644 index 0000000000..223be7aca8 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java @@ -0,0 +1,20 @@ +package sonia.scm.repository.spi; + +import sonia.scm.repository.Repository; + +import javax.ws.rs.core.UriInfo; +import java.net.URI; + +public abstract class DefaultHttpScmProtocol implements HttpScmProtocol { + + private final Repository repository; + + protected DefaultHttpScmProtocol(Repository repository) { + this.repository = repository; + } + + @Override + public String getUrl(Repository repository, UriInfo uriInfo) { + return uriInfo.getBaseUri().resolve(URI.create("../../" + this.repository.getType() + "/" + this.repository.getNamespace() + "/" + this.repository.getName())).toASCIIString(); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java index 76241808fb..2bf46c384d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java @@ -2,8 +2,10 @@ package sonia.scm.repository.spi; import sonia.scm.repository.api.ScmProtocol; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; public interface HttpScmProtocol extends ScmProtocol { @Override @@ -11,5 +13,5 @@ public interface HttpScmProtocol extends ScmProtocol { return "http"; } - void serve(HttpServletRequest request, HttpServletResponse response); + void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } diff --git a/scm-core/src/test/java/sonia/scm/repository/RepositoryTest.java b/scm-core/src/test/java/sonia/scm/repository/RepositoryTest.java deleted file mode 100644 index f13f4cbc67..0000000000 --- a/scm-core/src/test/java/sonia/scm/repository/RepositoryTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2010, 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.repository; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * - * @author Sebastian Sdorra - */ -public class RepositoryTest -{ - - /** - * Method description - * - */ - @Test - public void testCreateUrl() - { - Repository repository = new Repository("123", "hg", "test", "repo"); - - assertEquals("http://localhost:8080/scm/hg/test/repo", - repository.createUrl("http://localhost:8080/scm")); - assertEquals("http://localhost:8080/scm/hg/test/repo", - repository.createUrl("http://localhost:8080/scm/")); - } -} diff --git a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java index c5e38908ec..7addb448f6 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java @@ -39,7 +39,7 @@ public class RepositoryServiceTest { RepositoryService repositoryService = new RepositoryService(null, provider, repository, null); HttpScmProtocol protocol = repositoryService.getProtocol(HttpScmProtocol.class); - assertThat(protocol.getUrl(null)).isEqualTo("dummy"); + assertThat(protocol.getUrl(repository, null)).isEqualTo("dummy"); } @Test @@ -55,7 +55,7 @@ public class RepositoryServiceTest { private static class DummyHttpProtocol implements HttpScmProtocol { @Override - public String getUrl(UriInfo uriInfo) { + public String getUrl(Repository repository, UriInfo uriInfo) { return "dummy"; } diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java index ef2332074b..b4690768fc 100644 --- a/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java @@ -24,7 +24,7 @@ public class RepositoryUtil { static RepositoryClient createRepositoryClient(String repositoryType, File folder, String username, String password) throws IOException { String httpProtocolUrl = TestData.callRepository(username, password, repositoryType, HttpStatus.SC_OK) .extract() - .path("_links.httpProtocol.href"); + .path("_links.protocol.find{it.name=='http'}.href"); return REPOSITORY_CLIENT_FACTORY.create(repositoryType, httpProtocolUrl, username, password, folder); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java index 2fbbf3b029..56ceb59de0 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java @@ -40,6 +40,7 @@ import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.repository.api.Command; import sonia.scm.repository.api.ScmProtocol; +import sonia.scm.web.ScmGitServlet; import java.io.IOException; import java.util.Collections; @@ -250,8 +251,7 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider @Override public Set getSupportedProtocols() { - // TODO #9246 - return Collections.emptySet(); + return Collections.singleton(new ScmGitServlet(null, null, null, null, null, null)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java index 5612a64652..5efffec523 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java @@ -44,6 +44,7 @@ import org.slf4j.Logger; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; +import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.util.HttpUtil; import sonia.scm.web.lfs.servlet.LfsServletFactory; @@ -51,7 +52,9 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.UriInfo; import java.io.IOException; +import java.net.URI; import java.util.regex.Pattern; import static org.eclipse.jgit.lfs.lib.Constants.CONTENT_TYPE_GIT_LFS_JSON; @@ -64,7 +67,7 @@ import static org.slf4j.LoggerFactory.getLogger; * @author Sebastian Sdorra */ @Singleton -public class ScmGitServlet extends GitServlet +public class ScmGitServlet extends GitServlet implements HttpScmProtocol { /** Field description */ @@ -284,6 +287,16 @@ public class ScmGitServlet extends GitServlet return false; } + @Override + public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + service(request, response); + } + + @Override + public String getUrl(Repository repository, UriInfo uriInfo) { + return uriInfo.getBaseUri().resolve(URI.create("../../git/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + } + //~--- fields --------------------------------------------------------------- @@ -299,5 +312,4 @@ public class ScmGitServlet extends GitServlet private final GitRepositoryViewer repositoryViewer; private final LfsServletFactory lfsServletFactory; - } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java index 11697ecea6..882c5a1c6b 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java @@ -42,6 +42,7 @@ import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.repository.api.Command; import sonia.scm.repository.api.ScmProtocol; +import sonia.scm.web.HgCGIServlet; import java.io.File; import java.io.IOException; @@ -275,8 +276,7 @@ public class HgRepositoryServiceProvider extends RepositoryServiceProvider @Override public Set getSupportedProtocols() { - // TODO #9248 - return Collections.emptySet(); + return Collections.singleton(new HgCGIServlet(null, null, null, null, null, null)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java index 6cb4d523f0..a8fbf0431e 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java @@ -51,6 +51,7 @@ import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; +import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.security.CipherUtil; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -63,8 +64,10 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.ws.rs.core.UriInfo; import java.io.File; import java.io.IOException; +import java.net.URI; import java.util.Base64; import java.util.Enumeration; @@ -75,7 +78,7 @@ import java.util.Enumeration; * @author Sebastian Sdorra */ @Singleton -public class HgCGIServlet extends HttpServlet +public class HgCGIServlet extends HttpServlet implements HttpScmProtocol { /** Field description */ @@ -359,6 +362,16 @@ public class HgCGIServlet extends HttpServlet return python; } + @Override + public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + service(request, response); + } + + @Override + public String getUrl(Repository repository, UriInfo uriInfo) { + return uriInfo.getBaseUri().resolve(URI.create("../../hg/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java index 3b246cff2e..cbd303a9c6 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java @@ -41,6 +41,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.SvnRepositoryHandler; import sonia.scm.repository.api.Command; import sonia.scm.repository.api.ScmProtocol; +import sonia.scm.web.SvnDAVServlet; import java.io.IOException; import java.util.Collections; @@ -193,8 +194,7 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider @Override public Set getSupportedProtocols() { - // TODO #9247 - return Collections.emptySet(); + return Collections.singleton(new SvnDAVServlet(null, null, null, null)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java index c811179255..c968763955 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java @@ -45,6 +45,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; import sonia.scm.repository.SvnRepositoryHandler; +import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -52,7 +53,9 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.UriInfo; import java.io.IOException; +import java.net.URI; //~--- JDK imports ------------------------------------------------------------ @@ -61,7 +64,7 @@ import java.io.IOException; * @author Sebastian Sdorra */ @Singleton -public class SvnDAVServlet extends DAVServlet +public class SvnDAVServlet extends DAVServlet implements HttpScmProtocol { /** Field description */ @@ -283,6 +286,16 @@ public class SvnDAVServlet extends DAVServlet private final RepositoryProvider repositoryProvider; } + @Override + public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + service(request, response); + } + + @Override + public String getUrl(Repository repository, UriInfo uriInfo) { + return uriInfo.getBaseUri().resolve(URI.create("../../svn/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + } + //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java index cec1894764..59ffbe560b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryRootResource.java @@ -40,30 +40,26 @@ import com.google.common.collect.Collections2; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; import com.google.inject.Inject; - import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryTypePredicate; +import sonia.scm.template.Viewable; import sonia.scm.util.HttpUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - import javax.servlet.http.HttpServletRequest; - 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.Context; import javax.ws.rs.core.MediaType; -import sonia.scm.template.Viewable; +import java.io.IOException; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -175,17 +171,6 @@ public class RepositoryRootResource return repository; } - /** - * Method description - * - * - * @return - */ - public String getUrl() - { - return repository.createUrl(baseUrl); - } - //~--- fields ------------------------------------------------------------- /** Field description */ diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java index 0bc9b7af48..bc0073506e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java @@ -50,7 +50,7 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper supportedProtocols = repositoryService.getSupportedProtocols(); List protocolLinks = supportedProtocols .stream() - .map(this::createProtocolLink) + .map(protocol -> createProtocolLink(protocol, repository)) .collect(toList()); linksBuilder.array(protocolLinks); } @@ -66,7 +66,7 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper