SLING-8936 - add more servlet selection tests
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 39a4fea..84e29d6 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
@@ -19,6 +19,7 @@
package org.apache.sling.servlets.resolver.it;
import org.apache.sling.testing.paxexam.TestSupport;
+import org.junit.Before;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
@@ -28,9 +29,37 @@
import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.servlethelpers.MockSlingHttpServletRequest;
+import org.apache.sling.servlethelpers.MockSlingHttpServletResponse;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
public class ServletResolverTestSupport extends TestSupport {
+ @Inject
+ private ResourceResolverFactory resourceResolverFactory;
+
+ @Inject
+ protected BundleContext bundleContext;
+
protected final int httpPort = findFreePort();
+ private final static int STARTUP_WAIT_SECONDS = 30;
+
@Configuration
public Option[] configuration() {
return new Option[]{
@@ -44,4 +73,64 @@
.asOption(),
};
}
+
+ @Before
+ public void waitForSling() throws Exception {
+ final int expectedStatus = 200;
+ final List<Integer> statuses = new ArrayList<>();
+ final String path = "/.json";
+ final long endTime = System.currentTimeMillis() + STARTUP_WAIT_SECONDS * 1000;
+
+ while(System.currentTimeMillis() < endTime) {
+ final int status = executeRequest(path, -1).getStatus();
+ statuses.add(status);
+ if(status == expectedStatus) {
+ return;
+ }
+ Thread.sleep(250);
+ }
+
+ fail("Did not get a " + expectedStatus + " status at " + path + " got " + statuses);
+ }
+
+
+ protected MockSlingHttpServletResponse executeRequest(final String path, final int expectedStatus) throws Exception {
+ final ResourceResolver resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
+ assertNotNull("Expecting ResourceResolver", resourceResolver);
+ final MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(resourceResolver);
+ request.setPathInfo(path);
+ final MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
+
+ // 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);
+ 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);
+ } finally {
+ bundleContext.ungetService(ref);
+ }
+
+ if(expectedStatus > 0) {
+ assertEquals("Expected status " + expectedStatus + " at " + path, expectedStatus, response.getStatus());
+ }
+
+ return response;
+ }
+
+ protected void assertTestServlet(final String path, final String servletName) throws Exception {
+ final String output = executeRequest(path, 200).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/ServletSelectionIT.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletSelectionIT.java
index 20be2d0..6e34c3d 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletSelectionIT.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletSelectionIT.java
@@ -18,22 +18,8 @@
*/
package org.apache.sling.servlets.resolver.it;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.servlethelpers.MockSlingHttpServletRequest;
import org.apache.sling.servlethelpers.MockSlingHttpServletResponse;
import org.junit.Before;
import org.junit.Test;
@@ -41,70 +27,30 @@
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.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class ServletSelectionIT extends ServletResolverTestSupport {
- private final static int STARTUP_WAIT_SECONDS = 30;
-
- @Inject
- private BundleContext bundleContext;
-
- @Inject
- private ResourceResolverFactory resourceResolverFactory;
-
- private MockSlingHttpServletResponse executeRequest(String path, int expectedStatus) throws Exception {
- final ResourceResolver resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
- assertNotNull("Expecting ResourceResolver", resourceResolver);
- final MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(resourceResolver);
- request.setPathInfo(path);
- final MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
-
- // 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);
- 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);
- } finally {
- bundleContext.ungetService(ref);
- }
-
- if(expectedStatus > 0) {
- assertEquals("Expected status " + expectedStatus + " at " + path, expectedStatus, response.getStatus());
- }
-
- return response;
- }
-
@Before
- public void waitForStableSling() throws Exception {
- final int expectedStatus = 200;
- final List<Integer> statuses = new ArrayList<>();
- final String path = "/.json";
- final long endTime = System.currentTimeMillis() + STARTUP_WAIT_SECONDS * 1000;
- while(System.currentTimeMillis() < endTime) {
- final int status = executeRequest(path, -1).getStatus();
- statuses.add(status);
- if(status == expectedStatus) {
- return;
- }
- Thread.sleep(250);
- }
- fail("Did not get a 200 status at " + path + " got " + statuses);
+ public void setupTestServlets() throws Exception {
+
+ new TestServlet("FooPathServlet")
+ .with("sling.servlet.paths", "/foo")
+ .register(bundleContext);
+
+ new TestServlet("ExtServlet")
+ .with("sling.servlet.resourceTypes", "sling/servlet/default")
+ .with("sling.servlet.methods", "GET")
+ .with("sling.servlet.extensions", "testext")
+ .register(bundleContext);
+
+ new TestServlet("ExtSelServlet")
+ .with("sling.servlet.resourceTypes", "sling/servlet/default")
+ .with("sling.servlet.methods", "GET")
+ .with("sling.servlet.extensions", "testext")
+ .with("sling.servlet.selectors", "testsel")
+ .register(bundleContext);
}
@Test
@@ -115,10 +61,41 @@
"jcr:primaryType\":\"rep:root",
"jcr:mixinTypes\":[\"rep:AccessControllable\"]"
};
- for(String s : expected) {
+ for(final String s : expected) {
assertTrue("Expecting in output: " + s + ", got " + content, content.contains(s));
}
}
+ @Test
+ public void testFooPathServlet() throws Exception {
+ assertTestServlet("/foo", "FooPathServlet");
+ }
+
+ @Test
+ public void testFooPathServletWithSelectorAndExtension() throws Exception {
+ assertTestServlet("/foo.someExtension", "FooPathServlet");
+ assertTestServlet("/foo.someSelector.someExtension", "FooPathServlet");
+ assertTestServlet("/foo.anotherSelector.someSelector.someExtension", "FooPathServlet");
+ }
+
+ @Test
+ public void testFooPathServletWithPathSuffix() throws Exception {
+ executeRequest("/foo/path/suffix", 404);
+ }
+
+ @Test
+ public void testExtServlet() throws Exception {
+ assertTestServlet("/.testext", "ExtServlet");
+ }
+
+ @Test
+ public void testExtSelServlet() throws Exception {
+ assertTestServlet("/.testsel.testext", "ExtSelServlet");
+ }
+
+ @Test
+ public void testNoServletForExtension() throws Exception {
+ executeRequest("/.yapas", 404);
+ }
}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/TestServlet.java b/src/test/java/org/apache/sling/servlets/resolver/it/TestServlet.java
new file mode 100644
index 0000000..11c08ea
--- /dev/null
+++ b/src/test/java/org/apache/sling/servlets/resolver/it/TestServlet.java
@@ -0,0 +1,57 @@
+/*
+ * 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 java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.osgi.framework.BundleContext;
+
+public class TestServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+ private final String name;
+ private final Dictionary<String, Object> properties = new Hashtable<>();
+
+ public static final String SERVED_BY_PREFIX = "SERVED_BY_";
+
+ public TestServlet(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ resp.getWriter().write(SERVED_BY_PREFIX + name);
+ }
+
+ TestServlet with(String key, Object value) {
+ properties.put(key, value);
+ return this;
+ }
+
+ void register(BundleContext context) {
+ context.registerService(Servlet.class.getName(), this, properties);
+ }
+}
\ No newline at end of file