diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/PreprocessorTestCase.java')
-rw-r--r-- | bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/PreprocessorTestCase.java | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/PreprocessorTestCase.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/PreprocessorTestCase.java new file mode 100644 index 000000000..22a3683a5 --- /dev/null +++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/PreprocessorTestCase.java @@ -0,0 +1,208 @@ +/******************************************************************************* + * Copyright (c) Jan. 26, 2019 Liferay, Inc. + * + * 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 + * + * Contributors: + * Liferay, Inc. - tests + ******************************************************************************/ + +package org.eclipse.equinox.http.servlet.tests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.List; + +import javax.servlet.FilterChain; +import javax.servlet.Servlet; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +import org.eclipse.equinox.http.servlet.testbase.BaseTest; +import org.eclipse.equinox.http.servlet.tests.util.MockPreprocessor; +import org.eclipse.equinox.http.servlet.tests.util.MockServlet; +import org.junit.Test; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.http.runtime.dto.PreprocessorDTO; +import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; +import org.osgi.service.http.whiteboard.Preprocessor; + +public class PreprocessorTestCase extends BaseTest { + + @Test + public void testPreprocessorInitParameters() throws Exception { + Dictionary<String,Object> properties = new Hashtable<>(); + properties + .put(HttpWhiteboardConstants.HTTP_WHITEBOARD_PREPROCESSOR_INIT_PARAM_PREFIX + + "param1", "value1"); + properties + .put(HttpWhiteboardConstants.HTTP_WHITEBOARD_PREPROCESSOR_INIT_PARAM_PREFIX + + "param2", "value2"); + properties + .put(HttpWhiteboardConstants.HTTP_WHITEBOARD_PREPROCESSOR_INIT_PARAM_PREFIX + + "param3", 345l); + + long before = this.getHttpRuntimeChangeCount(); + final ServiceRegistration<Preprocessor> reg = getBundleContext() + .registerService(Preprocessor.class, new MockPreprocessor(), + properties); + registrations.add(reg); + this.waitForRegistration(before); + + final PreprocessorDTO[] dtos = this.getHttpServiceRuntime() + .getRuntimeDTO().preprocessorDTOs; + assertEquals(1, dtos.length); + + assertTrue(dtos[0].initParams.containsKey("param1")); + assertTrue(dtos[0].initParams.containsKey("param2")); + assertFalse(dtos[0].initParams.containsKey("param3")); + assertEquals(getServiceId(reg), dtos[0].serviceId); + } + + @Test + public void testPreprocessorRanking() throws Exception { + // register preprocessor with ranking -5 + Dictionary<String,Object> properties = new Hashtable<>(); + properties.put(Constants.SERVICE_RANKING, -5); + + long before = this.getHttpRuntimeChangeCount(); + registrations + .add(getBundleContext().registerService(Preprocessor.class.getName(), + new MockPreprocessor().around("d"), properties)); + before = this.waitForRegistration(before); + + // register preprocessor with ranking 8 + properties = new Hashtable<>(); + properties.put(Constants.SERVICE_RANKING, 8); + + registrations + .add(getBundleContext().registerService(Preprocessor.class.getName(), + new MockPreprocessor().around("a"), properties)); + before = this.waitForRegistration(before); + + // register preprocessor with invalid ranking + properties = new Hashtable<>(); + properties.put(Constants.SERVICE_RANKING, 3L); // this is invalid -> + // ranking = 0 + + registrations + .add(getBundleContext().registerService(Preprocessor.class.getName(), + new MockPreprocessor().around("b"), properties)); + before = this.waitForRegistration(before); + + // register preprocessor with no ranking + properties = new Hashtable<>(); + + registrations + .add(getBundleContext().registerService(Preprocessor.class.getName(), + new MockPreprocessor().around("c"), properties)); + before = this.waitForRegistration(before); + + // check that we have four preprocessors + final PreprocessorDTO[] dtos = this.getHttpServiceRuntime() + .getRuntimeDTO().preprocessorDTOs; + assertEquals(4, dtos.length); + + // register endpoint + properties = new Hashtable<>(); + properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, + "/available"); + registrations.add(getBundleContext().registerService( + Servlet.class, new MockServlet().content("hello"), properties)); + + assertEquals("abcdhellodcba", requestAdvisor.request("available")); + } + + /** + * Test a request with a servlet registered at that url and check if the + * preprocessor is invoked. Do the same with a non existing url. + */ + @Test + public void testPreprocessorInvocation() throws Exception { + // register preprocessor + final List<String> filterActions = new ArrayList<>(); + long before = this.getHttpRuntimeChangeCount(); + registrations.add(getBundleContext().registerService( + Preprocessor.class.getName(), new MockPreprocessor() { + + @Override + public void doFilter(ServletRequest request, + ServletResponse response, FilterChain chain) + throws IOException, ServletException { + filterActions.add("a"); + super.doFilter(request, new HttpServletResponseWrapper( + (HttpServletResponse) response) { + + private boolean hasStatus = false; + + private void addStatus(final int sc) { + if (!hasStatus) { + hasStatus = true; + filterActions.add(String.valueOf(sc)); + } + } + + @Override + public void setStatus(int sc) { + addStatus(sc); + super.setStatus(sc); + } + + @Override + public void sendError(int sc, String msg) + throws IOException { + addStatus(sc); + super.sendError(sc, msg); + } + + @Override + public void sendError(int sc) throws IOException { + addStatus(sc); + super.sendError(sc); + } + + }, chain); + filterActions.add("b"); + } + + }, null)); + before = this.waitForRegistration(before); + + // register endpoint + Dictionary<String,Object> properties = new Hashtable<>(); + properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, + "/available"); + registrations.add(getBundleContext().registerService( + Servlet.class, new MockServlet().content("hello"), properties)); + + assertEquals("hello", requestAdvisor.request("available")); + assertEquals(2, filterActions.size()); + assertEquals("a", filterActions.get(0)); + assertEquals("b", filterActions.get(1)); + + // request a non existing pattern - this will somehow set the status + // code to 404 + filterActions.clear(); + requestAdvisor.request("foo", null); + assertEquals(3, filterActions.size()); + assertEquals("a", filterActions.get(0)); + assertEquals("404", filterActions.get(1)); + assertEquals("b", filterActions.get(2)); + } + +} |