blob: c802238847714fe62185f6de3dd3742a9b6b6ac0 [file] [log] [blame]
/*
* 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.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.servlets.resolver.internal.resource.SlingServletConfig;
import org.apache.sling.servlets.resolver.it.ServletResolverTestSupport;
import org.junit.Test;
import org.osgi.framework.ServiceReference;
public class PathBasedServletAcceptorTest {
public static final String [] STRING_ARRAY = new String[0];
public static final String V_EMPTY = ".EMPTY.";
private final PathBasedServletAcceptor acceptor = new PathBasedServletAcceptor();
private class TestCase {
private Dictionary<String, Object> serviceProperties = new Hashtable<>();
private String extension;
private List<String> selectors = new ArrayList<>();
private String method;
TestCase() {
serviceProperties.put(ServletResolverTestSupport.P_STRICT_PATHS, true);
}
TestCase withServiceProperty(String key, Object value) {
serviceProperties.put(key, value);
return this;
}
TestCase withServiceProperty(String key, Object ... values) {
serviceProperties.put(key, values);
return this;
}
TestCase withExtension(String ext) {
extension = ext;
return this;
}
TestCase withSelector(String sel) {
selectors.add(sel);
return this;
}
TestCase withSelectors(String ... sels) {
selectors.addAll(Arrays.asList(sels));
return this;
}
TestCase withMethod(String m) {
method = m;
return this;
}
void assertAccept(boolean expected) {
// Stub the ServiceReference with our service properties
@SuppressWarnings("unchecked")
final ServiceReference<Servlet> reference = mock(ServiceReference.class);
final String [] keys = Collections.list(serviceProperties.keys()).toArray(STRING_ARRAY);
when(reference.getPropertyKeys()).thenReturn(keys);
for(String key: keys) {
when(reference.getProperty(key)).thenReturn(serviceProperties.get(key));
}
// Wire the Servlet to our ServiceReference
final ServletContext sc = mock(ServletContext.class);
final SlingServletConfig ssc = new SlingServletConfig(sc, reference, "42");
final Servlet servlet = mock(Servlet.class);
when(servlet.getServletConfig()).thenReturn(ssc);
// Setup the request values
final RequestPathInfo rpi = mock(RequestPathInfo.class);
when(rpi.getExtension()).thenReturn(extension);
when(rpi.getSelectors()).thenReturn(selectors.toArray(STRING_ARRAY));
final SlingHttpServletRequest request = mock(SlingHttpServletRequest.class);
when(request.getRequestPathInfo()).thenReturn(rpi);
when(request.getMethod()).thenReturn(method);
// And call the acceptor
final boolean actual = acceptor.accept(request, servlet);
assertEquals(expected, actual);
}
}
@Test
public void extensionNoMatch() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, "sp")
.withExtension("somethingElse")
.assertAccept(false);
}
@Test
public void extensionNone() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, "sp")
.assertAccept(false);
}
@Test
public void extensionNoMatchInN() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, "one", "two")
.withExtension("somethingElse")
.assertAccept(false);
}
@Test
public void extensionMatchOneInN() {
new TestCase()
// test various ways of setting multiple properties
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, (Object)new String[] { "one", "two" })
.withExtension("one")
.assertAccept(true);
}
@Test
public void extensionPropertyNotSet() {
new TestCase()
.withExtension("somethingElse")
.assertAccept(true);
}
@Test
public void selectorNoMatch() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "sel")
.withSelector("somethingElse")
.assertAccept(false);
}
@Test
public void selectorOneMatchesOne() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "sel")
.withSelector("sel")
.assertAccept(true);
}
@Test
public void selectorOneFromNInN() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "one", "two", "three")
.withSelectors("three", "and", "somethingElse")
.assertAccept(true);
}
@Test
public void selectorZeroInN() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "one", "two", "three")
.withExtension("three")
.assertAccept(false);
}
@Test
public void selectorOneInN() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "one", "two", "42")
.withSelectors("42")
.assertAccept(true);
}
@Test
public void selectorPropertyNotSet() {
new TestCase()
.withSelector("somethingElse")
.assertAccept(true);
}
@Test
public void methodNoMatch() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_METHODS, "meth")
.withMethod("somethingElse")
.assertAccept(false);
}
@Test
public void methodPropertyNotSet() {
new TestCase()
.withMethod("somethingElse")
.assertAccept(true);
}
@Test
public void testStringStrict() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, "true")
.withServiceProperty(ServletResolverTestSupport.P_METHODS, "meth")
.withMethod("somethingElse")
.assertAccept(false);
}
@Test
public void testStringFalseStrict() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, "false")
.withServiceProperty(ServletResolverTestSupport.P_METHODS, "meth")
.withMethod("somethingElse")
.assertAccept(true);
}
@Test
public void testBooleanFalseStrict() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, false)
.withServiceProperty(ServletResolverTestSupport.P_METHODS, "meth")
.withMethod("somethingElse")
.assertAccept(true);
}
@Test
public void testEmptyExtensionAndSelectorWithEmpty() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, V_EMPTY)
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, V_EMPTY)
.assertAccept(true);
}
@Test
public void testEmptyExtensionAndSelectorWithSelector() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, V_EMPTY)
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, V_EMPTY)
.withSelector("someSel")
.assertAccept(false);
}
@Test
public void testEmptyExtensionAndSelectorWithExtension() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, V_EMPTY)
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, V_EMPTY)
.withExtension("someExt")
.assertAccept(false);
}
@Test
public void testEmptyExtensionSpecificSelector() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, V_EMPTY)
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, "someSel")
.withSelector("someSel")
.assertAccept(true);
}
@Test
public void testEmptySelectorSpecificExtension() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_EXTENSIONS, "someExt")
.withServiceProperty(ServletResolverTestSupport.P_SELECTORS, V_EMPTY)
.withExtension("someExt")
.assertAccept(true);
}
@Test(expected = PathBasedServletAcceptor.InvalidPropertyException.class)
public void testEmptyMethodException() {
new TestCase()
.withServiceProperty(ServletResolverTestSupport.P_STRICT_PATHS, true)
.withServiceProperty(ServletResolverTestSupport.P_METHODS, V_EMPTY)
.assertAccept(true);
}
@Test
public void testNoSlingServletConfig() {
final Servlet s = mock(Servlet.class);
when(s.getServletConfig()).thenReturn(mock(ServletConfig.class));
assertTrue(acceptor.accept(null, s));
}
}