blob: 4413e6e2ca0d920341bc7f244c6227c3f18eef81 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.equinox.http.servlet.tests;
import static org.junit.Assert.assertNotNull;
import java.util.Collection;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import org.eclipse.equinox.http.servlet.context.ContextPathCustomizer;
import org.eclipse.equinox.http.servlet.testbase.BaseTest;
import org.eclipse.equinox.http.servlet.tests.util.BaseServlet;
import org.eclipse.equinox.http.servlet.tests.util.MockSCL;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.hooks.service.FindHook;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.context.ServletContextHelper;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
public class ContextHelperCustomizerTests extends BaseTest {
@Rule
public TestName testName = new TestName();
private ServiceReference<HttpService> httpServiceReference;
private HttpService httpService;
private BundleContext context;
@Before
public void begin() throws Exception {
httpServiceReference = getBundleContext().getServiceReference(HttpService.class);
context = httpServiceReference.getBundle().getBundleContext();
httpService = context.getService(httpServiceReference);
}
@After
public void end() throws Exception {
context.ungetService(httpServiceReference);
}
@Test
public void testCreateDefaultHttpContextCreatesNewServletContextHelper() throws Exception {
HttpContext context1 = httpService.createDefaultHttpContext();
HttpContext context2 = httpService.createDefaultHttpContext();
Assert.assertNotEquals(context1, context2);
}
@Test
public void testServletContextHelpersNotHiddenWhenRegisteredUsingConsumingContext() throws Exception {
ServiceRegistration<ServletContextHelper> helperReg = null;
ServiceRegistration<FindHook> findHookReg = null;
try {
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "context1");
properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/context1");
//register a ServletContextHelper using the consuming bundle context "org.eclipse.equinox.http.servlet"
helperReg = context.registerService(ServletContextHelper.class, new ServletContextHelper() {}, properties);
FindHook findHook = new FindHook() {
@Override
public void find(
BundleContext bundleContext, String name, String filter,
boolean allServices, Collection<ServiceReference<?>> references) {
if (bundleContext != context) {
return;
}
// don't show ServletContextHelper
for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
ServiceReference<?> sr = iterator.next();
if ("context1".equals(sr.getProperty("osgi.http.whiteboard.context.name"))) {
iterator.remove();
}
}
}
};
findHookReg = context.registerService(FindHook.class, findHook, null);
AtomicReference<ServletContext> sc1 = new AtomicReference<ServletContext>();
properties = new Hashtable<String, Object>();
properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER, "true");
properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(osgi.http.whiteboard.context.name=context1)");
context.registerService(ServletContextListener.class, new MockSCL(sc1), properties);
//ServletContextHelpers registered using the consuming context should not be hidden
assertNotNull(sc1.get());
} finally {
if (helperReg != null) {
helperReg.unregister();
}
if (findHookReg != null) {
findHookReg.unregister();
}
}
}
@Test
public void testWBServletContextPathCustomizerContextPrefix() throws Exception {
ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
ServiceRegistration<ServletContextHelper> helperReg = null;
ServiceRegistration<Servlet> servlet = null;
ServiceRegistration<FindHook> findHookReg = null;
try {
Dictionary<String, String> helperProps = new Hashtable<String, String>();
helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "testContext" + testName.getMethodName());
helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/helperContext");
helperProps.put(TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
helperReg = context.registerService(ServletContextHelper.class, new TestServletContextHelperFactory(), helperProps);
//Pass the context path prefix paramater
ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor(null, "testPrefix", testName.getMethodName());
pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
FindHook findHook = new FindHook() {
@Override
public void find(
BundleContext bundleContext, String name, String filter,
boolean allServices, Collection<ServiceReference<?>> references) {
if (bundleContext != context) {
return;
}
// don't show ServletContextHelper
for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
ServiceReference<?> sr = iterator.next();
if (("testContext" + testName.getMethodName()).equals(sr.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME))) {
iterator.remove();
}
}
}
};
findHookReg = context.registerService(FindHook.class, findHook, null);
//Register a servlet service with a matching context helper
BaseServlet baseServlet = new BaseServlet("content");
Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();
serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/servlet");
serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=" + "testContext" + testName.getMethodName() + ")");
servlet = context.registerService(Servlet.class, baseServlet, serviceProps);
String actual = requestAdvisor.request("testPrefix/helperContext/servlet");
Assert.assertEquals("content", actual);
} finally {
if (helperReg != null) {
helperReg.unregister();
}
if (pathAdaptorReg != null) {
pathAdaptorReg.unregister();
}
if (servlet != null) {
servlet.unregister();
}
if (findHookReg != null) {
findHookReg.unregister();
}
}
}
@Test
public void testWBServletContextPathCustomizerDefaultFilter() throws Exception {
ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
ServiceRegistration<ServletContextHelper> helperReg = null;
ServiceRegistration<Servlet> servlet = null;
ServiceRegistration<FindHook> findHookReg = null;
try {
Dictionary<String, String> helperProps = new Hashtable<String, String>();
helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "testContext" + testName.getMethodName());
helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/helperContext");
helperProps.put(TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
helperReg = context.registerService(ServletContextHelper.class, new TestServletContextHelperFactory(), helperProps);
//Pass the filter parameter
ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor("(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=" + "testContext" + testName.getMethodName() + ")", null, testName.getMethodName());
pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
FindHook findHook = new FindHook() {
@Override
public void find(
BundleContext bundleContext, String name, String filter,
boolean allServices, Collection<ServiceReference<?>> references) {
if (bundleContext != context) {
return;
}
// don't show ServletContextHelper
for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
ServiceReference<?> sr = iterator.next();
if (("testContext" + testName.getMethodName()).equals(sr.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME))) {
iterator.remove();
}
}
}
};
findHookReg = context.registerService(FindHook.class, findHook, null);
//Register a servlet service with a matching context helper
BaseServlet baseServlet = new BaseServlet("content");
Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();
serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/servlet");
//Filter property
serviceProps.put("servlet.init." + TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
servlet = context.registerService(Servlet.class, baseServlet, serviceProps);
String actual = requestAdvisor.request("helperContext/servlet");
Assert.assertEquals("content", actual);
} finally {
if (helperReg != null) {
helperReg.unregister();
}
if (pathAdaptorReg != null) {
pathAdaptorReg.unregister();
}
if (servlet != null) {
servlet.unregister();
}
if (findHookReg != null) {
findHookReg.unregister();
}
}
}
@Test
public void testLegacyServletContextPathCustomizerContextPrefix() throws Exception {
ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
ServiceRegistration<FindHook> findHookReg = null;
try {
//Pass the context path prefix paramater
ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor(null, "testPrefix", testName.getMethodName()) {
@Override
public String getContextPathPrefix(ServiceReference<ServletContextHelper> helper) {
if (Boolean.TRUE.equals(helper.getProperty("equinox.legacy.context.helper"))) {
return contextPrefix;
}
return null;
}
};
pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
FindHook findHook = new FindHook() {
@Override
public void find(
BundleContext bundleContext, String name, String filter,
boolean allServices, Collection<ServiceReference<?>> references) {
if (bundleContext != context) {
return;
}
// don't show ServletContextHelper
for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
ServiceReference<?> sr = iterator.next();
if (Boolean.TRUE.equals(sr.getProperty("equinox.legacy.context.helper"))) {
iterator.remove();
}
iterator.remove();
}
}
};
findHookReg = context.registerService(FindHook.class, findHook, null);
//Register a servlet service using HttpService
BaseServlet baseServlet = new BaseServlet("content");
httpService.registerServlet("/servlet", baseServlet, null, null);
String actual = requestAdvisor.request("testPrefix/servlet");
Assert.assertEquals("content", actual);
} finally {
if (pathAdaptorReg != null) {
pathAdaptorReg.unregister();
}
if (findHookReg != null) {
findHookReg.unregister();
}
httpService.unregister("/servlet");
}
}
}