This is an automated email from the ASF dual-hosted git repository. jsedding pushed a commit to branch resolver-2.x-backports in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git
commit c750faa3d2bffaf86f499b81b7a5578338db5fe7 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Mar 28 06:37:12 2025 +0100 SLING-12608 : Implement Jakarta Servlet based Sling API (#52) * backport: retain only changes *not* related to Jakarta Servlet * Update dependency to latest API with jakarta support * Implement SlingServletResolver, fix test cases * Fix test cases * Use Sling api to wrap request/response * Use servlet wrapper from api * Support jakarta servlet registration * Try to use latest pax exam for java 17 support * Adjust pom * Fix some pax exam tests * Fix pax exam tests * Clean up pom * Remove dependency to outdated commons testing * Use Testing Paxexam 4.1.0 * Remove temporary optional import (cherry picked from commit e76580daf56902318fc147b9928de0c6dbf5fe97) --- pom.xml | 71 ++---- .../resolver/internal/SlingServletResolver.java | 10 +- .../defaults/DefaultErrorHandlerServlet.java | 22 +- .../internal/SecureRequestsOptingServletTest.java | 52 ++-- .../defaults/DefaultErrorHandlerServletTest.java | 49 ++-- .../resolver/internal/helper/HelperTestBase.java | 46 ++-- .../internal/helper/LocationCollectorTest.java | 264 +++++++++++---------- .../internal/helper/ResourceCollectorTest.java | 64 ++--- .../internal/helper/ScriptSelectionTest.java | 4 +- .../internal/resourcehiding/ServletHidingTest.java | 16 +- .../sling/servlets/resolver/it/SLING10478IT.java | 40 ++-- .../resolver/it/ScriptEngineManagerMock.java | 29 +++ .../resolver/it/ServletResolverTestSupport.java | 152 ++++++------ .../servlets/resolver/it/ServletResourceIT.java | 21 +- .../servlets/resolver/it/TestResourceProvider.java | 21 -- 15 files changed, 468 insertions(+), 393 deletions(-) diff --git a/pom.xml b/pom.xml index f791515..d7b75ba 100644 --- a/pom.xml +++ b/pom.xml @@ -39,13 +39,14 @@ <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git</connection> <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git</developerConnection> <url>https://github.com/apache/sling-org-apache-sling-servlets-resolver.git</url> - <tag>org.apache.sling.servlets.resolver-2.11.10</tag> + <tag>resolver-2.x</tag> </scm> <properties> <project.build.outputTimestamp>2025-07-11T14:46:48Z</project.build.outputTimestamp> <site.jira.version.id>12314292</site.jira.version.id> - <org.ops4j.pax.exam.version>4.13.3</org.ops4j.pax.exam.version> + <sling.java.version>17</sling.java.version> + <org.ops4j.pax.exam.version>4.14.0</org.ops4j.pax.exam.version> <!-- To debug the pax process, override this with -D --> <pax.vm.options>-Xmx512M</pax.vm.options> </properties> @@ -117,16 +118,10 @@ </executions> <configuration> <redirectTestOutputToFile>true</redirectTestOutputToFile> - <systemProperties> - <property> - <name>bundle.filename</name> - <value>${basedir}/target/${project.build.finalName}.jar</value> - </property> - <property> - <name>pax.vm.options</name> - <value>${pax.vm.options}</value> - </property> - </systemProperties> + <systemPropertyVariables> + <bundle.filename>${basedir}/target/${project.build.finalName}.jar</bundle.filename> + <pax.vm.options>${pax.vm.options}</pax.vm.options> + </systemPropertyVariables> </configuration> </plugin> </plugins> @@ -174,11 +169,10 @@ <version>1.0.4</version> <scope>provided</scope> </dependency> - <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> - <version>2.14.0</version> + <version>2.18.0</version> <scope>provided</scope> </dependency> <dependency> @@ -199,12 +193,13 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> + <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> - <groupId>jakarta.json</groupId> - <artifactId>jakarta.json-api</artifactId> - <version>2.0.2</version> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.commons.johnzon</artifactId> + <version>2.0.0</version> <scope>provided</scope> </dependency> <dependency> @@ -217,7 +212,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.serviceusermapper</artifactId> - <version>1.2.0</version> + <version>1.5.8</version> <scope>provided</scope> </dependency> <dependency> @@ -251,7 +246,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.4</version> + <version>3.17.0</version> <scope>provided</scope> </dependency> <dependency> @@ -289,13 +284,13 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.paxexam</artifactId> - <version>3.1.0</version> + <version>4.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.commons.testing</artifactId> - <version>2.1.2</version> + <artifactId>org.apache.sling.auth.core</artifactId> + <version>1.7.0</version> <scope>test</scope> </dependency> <dependency> @@ -304,6 +299,12 @@ <version>2.9.2</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.resourceresolver</artifactId> + <version>1.10.0</version> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.osgi-mock.core</artifactId> @@ -341,7 +342,7 @@ <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> - <version>3.9.0</version> + <version>5.15.2</version> <scope>test</scope> </dependency> <dependency> @@ -386,30 +387,6 @@ <version>7.0.5</version> <scope>test</scope> </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.servlet-helpers</artifactId> - <version>1.4.2</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.resourceresolver</artifactId> - <version>1.10.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.scripting.core</artifactId> - <version>2.2.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.glassfish</groupId> - <artifactId>jakarta.json</artifactId> - <version>2.0.1</version> - <scope>test</scope> - </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-atinject_1.0_spec</artifactId> diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java index 12b3b68..2827d76 100644 --- a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java +++ b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java @@ -87,7 +87,7 @@ import org.slf4j.LoggerFactory; * In case the thread is handling a request, the {@link #onEvent(SlingRequestEvent)} method is called by the * Sling engine and a per-thread ResourceResolver is created, used and also closed when the request is * finished. - * + * * In case the thread does execute not within the context of a request, a shared ResourceResolver instance is used. * */ @@ -148,9 +148,9 @@ public class SlingServletResolver * The default extensions */ private AtomicReference<String[]> defaultExtensions = new AtomicReference<>(); - + private boolean useResourceCaching; - + private final PathBasedServletAcceptor pathBasedServletAcceptor = new PathBasedServletAcceptor(); @@ -189,7 +189,7 @@ public class SlingServletResolver servlet = resolveServletInternal(request, null, resourceType, scriptResolver); } - // last resort, use the core bundle default servlet + // last resort, use the default servlet if (servlet == null) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("No specific servlet found, trying default"); @@ -861,7 +861,7 @@ public class SlingServletResolver } return executionPaths; } - + protected void invalidateCache(ResourceResolver r) { LocationCollector.clearCache(r); AbstractResourceCollector.clearCache(r); diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java index 7e64683..2a5e783 100644 --- a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java +++ b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java @@ -25,6 +25,7 @@ import java.io.StringWriter; import jakarta.json.Json; import jakarta.json.stream.JsonGenerator; import javax.servlet.GenericServlet; +import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -32,7 +33,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.sling.api.SlingConstants; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.request.header.MediaRangeList; import org.apache.sling.api.request.RequestProgressTracker; @@ -67,10 +67,10 @@ public class DefaultErrorHandlerServlet extends GenericServlet { throws IOException { // get settings - Integer scObject = (Integer) req.getAttribute(SlingConstants.ERROR_STATUS); - String statusMessage = (String) req.getAttribute(SlingConstants.ERROR_MESSAGE); - String requestUri = (String) req.getAttribute(SlingConstants.ERROR_REQUEST_URI); - String servletName = (String) req.getAttribute(SlingConstants.ERROR_SERVLET_NAME); + Integer scObject = (Integer) req.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); + String statusMessage = (String) req.getAttribute(RequestDispatcher.ERROR_MESSAGE); + String requestUri = (String) req.getAttribute(RequestDispatcher.ERROR_REQUEST_URI); + String servletName = (String) req.getAttribute(RequestDispatcher.ERROR_SERVLET_NAME); // ensure values int statusCode = (scObject != null) @@ -104,8 +104,8 @@ public class DefaultErrorHandlerServlet extends GenericServlet { ResponseUtil.getXmlEscapingWriter(pw)); // dump the stack trace - if (req.getAttribute(SlingConstants.ERROR_EXCEPTION) instanceof Throwable) { - final Throwable throwable = (Throwable) req.getAttribute(SlingConstants.ERROR_EXCEPTION); + if (req.getAttribute(RequestDispatcher.ERROR_EXCEPTION) instanceof Throwable) { + final Throwable throwable = (Throwable) req.getAttribute(RequestDispatcher.ERROR_EXCEPTION); pw.println("<h3>Exception:</h3>"); pw.println("<pre>"); pw.flush(); @@ -144,7 +144,7 @@ public class DefaultErrorHandlerServlet extends GenericServlet { jsonGenerator.writeStartObject(); jsonGenerator.write("status", statusCode); - String msg = (String)req.getAttribute(SlingConstants.ERROR_MESSAGE); + String msg = (String)req.getAttribute(RequestDispatcher.ERROR_MESSAGE); if (msg != null && !msg.isEmpty()) { jsonGenerator.write("message", statusMessage); } @@ -159,7 +159,7 @@ public class DefaultErrorHandlerServlet extends GenericServlet { // SLING-10615 - for backward compatibility check for either a // String or Class value - Object exceptionTypeObj = req.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE); + Object exceptionTypeObj = req.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE); String exceptionType = null; if (exceptionTypeObj instanceof String) { exceptionType = (String)exceptionTypeObj; @@ -171,8 +171,8 @@ public class DefaultErrorHandlerServlet extends GenericServlet { } // dump the stack trace - if (req.getAttribute(SlingConstants.ERROR_EXCEPTION) instanceof Throwable) { - final Throwable throwable = (Throwable) req.getAttribute(SlingConstants.ERROR_EXCEPTION); + if (req.getAttribute(RequestDispatcher.ERROR_EXCEPTION) instanceof Throwable) { + final Throwable throwable = (Throwable) req.getAttribute(RequestDispatcher.ERROR_EXCEPTION); try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { printStackTrace(pw, throwable); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java index a5ba52a..c08844f 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java @@ -29,31 +29,37 @@ import javax.servlet.Servlet; import javax.servlet.http.HttpServlet; import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.servlets.OptingServlet; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; +import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; import org.apache.sling.servlets.resolver.internal.helper.HelperTestBase; import org.apache.sling.servlets.resolver.internal.resource.MockServletResource; import org.apache.sling.servlets.resolver.internal.resource.ServletResource; import org.junit.Test; +import org.mockito.Mockito; import org.osgi.framework.Bundle; +@SuppressWarnings("deprecation") public class SecureRequestsOptingServletTest extends SlingServletResolverTestBase { - protected static final String SERVLET_PATH = "/mock"; - protected static final String SERVLET_NAME = "TestServlet"; + protected static final String SERVLET_PATH = "/mock"; + protected static final String SERVLET_NAME = "TestServlet"; protected static final String SERVLET_EXTENSION = "html"; + protected static final String RESOURCE_TYPE = "foo/bar"; + private Servlet testServlet; protected void defineTestServlets(Bundle bundle) { testServlet = new SecureRequestsOptingServlet(); String path = "/" - + MockSlingHttpServletRequest.RESOURCE_TYPE + + RESOURCE_TYPE + "/" - + ResourceUtil.getName(MockSlingHttpServletRequest.RESOURCE_TYPE) + + ResourceUtil.getName(RESOURCE_TYPE) + ".servlet"; Map<String, Object> props = new HashMap<>(); props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, path); @@ -71,25 +77,43 @@ public class SecureRequestsOptingServletTest extends SlingServletResolverTestBas } @Test public void testAcceptsSecureRequest() { - MockSlingHttpServletRequest secureRequest = new MockSlingHttpServletRequest( - SERVLET_PATH, null, SERVLET_EXTENSION, null, null); - secureRequest.setResourceResolver(mockResourceResolver); - secureRequest.setSecure(true); + final Resource resource = Mockito.mock(Resource.class); + Mockito.when(resource.getResourceType()).thenReturn(RESOURCE_TYPE); + Mockito.when(resource.getPath()).thenReturn("/" + RESOURCE_TYPE); + + SlingHttpServletRequest secureRequest = new SecureRequest( + Builders.newRequestBuilder(resource) + .withExtension(SERVLET_EXTENSION) + .build()); Servlet result = servletResolver.resolveServlet(secureRequest); assertEquals("Expecting our test servlet", testServlet, result); } @Test public void testIgnoreInsecureRequest() { - MockSlingHttpServletRequest insecureRequest = new MockSlingHttpServletRequest( - SERVLET_PATH, null, SERVLET_EXTENSION, null, null); - insecureRequest.setResourceResolver(mockResourceResolver); - insecureRequest.setSecure(false); + final Resource resource = Mockito.mock(Resource.class); + Mockito.when(resource.getResourceType()).thenReturn(RESOURCE_TYPE); + Mockito.when(resource.getPath()).thenReturn("/" + RESOURCE_TYPE); + + SlingHttpServletRequest insecureRequest = Builders.newRequestBuilder(resource) + .withExtension(SERVLET_EXTENSION) + .build(); Servlet result = servletResolver.resolveServlet(insecureRequest); assertNotSame("Expecting a different servlet than our own", result.getClass(), SecureRequestsOptingServlet.class); } - @SuppressWarnings("serial") + public static class SecureRequest extends SlingHttpServletRequestWrapper { + + public SecureRequest(final SlingHttpServletRequest request) { + super(request); + } + + @Override + public boolean isSecure() { + return true; + } + } + private static class SecureRequestsOptingServlet extends HttpServlet implements OptingServlet { diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java index e771001..aedb542 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java @@ -35,24 +35,30 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import org.apache.sling.api.SlingConstants; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; +import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper; import org.junit.Test; +import org.mockito.Mockito; /** * SLING-10021 test 'Accept' content-type handling in the default error handler servlet */ +@SuppressWarnings("deprecation") public class DefaultErrorHandlerServletTest { - protected void assertJsonErrorResponse(MockSlingHttpServletRequest req) throws ServletException, IOException { - MockSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(false); + protected void assertJsonErrorResponse(SlingHttpServletRequest req) throws ServletException, IOException { + MockErrorSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(Builders.newResponseBuilder().build(), false); DefaultErrorHandlerServlet errorServlet = new DefaultErrorHandlerServlet(); errorServlet.init(new MockServletConfig()); errorServlet.service(req, res); // verify we got json back - assertEquals("application/json", res.getContentType()); + assertEquals("application/json;charset=UTF-8", res.getContentType()); String responseOutput = res.getOutput().toString(); // check the json content matches what would be sent from the DefaultErrorHandlingServlet @@ -70,8 +76,11 @@ public class DefaultErrorHandlerServletTest { @Test public void testJsonErrorResponse() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = Builders.newRequestBuilder(resource).build(); + // mock a request that accepts a json response - MockSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9"); + MockErrorSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest(request, "application/json,*/*;q=0.9"); assertJsonErrorResponse(req); } @@ -81,8 +90,11 @@ public class DefaultErrorHandlerServletTest { */ @Test public void testJsonErrorResponseWithClassExceptionTypeAttributeValue() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = Builders.newRequestBuilder(resource).build(); + // mock a request that accepts a json response - MockSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9") { + SlingHttpServletRequest req = new MockErrorSlingHttpServletRequest(request, "application/json,*/*;q=0.9") { @Override public Object getAttribute(String name) { @@ -98,16 +110,19 @@ public class DefaultErrorHandlerServletTest { @Test public void testHtmlErrorResponse() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = Builders.newRequestBuilder(resource).build(); + // mock a request that accepts an html response - MockSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); - MockSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(false); + SlingHttpServletRequest req = new MockErrorSlingHttpServletRequest(request, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + MockErrorSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(Builders.newResponseBuilder().build(), false); DefaultErrorHandlerServlet errorServlet = new DefaultErrorHandlerServlet(); errorServlet.init(new MockServletConfig()); errorServlet.service(req, res); // verify we got html back - assertEquals("text/html", res.getContentType()); + assertEquals("text/html;charset=UTF-8", res.getContentType()); String responseOutput = res.getOutput().toString(); // check the html content matches what would be sent from the DefaultErrorHandlingServlet @@ -152,14 +167,14 @@ public class DefaultErrorHandlerServletTest { /** * Mock impl to simulate an error response */ - private static final class MockErrorSlingHttpServletResponse extends MockSlingHttpServletResponse { + private static final class MockErrorSlingHttpServletResponse extends SlingHttpServletResponseWrapper { private PrintWriter writer; private StringWriter strWriter; private boolean committed; - public MockErrorSlingHttpServletResponse(boolean committed) { - super(); + public MockErrorSlingHttpServletResponse(final SlingHttpServletResponse response, final boolean committed) { + super(response); this.committed = committed; } @@ -186,21 +201,19 @@ public class DefaultErrorHandlerServletTest { return this.writer; } - @Override public StringBuffer getOutput() { return strWriter.getBuffer(); } - } /** * Mock impl to simulate an error request */ - private static class MockErrorSlingHttpServletRequest extends MockSlingHttpServletRequest { + private static class MockErrorSlingHttpServletRequest extends SlingHttpServletRequestWrapper { private String accept; - private MockErrorSlingHttpServletRequest(String accept) { - super(null, null, null, null, null); + private MockErrorSlingHttpServletRequest(final SlingHttpServletRequest request, final String accept) { + super(request); this.accept = accept; } diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java index b626c25..7dbf76c 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java @@ -21,14 +21,18 @@ package org.apache.sling.servlets.resolver.internal.helper; import java.util.Collections; import java.util.Map; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletRequestBuilder; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactoryOptions; import org.jetbrains.annotations.Nullable; +import org.mockito.Mockito; import junit.framework.TestCase; @@ -37,8 +41,6 @@ public abstract class HelperTestBase extends TestCase { protected MockResourceResolverFactoryOptions resourceResolverOptions; protected ResourceResolver resourceResolver; - protected MockSlingHttpServletRequest request; - protected Resource resource; protected String resourcePath; @@ -66,12 +68,10 @@ public abstract class HelperTestBase extends TestCase { Resource parent = getOrCreateParentResource(resourceResolver, resourcePath); resource = resourceResolver.create(parent, "page", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType)); - - request = makeRequest("GET", "print.a4", "html"); } public static Resource addOrReplaceResource(ResourceResolver resolver, String path, String resourceType) { - return addOrReplaceResource(resolver, path, + return addOrReplaceResource(resolver, path, Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType)); } @@ -83,7 +83,7 @@ public abstract class HelperTestBase extends TestCase { Resource r = resolver.getResource(path); if (r != null) { resolver.delete(r); - } + } // create the new resource Resource parent = getOrCreateParentResource(resolver, path); @@ -115,13 +115,29 @@ public abstract class HelperTestBase extends TestCase { return parent; } - protected MockSlingHttpServletRequest makeRequest(String method, String selectors, String extension) { - final MockSlingHttpServletRequest result = - new MockSlingHttpServletRequest(resourcePath, selectors, extension, null, null); - result.setMethod(method); - result.setResourceResolver(resourceResolver); - result.setResource(resource); - return result; + protected SlingHttpServletRequest makeRequest(String method, String selectors, String extension) { + final Resource rsrc = Mockito.mock(Resource.class); + final ResourceMetadata md = new ResourceMetadata(); + Mockito.when(rsrc.getResourceResolver()).thenReturn(resourceResolver); + Mockito.when(rsrc.getPath()).thenReturn(this.resource.getPath()); + Mockito.when(rsrc.getName()).thenReturn(this.resource.getName()); + Mockito.when(rsrc.getResourceType()).thenReturn(this.resource.getResourceType()); + md.setResolutionPath(rsrc.getPath()); + StringBuilder sb = new StringBuilder(); + sb.append("."); + if ( selectors != null ) { + sb.append(selectors); + sb.append("."); + } + sb.append(extension); + md.setResolutionPathInfo(sb.toString()); + SlingHttpServletRequestBuilder builder = Builders.newRequestBuilder(rsrc); + builder.withExtension(extension); + if (selectors != null) { + builder.withSelectors(selectors.split("\\.")); + } + builder.withRequestMethod(method); + return builder.build(); } @Override @@ -129,8 +145,6 @@ public abstract class HelperTestBase extends TestCase { super.tearDown(); resourceResolver = null; - request = null; resource = null; } - } diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java index 2133887..c93e214 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java @@ -32,12 +32,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.SyntheticResource; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; import org.apache.sling.testing.mock.sling.junit.SlingContext; import org.junit.Before; import org.junit.Rule; @@ -50,41 +51,40 @@ import org.mockito.Mockito; @RunWith(Parameterized.class) public class LocationCollectorTest { - - // Run the test both with and without resource caching enabled - @Parameters - public static Iterable<Object> data() { - return Arrays.asList(true, false); - } - - @Parameter - public boolean useResourceCaching; - - @Rule - public final SlingContext context = new SlingContext(); - - SearchPathOptions searchPathOptions = new SearchPathOptions(); + + // Run the test both with and without resource caching enabled + @Parameters + public static Iterable<Object> data() { + return Arrays.asList(true, false); + } + + @Parameter + public boolean useResourceCaching; + + @Rule + public final SlingContext context = new SlingContext(); + + SearchPathOptions searchPathOptions = new SearchPathOptions(); + protected String resourcePath; protected String resourceType; protected String resourceTypePath; protected String resourceSuperType; protected String resourceSuperTypePath; - - protected Resource resource; - protected MockSlingHttpServletRequest request; - - - protected ResourceResolver resolver; // required because of the spy - - @Before - public void setup() throws Exception { - - searchPathOptions = new SearchPathOptions(); - resolver = Mockito.spy(context.resourceResolver()); - Mockito.when(resolver.getSearchPath()).thenAnswer( invocation -> { - return searchPathOptions.getSearchPath(); - }); - + + protected Resource resource; + + protected ResourceResolver resolver; // required because of the spy + + @Before + public void setup() throws Exception { + + searchPathOptions = new SearchPathOptions(); + resolver = Mockito.spy(context.resourceResolver()); + Mockito.when(resolver.getSearchPath()).thenAnswer( invocation -> { + return searchPathOptions.getSearchPath(); + }); + resourceType = "foo:bar"; resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType); @@ -93,31 +93,35 @@ public class LocationCollectorTest { Resource parent = resolver.getResource("/content"); resource = resolver.create(parent, "page", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType)); + } + + protected SlingHttpServletRequest createRequest(final Resource r) { + return Builders.newRequestBuilder(r) + .withExtension("html") + .withSelectors("print", "A4") + .withRequestMethod("GET") + .build(); + } - request = new MockSlingHttpServletRequest(resourcePath, "print.A4", "html", null, null); - request.setMethod("GET"); - request.setResourceResolver(resolver); - request.setResource(resource); - - } - @Test public void testSearchPathEmpty() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r("/" + resourceTypePath), // /foo/bar r("/" + DEFAULT_RESOURCE_TYPE)); // /sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath1Element() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root0 @@ -126,15 +130,16 @@ public class LocationCollectorTest { final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(root0 + resourceTypePath), // /apps/foo/bar r(root0 + DEFAULT_RESOURCE_TYPE)); // /apps/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath2Elements() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] { @@ -145,7 +150,7 @@ public class LocationCollectorTest { final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(root0 + resourceTypePath), // /apps/foo/bar r(root1 + resourceTypePath), // /libs/foo/bar @@ -153,16 +158,16 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); // /libs/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + /** * Replace a resource with a different type - * + * * @param res the resource to replace * @param newResourceType the new resource type, or null to not change it * @param newResourceSuperType the new resource super type, or null to not change it * @return the new resource */ - protected void replaceResource(String newResourceType, String newResourceSuperType) { + protected Resource replaceResource(String newResourceType, String newResourceSuperType) { @SuppressWarnings("unchecked") Map<String, Object> props = new HashMap<>(resource.adaptTo(Map.class)); if (newResourceType != null) { @@ -172,11 +177,12 @@ public class LocationCollectorTest { props.put("sling:resourceSuperType", newResourceSuperType); } Resource r = addOrReplaceResource(resolver, resource.getPath(), props); - request.setResource(r); + return r; } @Test public void testSearchPathEmptyAbsoluteType() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); @@ -188,15 +194,16 @@ public class LocationCollectorTest { final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r("/" + DEFAULT_RESOURCE_TYPE)); // /sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath1ElementAbsoluteType() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root0 @@ -205,21 +212,22 @@ public class LocationCollectorTest { // absolute resource type resourceType = "/foo/bar"; resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType); - replaceResource(resourceType, null); + request = this.createRequest(replaceResource(resourceType, null)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - - + + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r(root0 + DEFAULT_RESOURCE_TYPE)); // /apps/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath2ElementsAbsoluteType() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] { @@ -230,42 +238,44 @@ public class LocationCollectorTest { // absolute resource type resourceType = "/foo/bar"; resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType); - replaceResource(resourceType, null); + request = this.createRequest(replaceResource(resourceType, null)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r(root0 + DEFAULT_RESOURCE_TYPE), // /apps/sling/servlet/default r(root1 + DEFAULT_RESOURCE_TYPE)); // /libs/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPathEmptyWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r("/" + resourceTypePath), // /foo/bar r("/" + resourceSuperTypePath), // /foo/superBar r("/" + DEFAULT_RESOURCE_TYPE)); // /sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath1ElementWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root0 @@ -274,21 +284,22 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(root0 + resourceTypePath), // /apps/foo/bar r(root0 + resourceSuperTypePath), // /apps/foo/superBar r(root0 + DEFAULT_RESOURCE_TYPE)); // /apps/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath2ElementsWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] { @@ -299,12 +310,12 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(root0 + resourceTypePath), // /apps/foo/bar r(root1 + resourceTypePath), // /libs/foo/bar @@ -314,9 +325,10 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); // /libs/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPathEmptyAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); @@ -327,21 +339,22 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r("/" + resourceSuperTypePath), // /foo/superBar r("/" + DEFAULT_RESOURCE_TYPE)); // /sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath1ElementAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root0 @@ -354,21 +367,22 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r(root0 + resourceSuperTypePath), // /apps/foo/superBar r(root0 + DEFAULT_RESOURCE_TYPE)); // /apps/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testSearchPath2ElementsAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] { @@ -383,12 +397,12 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /foo/bar r(root0 + resourceSuperTypePath), // /apps/foo/superBar @@ -397,9 +411,10 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); // /libs/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testScriptNameWithoutResourceType() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] { @@ -408,13 +423,13 @@ public class LocationCollectorTest { }); List<Resource> loc = getLocations("", null,""); - + List<Resource> expected = Arrays.asList( r("/apps"), r("/libs")); assertThat(loc,isSameResourceList(expected)); } - + @Test public void testScriptNameWithResourceType() { String root0 = "/apps/"; @@ -424,7 +439,7 @@ public class LocationCollectorTest { root1 }); List<Resource> loc = getLocations("a/b", null); - + List<Resource> expected = Arrays.asList( r(root0 + "a/b"), r(root1 + "a/b"), @@ -432,7 +447,7 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); assertThat(loc,isSameResourceList(expected)); } - + @Test public void testScriptNameWithResourceTypeAndSuperType() { String root0 = "/apps/"; @@ -441,7 +456,7 @@ public class LocationCollectorTest { root0, root1 }); - + List<Resource> loc = getLocations("a/b", "c/d"); List<Resource> expected = Arrays.asList( @@ -453,7 +468,7 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); assertThat(loc,isSameResourceList(expected)); } - + @Test public void testCircularResourceTypeHierarchy() throws PersistenceException { final String root1 = "/libs/"; @@ -482,7 +497,7 @@ public class LocationCollectorTest { resource3Props); List<Resource> loc = getLocations(resourceType, resourceSuperType); - + List<Resource> expected = Arrays.asList( r(root1 + resourceType), // /libs/foo/bar r(root1 + resourceSuperType), // /libs/foo/check1 @@ -490,17 +505,17 @@ public class LocationCollectorTest { r(root1 + DEFAULT_RESOURCE_TYPE)); // /libs/sling/servlet/default assertThat(loc,isSameResourceList(expected)); } - + @Test public void testResolveDefaultResourceType() { - + searchPathOptions.setSearchPaths(new String[] { "/apps/", "/libs/" }); - + List<Resource> loc = getLocations(DEFAULT_RESOURCE_TYPE, resourceSuperType); - + List<Resource> expected = Arrays.asList( r("/apps/sling/servlet/default"), r("/libs/sling/servlet/default"), @@ -508,32 +523,32 @@ public class LocationCollectorTest { r("/libs/sling/servlet/default")); assertThat(loc,isSameResourceList(expected)); } - + @Test public void testAbsoluteResourceSuperType() throws Exception { final String root = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root }); - + String resourceType="a/b"; String resourceTypePath= root + resourceType; - + String resourceSuperType= "/apps/c/d"; String resourceSuperTypePath = resourceSuperType; - + Map<String, Object> resourceTypeProps = new HashMap<>(); resourceTypeProps.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType); resourceTypeProps.put("sling:resourceSuperType", resourceSuperType); - + resolver.create(getOrCreateParentResource(resolver, resourceTypePath), ResourceUtil.getName(resourceTypePath), resourceTypeProps); resolver.create(getOrCreateParentResource(resolver, resourceSuperTypePath), ResourceUtil.getName(resourceSuperTypePath), null); - - + + List<Resource> loc = getLocations(resourceType, resourceSuperType); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /apps/a/b r(resourceSuperTypePath), // /apps/c/d @@ -541,42 +556,43 @@ public class LocationCollectorTest { ); assertThat(loc,isSameResourceList(expected)); } - + @Test public void testNoSuperType() throws Exception { final String root = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root }); - + String resourceType="a/b"; String resourceTypePath= root + resourceType; - + Map<String, Object> resourceTypeProps = new HashMap<>(); resourceTypeProps.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType); - + resolver.create(getOrCreateParentResource(resolver, resourceTypePath), ResourceUtil.getName(resourceTypePath), resourceTypeProps); - - + + List<Resource> loc = getLocations(resourceType, resourceSuperType); - + List<Resource> expected = Arrays.asList( r(resourceTypePath), // /apps/a/b r(root + DEFAULT_RESOURCE_TYPE) // /apps/sling/servlet/default ); assertThat(loc,isSameResourceList(expected)); } - + @Test public void checkThatTheCacheIsUsed() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // skip if the test runs without caching if (!useResourceCaching) { return; } - + // The basic test setup is copied from testSearchPath2ElementsWithSuper String root0 = "/apps/"; String root1 = "/libs/"; @@ -591,7 +607,7 @@ public class LocationCollectorTest { replaceResource(null, resourceSuperType); final Resource r = request.getResource(); - + // Execute the same call twice and expect that on 2nd time the ResourceResolver // is never used, because all is taken from the cache getLocations(r.getResourceType(), @@ -600,20 +616,21 @@ public class LocationCollectorTest { getLocations(r.getResourceType(), r.getResourceSuperType()); Mockito.verify(resolver, Mockito.never()).getResource(Mockito.anyString()); - + // validate the cache cleanup int cacheEntries = ((Map<String,Resource>) resolver.getPropertyMap().get(LocationCollector.CACHE_KEY)).size(); assertTrue(cacheEntries > 0); LocationCollector.clearCache(resolver); assertEquals(0,((Map<String,Resource>) resolver.getPropertyMap().get(LocationCollector.CACHE_KEY)).size()); - + } - + @Test public void testWithCacheMapKeyAlreadyUsed() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // if the cacheKey in the ResourceResolverMap is already used, make sure that it's not overwritten // this is an adapted copy of the testSearchPath1Element testcase - + String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] { root0 @@ -624,49 +641,47 @@ public class LocationCollectorTest { r.getResourceResolver().getPropertyMap().put(LocationCollector.CACHE_KEY, storedElement); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); - + List<Resource> expected = Arrays.asList( r(root0 + resourceTypePath), // /apps/foo/bar r(root0 + DEFAULT_RESOURCE_TYPE)); // /apps/sling/servlet/default assertThat(loc,isSameResourceList(expected)); - + assertEquals(storedElement, r.getResourceResolver().getPropertyMap().get(LocationCollector.CACHE_KEY)); - + // make sure that a cache clear does not clear this entry LocationCollector.clearCache(resolver); assertEquals(storedElement, r.getResourceResolver().getPropertyMap().get(LocationCollector.CACHE_KEY)); - - } - - + + // --- helper --- - + private Resource r (String path) { return new SyntheticResource(resolver, path, "resourcetype"); } - - + + List<Resource> getLocations(final String resourceType, final String resourceSuperType) { return getLocations(resourceType, resourceSuperType, DEFAULT_RESOURCE_TYPE); } - + List<Resource> getLocations( final String resourceType, final String resourceSuperType, final String baseResourceType) { - + return LocationCollector.getLocations(resourceType, resourceSuperType, baseResourceType, resolver, useResourceCaching); } - + // Mimic the searchpath semantic of the ResourceResolverFactory public class SearchPathOptions { - + String[] searchPath = new String[0]; - + public void setSearchPaths(String[] searchpath) { if (searchpath == null) { this.searchPath = new String[0]; @@ -674,12 +689,9 @@ public class LocationCollectorTest { this.searchPath = searchpath; } } - + public String[] getSearchPath() { return searchPath; } } - - - } diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java index 965bc6b..7196dbb 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceUtil; @@ -41,6 +42,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServlets0() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 "/" + label + ".html.esp", // 2 @@ -54,10 +56,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 }; int[] indices = { 7, 5, 6, 4, 2, 3, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets1() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 "/" + label + ".html.esp", // 2 @@ -71,10 +74,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 7, 6, 3, 2, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets2() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 "/" + label + ".html.esp", // 2 @@ -89,10 +93,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 8, 7, 2, 3, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets3() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".esp", // 1 "/GET.esp", // 2 @@ -108,10 +113,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 9, 8, 3, 4, 1, 2, 0 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets4() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".esp", // 1 "/GET.esp", // 2 @@ -128,10 +134,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 }; int[] indices = { 10, 9, 3, 4, 1, 2, 0 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServletsWithMethod() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/html.servlet", // 7 "/html.GET.servlet" @@ -140,10 +147,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 1, 1}; int[] indices = { 1, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServletsScriptExtensionsPriority() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = {".servlet", // 0 "/" + label + ".esp", // 1 "/GET.esp", // 2 @@ -163,7 +171,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){ + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>(){ private static final long serialVersionUID = -2278401285444759128L; { add("esp"); @@ -174,6 +182,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServletsScriptExtensionsPriority2() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); // scripts with extensions not registered by script engine factories String[] names = {".servlet", // 0 "/" + label + ".esp", // 1 @@ -194,7 +203,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){ + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>(){ private static final long serialVersionUID = 4918721764309621104L; { add("esp"); @@ -203,6 +212,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServletsScriptExtensionsPriority3() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); // scripts with extensions not registered by script engine factories String[] names = {".servlet", // 0 "/" + label + ".esp", // 1 @@ -223,7 +233,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){ + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>(){ private static final long serialVersionUID = 1527098044127506711L; { add("esp"); @@ -233,7 +243,7 @@ public class ResourceCollectorTest extends HelperTestBase { public void testAnyServlets0() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 "/ANY.esp", // 1 @@ -248,12 +258,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 }; int[] indices = { 7, 5, 6, 4, 2, 3, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets1() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 "/ANY.esp", // 1 @@ -268,12 +278,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 7, 6, 3, 2, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets2() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 "/ANY.esp", // 1 @@ -289,12 +299,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 8, 7, 2, 3, 0, 1 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets3() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".ANY.esp", // 1 @@ -311,12 +321,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; int[] indices = { 9, 8, 3, 4, 1, 2, 0 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets4() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".ANY.esp", // 1 @@ -334,12 +344,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 }; int[] indices = { 10, 9, 3, 4, 1, 2, 0 }; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServletsScriptExtensionsPriority() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = {".servlet", // 0 "/" + label + ".ANY.esp", // 1 @@ -360,7 +370,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){ + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>(){ private static final long serialVersionUID = 3909592432283252117L; { add("esp"); @@ -370,11 +380,11 @@ public class ResourceCollectorTest extends HelperTestBase { }}); } - protected void effectiveTest(String[] names, int[] baseIdxs, int[] indices) { - effectiveTest(names, baseIdxs, indices, null); + protected void effectiveTest(SlingHttpServletRequest r, String[] names, int[] baseIdxs, int[] indices) { + effectiveTest(r, names, baseIdxs, indices, null); } - protected void effectiveTest(String[] names, int[] baseIdxs, int[] indices, List<String> scriptEngineExtensions) { + protected void effectiveTest(SlingHttpServletRequest r, String[] names, int[] baseIdxs, int[] indices, List<String> scriptEngineExtensions) { String[] base = { "/apps/" + resourceTypePath, "/libs/" + resourceTypePath }; @@ -389,12 +399,12 @@ public class ResourceCollectorTest extends HelperTestBase { pathMap.put(name, path); } - ResourceCollector lu = ResourceCollector.create(request, null, new String[] {"html"}, true); + ResourceCollector lu = ResourceCollector.create(r, null, new String[] {"html"}, true); Collection<Resource> res; if (scriptEngineExtensions != null) { - res = lu.getServlets(request.getResourceResolver(), scriptEngineExtensions); + res = lu.getServlets(r.getResourceResolver(), scriptEngineExtensions); } else { - res = lu.getServlets(request.getResourceResolver(), Collections.emptyList()); + res = lu.getServlets(r.getResourceResolver(), Collections.emptyList()); } Iterator<Resource> rIter = res.iterator(); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java index be28f2d..ee0ddb6 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java @@ -21,8 +21,8 @@ package org.apache.sling.servlets.resolver.internal.helper; import java.util.Collection; import java.util.Collections; +import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; /** Various tests that explain and demonstrate how scripts are * selected. See the assertScript methods for how to interpret @@ -66,7 +66,7 @@ public class ScriptSelectionTest extends HelperTestBase { } // Create mock request and get scripts from ResourceCollector - final MockSlingHttpServletRequest req = makeRequest(method, selectors, extension); + final SlingHttpServletRequest req = makeRequest(method, selectors, extension); final ResourceCollector u = ResourceCollector.create(req, null, new String[] {"html"}, true); final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.emptyList()); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java index 9a6b285..468f5a0 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java @@ -33,8 +33,11 @@ import javax.servlet.Servlet; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.api.resource.SyntheticResource; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.resource.Resource; import org.apache.sling.servlets.resolver.api.IgnoredServletResourcePredicate; import org.apache.sling.servlets.resolver.internal.SlingServletResolverTestBase; import org.apache.sling.servlets.resolver.internal.helper.HelperTestBase; @@ -46,6 +49,8 @@ public class ServletHidingTest extends SlingServletResolverTestBase { private static final String TEST_ID = UUID.randomUUID().toString(); + private static final String TEST_RESOURCE_TYPE = "foo/bar"; + protected static class TestServlet extends SlingSafeMethodsServlet { private final String id; @@ -77,15 +82,16 @@ public class ServletHidingTest extends SlingServletResolverTestBase { } private Servlet resolveServlet() { - MockSlingHttpServletRequest req = new MockSlingHttpServletRequest( - MockSlingHttpServletRequest.RESOURCE_TYPE, null, "html", null, null); - req.setResourceResolver(mockResourceResolver); + final Resource resource = new SyntheticResource(mockResourceResolver, "/content/foobar", TEST_RESOURCE_TYPE); + SlingHttpServletRequest req = Builders.newRequestBuilder(resource) + .withExtension("html") + .build(); return servletResolver.resolveServlet(req); } @Override protected void defineTestServlets(Bundle bundle) { - registerServlet(TEST_ID, MockSlingHttpServletRequest.RESOURCE_TYPE); + registerServlet(TEST_ID, TEST_RESOURCE_TYPE); } private void assertResolvesToTestServletId(String info, boolean expectMatch) { diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java b/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java index 6d4df30..5d30a9d 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java @@ -32,7 +32,10 @@ import jakarta.json.stream.JsonGenerator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.sling.servlethelpers.MockSlingHttpServletResponse; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletResponseResult; +import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -84,7 +87,7 @@ public class SLING10478IT extends ServletResolverTestSupport { resp.setContentType("text/plain"); resp.getWriter().print("hello error"); - + // response writer remains unclosed } @@ -96,11 +99,6 @@ public class SLING10478IT extends ServletResolverTestSupport { .register(bundleContext); } - @Override - protected MockSlingHttpServletResponse createMockSlingHttpServletResponse() { - return new HandleErrorMockSlingHttpServletResponse(); - } - /** * Test an error handling servlet that closes the response writer */ @@ -117,9 +115,15 @@ public class SLING10478IT extends ServletResolverTestSupport { checkErrorHandlerServlet("/not_real_path.noclose"); } + protected SlingHttpServletResponse createMockSlingHttpServletResponse() { + final SlingHttpServletResponse response = Builders.newResponseBuilder().build(); + return new HandleErrorMockSlingHttpServletResponse(response); + } + void checkErrorHandlerServlet(String path) throws Exception, InvocationTargetException { try { - final String output = executeRequest(M_GET, path, HttpServletResponse.SC_NOT_FOUND).getOutputAsString(); + final SlingHttpServletResponse response = executeRequest(M_GET, path, HttpServletResponse.SC_NOT_FOUND); + final String output = ((SlingHttpServletResponseResult)((HandleErrorMockSlingHttpServletResponse)response).getResponse()).getOutputAsString(); assertNotNull(output); assertTrue(output, output.contains("hello")); } catch (InvocationTargetException t) { @@ -132,15 +136,19 @@ public class SLING10478IT extends ServletResolverTestSupport { } } - - /** - * Subclass to simulate what the SlingHttpServletResponseImpl writer does + /** + * Subclass to simulate what the SlingHttpServletResponseImpl writer does */ - private static final class HandleErrorMockSlingHttpServletResponse extends MockSlingHttpServletResponse { + private static final class HandleErrorMockSlingHttpServletResponse extends SlingHttpServletResponseWrapper { + private HandleErrorResponseWriter writer = null; + public HandleErrorMockSlingHttpServletResponse(final SlingHttpServletResponse r) { + super(r); + } + @Override - public PrintWriter getWriter() { + public PrintWriter getWriter() throws IOException{ if (writer == null) { writer = new HandleErrorResponseWriter(super.getWriter()); } @@ -148,7 +156,7 @@ public class SLING10478IT extends ServletResolverTestSupport { } @Override - public void flushBuffer() { + public void flushBuffer() throws IOException { if (!writer.isOpen()) { throw new IllegalStateException("Writer Already Closed"); } @@ -157,7 +165,7 @@ public class SLING10478IT extends ServletResolverTestSupport { } /** - * Subclass to simulate what the SlingHttpServletResponseImpl writer does + * Subclass to simulate what the SlingHttpServletResponseImpl writer does */ private static final class HandleErrorResponseWriter extends PrintWriter { @@ -176,7 +184,5 @@ public class SLING10478IT extends ServletResolverTestSupport { public boolean isOpen() { return open; } - } - } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java b/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java new file mode 100644 index 0000000..a1cb7cc --- /dev/null +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.sling.servlets.resolver.it; + +import javax.script.ScriptEngineManager; + +import org.osgi.service.component.annotations.Component; + +@Component(service = ScriptEngineManager.class) +public class ScriptEngineManagerMock extends ScriptEngineManager { + + // nothing to do +} diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java index a0ae52e..5641bef 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java @@ -18,34 +18,32 @@ */ package org.apache.sling.servlets.resolver.it; -import java.lang.reflect.Method; - import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletResponseResult; +import org.apache.sling.api.resource.AbstractResource; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.engine.SlingRequestProcessor; -import org.apache.sling.servlethelpers.MockSlingHttpServletRequest; -import org.apache.sling.servlethelpers.MockSlingHttpServletResponse; import org.apache.sling.testing.paxexam.TestSupport; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.options.extra.VMOption; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; -import static org.apache.sling.testing.paxexam.SlingOptions.sling; -import static org.apache.sling.testing.paxexam.SlingOptions.slingScripting; -import static org.apache.sling.testing.paxexam.SlingOptions.slingXss; -import static org.apache.sling.testing.paxexam.SlingOptions.versionResolver; -import static org.apache.sling.testing.paxexam.SlingVersionResolver.SLING_GROUP_ID; +import static org.apache.sling.testing.paxexam.SlingOptions.eventadmin; +import static org.apache.sling.testing.paxexam.SlingOptions.scr; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.ops4j.pax.exam.CoreOptions.composite; -import static org.ops4j.pax.exam.CoreOptions.junitBundles; import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.CoreOptions.options; import static org.ops4j.pax.exam.CoreOptions.vmOption; @@ -56,15 +54,11 @@ import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration; public class ServletResolverTestSupport extends TestSupport { @Inject - private ResourceResolverFactory resourceResolverFactory; + protected ResourceResolverFactory resourceResolverFactory; @Inject protected BundleContext bundleContext; - @SuppressWarnings("unused") - @Inject - private SlingRequestProcessor slingRequestProcessor; - public static final String P_PATHS = "sling.servlet.paths"; public static final String P_RESOURCE_TYPES = "sling.servlet.resourceTypes"; public static final String P_METHODS = "sling.servlet.methods"; @@ -96,37 +90,37 @@ public class ServletResolverTestSupport extends TestSupport { } final int httpPort = findFreePort(); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.api"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.resourceresolver"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.scripting.core"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.commons.johnzon"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.engine"); - versionResolver.setVersion(SLING_GROUP_ID, "org.apache.sling.auth.core", "1.6.0"); - versionResolver.setVersion("commons-fileupload", "commons-fileupload", "1.5"); return options( composite( when(debugOption != null).useOptions(debugOption), when(vmOption != null).useOptions(vmOption), when(jacocoCommand != null).useOptions(jacocoCommand), baseConfiguration(), - sling(), - slingScripting(), - slingXss(), + mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.http.servlet-api").version("3.0.0"), + mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.http.jetty12").version("1.0.26"), + scr(), + eventadmin(), + mavenBundle().groupId("org.osgi").artifactId("org.osgi.util.converter").version("1.0.9"), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.johnzon").versionAsInProject(), + mavenBundle().groupId("commons-io").artifactId("commons-io").versionAsInProject(), + mavenBundle().groupId("commons-codec").artifactId("commons-codec").version("1.15"), + mavenBundle().groupId("org.apache.commons").artifactId("commons-lang3").versionAsInProject(), + mavenBundle().groupId("org.apache.commons").artifactId("commons-collections4").version("4.4"), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.mime").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.osgi").version("2.4.2"), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.api").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.scripting.spi").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.serviceusermapper").versionAsInProject(), + mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.healthcheck.api").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.auth.core").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.resourceresolver").versionAsInProject(), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.settings").version("1.4.2"), + mavenBundle().groupId("commons-fileupload").artifactId("commons-fileupload").version("1.5"), + mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.engine").versionAsInProject(), + factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended") .put("user.mapping", new String[]{"org.apache.sling.servlets.resolver:console=sling-readall", "org.apache.sling.servlets.resolver:scripts=sling-scripting"}) .asOption(), - - mavenBundle().groupId("org.osgi").artifactId("org.osgi.util.converter").version("1.0.9"), // new Sling API dependency - testBundle(), - mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.scripting.spi").versionAsInProject(), - mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.servlet-helpers").versionAsInProject(), - mavenBundle().groupId("org.glassfish").artifactId("jakarta.json").versionAsInProject(), - // - mavenBundle().groupId("commons-codec").artifactId("commons-codec").version("1.15"), - // - mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.healthcheck.api").versionAsInProject(), - // - junitBundles(), newConfiguration("org.apache.felix.http") .put("org.osgi.service.http.port", httpPort) .asOption(), @@ -135,8 +129,12 @@ public class ServletResolverTestSupport extends TestSupport { .asOption(), buildBundleWithBnd( TestResourceProvider.class, - TestServiceUserValidator.class + TestServiceUserValidator.class, + ScriptEngineManagerMock.class ), + + testBundle(), + newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist") .put("whitelist.bundles.regexp", "^PAXEXAM.*$") .asOption(), @@ -151,38 +149,56 @@ public class ServletResolverTestSupport extends TestSupport { return testBundle("bundle.filename"); } - protected MockSlingHttpServletResponse executeRequest(final String path, final int expectedStatus) throws Exception { + protected SlingHttpServletResponse createMockSlingHttpServletResponse() { + return Builders.newResponseBuilder().build(); + } + + protected SlingHttpServletResponse executeRequest(final String path, final int expectedStatus) throws Exception { return executeRequest("GET", path, expectedStatus); } - protected MockSlingHttpServletResponse executeRequest(final String method, final String path, final int expectedStatus) throws Exception { + protected SlingHttpServletResponse executeRequest(final String method, final String path, final int expectedStatus) throws Exception { final ResourceResolver resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null); assertNotNull("Expecting ResourceResolver", resourceResolver); - final MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(resourceResolver) { + final Resource resource = new AbstractResource() { @Override - public String getMethod() { - return method; + public String getPath() { + return path; + } + + @Override + public @NotNull String getResourceType() { + return "foo/bar"; + } + + @Override + public @Nullable String getResourceSuperType() { + return null; + } + + @Override + public @NotNull ResourceMetadata getResourceMetadata() { + return new ResourceMetadata(); + } + + @Override + public @NotNull ResourceResolver getResourceResolver() { + return resourceResolver; } }; - request.setPathInfo(path); - final MockSlingHttpServletResponse response = createMockSlingHttpServletResponse(); - - // Get SlingRequestProcessor.processRequest method and execute request - // This module depends on an older version of the sling.engine module and I don't want - // to change it just for these tests, so using reflection to get the processor, as we're - // running with a more recent version of sling.engine in the pax exam environment - final String slingRequestProcessorClassName = "org.apache.sling.engine.SlingRequestProcessor"; - final ServiceReference<?> ref = bundleContext.getServiceReference(slingRequestProcessorClassName); - assertNotNull("Expecting service:" + slingRequestProcessorClassName, ref); - - final Object processor = bundleContext.getService(ref); + + final SlingHttpServletRequest request = Builders + .newRequestBuilder(resource) + .withRequestMethod(method) + .build(); + final SlingHttpServletResponse response = createMockSlingHttpServletResponse(); + + final ServiceReference<SlingRequestProcessor> ref = bundleContext.getServiceReference(SlingRequestProcessor.class); + assertNotNull("Expecting service:" + SlingRequestProcessor.class, ref); + + final SlingRequestProcessor processor = bundleContext.getService(ref); try { - // void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse resource, ResourceResolver resourceResolver) - final Method processMethod = processor.getClass().getMethod( - "processRequest", - HttpServletRequest.class, HttpServletResponse.class, ResourceResolver.class); - assertNotNull("Expecting processRequest method", processMethod); - processMethod.invoke(processor, request, response, resourceResolver); + processor.processRequest(request, response, resourceResolver); } finally { bundleContext.ungetService(ref); } @@ -195,10 +211,6 @@ public class ServletResolverTestSupport extends TestSupport { return response; } - protected MockSlingHttpServletResponse createMockSlingHttpServletResponse() { - return new MockSlingHttpServletResponse(); - } - protected void assertTestServlet(final String path, int expectedStatus) throws Exception { assertTestServlet(M_GET, path, expectedStatus); } @@ -212,9 +224,9 @@ public class ServletResolverTestSupport extends TestSupport { } protected void assertTestServlet(final String method, final String path, final String servletName) throws Exception { - final String output = executeRequest(method, path, TestServlet.IM_A_TEAPOT).getOutputAsString(); + final SlingHttpServletResponse response = executeRequest(method, path, TestServlet.IM_A_TEAPOT); + final String output = ((SlingHttpServletResponseResult) response).getOutputAsString(); final String expected = TestServlet.SERVED_BY_PREFIX + servletName; assertTrue("Expecting output to contain " + expected + ", got " + output, output.contains(expected)); } - } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java index ee66b13..ebcda66 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java @@ -19,13 +19,13 @@ package org.apache.sling.servlets.resolver.it; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Dictionary; import java.util.Hashtable; import java.util.LinkedHashSet; import java.util.Set; +import java.util.jar.JarInputStream; -import javax.inject.Inject; import javax.script.ScriptException; import javax.servlet.Servlet; import javax.servlet.http.HttpServletRequest; @@ -34,7 +34,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.servlets.ServletResolverConstants; import org.apache.sling.scripting.spi.bundle.BundledRenderUnit; import org.apache.sling.scripting.spi.bundle.TypeProvider; @@ -48,8 +47,8 @@ import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; -import org.ops4j.pax.tinybundles.core.TinyBundle; -import org.ops4j.pax.tinybundles.core.TinyBundles; +import org.ops4j.pax.tinybundles.TinyBundle; +import org.ops4j.pax.tinybundles.TinyBundles; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -63,19 +62,13 @@ public class ServletResourceIT extends ServletResolverTestSupport { private BundledRenderUnit bundledRenderUnit; - @Inject - private ResourceResolverFactory resourceResolverFactory; - - @Inject - private BundleContext bundleContext; - protected Option testBundle() { try { - TinyBundle bundle = TinyBundles.bundle().read(new FileInputStream(System.getProperty("bundle.filename"))); + TinyBundle bundle = TinyBundles.bundle().readIn(new JarInputStream(new FileInputStream(System.getProperty("bundle.filename")))); String header = bundle.getHeader("Export-Package"); - bundle.set("Export-Package", header + ",org.apache.sling.servlets.resolver.internal.bundle"); + bundle.setHeader("Export-Package", header + ",org.apache.sling.servlets.resolver.internal.bundle"); return streamBundle(bundle.build()).start(); - } catch (FileNotFoundException e) { + } catch (IOException e) { throw new RuntimeException(e); } } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java b/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java index cec1ca0..518ce34 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java @@ -19,9 +19,7 @@ package org.apache.sling.servlets.resolver.it; import java.util.Iterator; - import org.apache.sling.api.resource.Resource; -import org.apache.sling.spi.resource.provider.ProviderContext; import org.apache.sling.spi.resource.provider.ResolveContext; import org.apache.sling.spi.resource.provider.ResourceContext; import org.apache.sling.spi.resource.provider.ResourceProvider; @@ -37,9 +35,6 @@ import org.osgi.service.component.annotations.Component; ) public class TestResourceProvider extends ResourceProvider<Void> { - public TestResourceProvider() { - } - @Override public @Nullable Resource getResource(@NotNull ResolveContext<Void> ctx, @NotNull String path, @NotNull ResourceContext resourceContext, @Nullable Resource parent) { return null; @@ -49,20 +44,4 @@ public class TestResourceProvider extends ResourceProvider<Void> { public @Nullable Iterator<Resource> listChildren(@NotNull ResolveContext<Void> ctx, @NotNull Resource parent) { return null; } - - @Override - public void start(@NotNull ProviderContext ctx) { - super.start(ctx); - } - - @Override - public void stop() { - super.stop(); - } - - @Override - public void update(long changeSet) { - super.update(changeSet); - } - }
