/* | |
* 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.pluto.testsuite.test; | |
import java.io.IOException; | |
import java.util.Arrays; | |
import java.util.Map; | |
import javax.portlet.PortletContext; | |
import javax.portlet.PortletException; | |
import javax.portlet.PortletRequest; | |
import javax.portlet.PortletRequestDispatcher; | |
import javax.portlet.PortletResponse; | |
import javax.portlet.RenderRequest; | |
import javax.portlet.RenderResponse; | |
import javax.servlet.GenericServlet; | |
import javax.servlet.ServletException; | |
import javax.servlet.ServletRequest; | |
import javax.servlet.ServletResponse; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import org.apache.pluto.testsuite.TestResult; | |
import org.apache.pluto.testsuite.TestUtils; | |
/** | |
* | |
* @version 1.0 | |
* @since Mar 9, 2005 | |
*/ | |
public class DispatcherRenderParameterTest | |
extends AbstractReflectivePortletTest { | |
/** Internal logger. */ | |
private static final Log LOG = LogFactory.getLog( | |
DispatcherRenderParameterTest.class); | |
// Static Final Constants -------------------------------------------------- | |
/** The path to the companion servlet. */ | |
private static final String SERVLET_PATH = "/test/DispatcherRenderParameterTest_Servlet"; | |
private static final String KEY_TARGET = "target"; | |
private static final String TARGET_PARAMS = "testParams"; | |
private static final String TARGET_SAME_NAME_PARAM = "testSameNameParam"; | |
private static final String TARGET_ADDED_SAME_NAME_PARAM = "testAddedSameNameParam"; | |
private static final String TARGET_INVALID_PARAMS = "testInvalidParams"; | |
private static final String KEY_RENDER = "renderParamKey"; | |
private static final String VALUE_RENDER = "renderParamValue"; | |
private static final String VALUE_ADDED1 = "addedParamValue1"; | |
private static final String VALUE_ADDED2 = "addedParamValue2"; | |
private static final String KEY_A = "includedTestKeyA"; | |
private static final String VALUE_A = "includedTestValueA"; | |
private static final String KEY_B = "includedTestKeyB"; | |
private static final String VALUE_B = "includedTestValueB"; | |
private static final String KEY_C = "includedTestKeyC"; | |
private static final String VALUE_C1 = "valueOneOfKeyC"; | |
private static final String VALUE_C2 = "valueTwoOfKeyC"; | |
private static final String VALUE_C3 = "valueThreeOfKeyC"; | |
public static final String RESULT_KEY = | |
DispatcherRenderParameterTest.class.getName() + ".RESULT_KEY"; | |
// AbstractReflectivePortletTest Impl -------------------------------------- | |
/** | |
* Overwrites <code>super.getRenderParameters(..)</code> to set the | |
* test-specific render parameter in the render URL. | |
*/ | |
public Map<String, String[]> getRenderParameters(PortletRequest request) { | |
Map<String, String[]> parameterMap = super.getRenderParameters(request); | |
parameterMap.put(KEY_RENDER, new String[] { VALUE_RENDER }); | |
return parameterMap; | |
} | |
// Test Methods ------------------------------------------------------------ | |
protected TestResult checkParameters(PortletContext context, | |
PortletRequest request, | |
PortletResponse response) | |
throws IOException, PortletException { | |
// Dispatch to the companion servlet: call checkParameters(). | |
StringBuffer buffer = new StringBuffer(); | |
buffer.append(SERVLET_PATH).append("?") | |
.append(KEY_TARGET).append("=").append(TARGET_PARAMS) | |
.append("&").append(KEY_A).append("=").append(VALUE_A) | |
.append("&").append(KEY_B).append("=").append(VALUE_B); | |
if (LOG.isDebugEnabled()) { | |
LOG.debug("Dispatching to: " + buffer.toString()); | |
} | |
PortletRequestDispatcher dispatcher = context.getRequestDispatcher( | |
buffer.toString()); | |
dispatcher.include((RenderRequest) request, (RenderResponse) response); | |
// Retrieve test result returned by the companion servlet. | |
TestResult result = (TestResult) request.getAttribute(RESULT_KEY); | |
request.removeAttribute(RESULT_KEY); | |
return result; | |
} | |
protected TestResult checkSameNameParameter(PortletContext context, | |
PortletRequest request, | |
PortletResponse response) | |
throws IOException, PortletException { | |
// Dispatch to the companion servlet: call checkSameNameParameter(). | |
StringBuffer buffer = new StringBuffer(); | |
buffer.append(SERVLET_PATH).append("?") | |
.append(KEY_TARGET).append("=").append(TARGET_SAME_NAME_PARAM) | |
.append("&").append(KEY_C).append("=").append(VALUE_C1) | |
.append("&").append(KEY_C).append("=").append(VALUE_C2) | |
.append("&").append(KEY_C).append("=").append(VALUE_C3); | |
if (LOG.isDebugEnabled()) { | |
LOG.debug("Dispatching to: " + buffer.toString()); | |
} | |
PortletRequestDispatcher dispatcher = context.getRequestDispatcher( | |
buffer.toString()); | |
dispatcher.include((RenderRequest) request, (RenderResponse) response); | |
// Retrieve test result returned by the companion servlet. | |
TestResult result = (TestResult) request.getAttribute(RESULT_KEY); | |
request.removeAttribute(RESULT_KEY); | |
return result; | |
} | |
protected TestResult checkAddedSameNameParameter(PortletContext context, | |
PortletRequest request, | |
PortletResponse response) | |
throws IOException, PortletException { | |
// Dispatch to the companion servlet: call checkAddedSameNameParameter(). | |
StringBuffer buffer = new StringBuffer(); | |
buffer.append(SERVLET_PATH).append("?") | |
.append(KEY_TARGET).append("=").append(TARGET_ADDED_SAME_NAME_PARAM) | |
.append("&").append(KEY_RENDER).append("=").append(VALUE_ADDED1) | |
.append("&").append(KEY_RENDER).append("=").append(VALUE_ADDED2); | |
if (LOG.isDebugEnabled()) { | |
LOG.debug("Dispatching to: " + buffer.toString()); | |
} | |
PortletRequestDispatcher dispatcher = context.getRequestDispatcher( | |
buffer.toString()); | |
dispatcher.include((RenderRequest) request, (RenderResponse) response); | |
// Retrieve test result returned by the companion servlet. | |
TestResult result = (TestResult) request.getAttribute(RESULT_KEY); | |
request.removeAttribute(RESULT_KEY); | |
return result; | |
} | |
protected TestResult checkInvalidParameters(PortletContext context, | |
PortletRequest request, | |
PortletResponse response) | |
throws IOException, PortletException { | |
// Dispatch to the companion servlet: call checkInvalidParameters(). | |
StringBuffer buffer = new StringBuffer(); | |
buffer.append(SERVLET_PATH).append("?") | |
.append(KEY_TARGET).append("=").append(TARGET_INVALID_PARAMS) | |
.append("&").append(KEY_A) | |
.append("&").append(KEY_B).append("=").append(VALUE_B) | |
.append("&").append(KEY_C).append("="); | |
if (LOG.isDebugEnabled()) { | |
LOG.debug("Dispatching to: " + buffer.toString()); | |
} | |
PortletRequestDispatcher dispatcher = context.getRequestDispatcher( | |
buffer.toString()); | |
dispatcher.include((RenderRequest) request, (RenderResponse) response); | |
// Retrieve test result returned by the companion servlet. | |
TestResult result = (TestResult) request.getAttribute(RESULT_KEY); | |
request.removeAttribute(RESULT_KEY); | |
return result; | |
} | |
// Nested Companion Servlet Class ------------------------------------------ | |
/** | |
* Nested static companion servlet class. | |
*/ | |
public static class CompanionServlet extends GenericServlet { | |
// GenericServlet Impl ------------------------------------------------- | |
private static final long serialVersionUID = -963706386141654216L; | |
public String getServletInfo() { | |
return getClass().getName(); | |
} | |
/** | |
* Services the servlet request dispatched from the test portlet. | |
* This method checks the 'target' parameter to determine which test | |
* to run, and saves the test result in the request scope, which will | |
* be retrieved by the test portlet. | |
* @param request the incoming servlet request. | |
* @param response the incoming servlet response. | |
*/ | |
public void service(ServletRequest request, ServletResponse response) | |
throws ServletException, IOException { | |
TestResult result = null; | |
String target = request.getParameter(KEY_TARGET); | |
if (TARGET_PARAMS.equals(target)) { | |
result = checkParameters(request); | |
} else if (TARGET_SAME_NAME_PARAM.equals(target)) { | |
result = checkSameNameParameter(request); | |
} else if (TARGET_ADDED_SAME_NAME_PARAM.equals(target)) { | |
result = checkAddedSameNameParameter(request); | |
} else if (TARGET_INVALID_PARAMS.equals(target)) { | |
result = checkInvalidParameters(request); | |
} else { | |
result = failOnUnknownTarget(request); | |
} | |
request.setAttribute(RESULT_KEY, result); | |
} | |
// Private Methods ----------------------------------------------------- | |
/** | |
* Check that parameters A and B are available in the dispatching | |
* request. | |
* @param request the servlet request. | |
*/ | |
private TestResult checkParameters(ServletRequest request) { | |
TestResult result = new TestResult(); | |
result.setDescription("Ensure query parameters added during " | |
+ "dispatching are attached to the request."); | |
String valueA = request.getParameter(KEY_A); | |
String valueB = request.getParameter(KEY_B); | |
if (VALUE_A.equals(valueA) && VALUE_B.equals(valueB)) { | |
result.setReturnCode(TestResult.PASSED); | |
} else if (!VALUE_A.equals(valueA)){ | |
TestUtils.failOnAssertion("parameter", valueA, VALUE_A, result); | |
} else { | |
TestUtils.failOnAssertion("parameter", valueB, VALUE_B, result); | |
} | |
return result; | |
} | |
/** | |
* Check that parameter C has three values. | |
* @param request the servlet reqeust. | |
*/ | |
private TestResult checkSameNameParameter(ServletRequest request) { | |
TestResult result = new TestResult(); | |
result.setDescription("Ensure query parameters with the same name " | |
+ "added during dispatching are attached to the request."); | |
String[] values = request.getParameterValues(KEY_C); | |
String[] expected = new String[] { | |
VALUE_C1, VALUE_C2, VALUE_C3, }; | |
if (Arrays.equals(values, expected)) { | |
result.setReturnCode(TestResult.PASSED); | |
} else { | |
TestUtils.failOnAssertion("parameter", values, expected, result); | |
} | |
return result; | |
} | |
/** | |
* Check that parameter RENDER has three values: one is the render | |
* parameter, while the other two are appended in the dispatch URI. | |
* @param request the servlet reqeust. | |
*/ | |
private TestResult checkAddedSameNameParameter(ServletRequest request) { | |
TestResult result = new TestResult(); | |
result.setDescription("Ensure query parameters with the same name " | |
+ "added during dispatching are attached to the request " | |
+ "as well as render parameters."); | |
String[] values = request.getParameterValues(KEY_RENDER); | |
String[] expected = new String[] { | |
VALUE_ADDED1, VALUE_ADDED2, VALUE_RENDER, }; | |
if (Arrays.equals(values, expected)) { | |
result.setReturnCode(TestResult.PASSED); | |
} else { | |
TestUtils.failOnAssertion("parameter", values, expected, result); | |
} | |
return result; | |
} | |
/** | |
* Check that invalid parameter A is ignored, parameter B is attached | |
* to the dispatching request with the correct value, and parameter C | |
* is attached to the dispatching request with an empty string. | |
* @param request the servlet request. | |
*/ | |
private TestResult checkInvalidParameters(ServletRequest request) { | |
TestResult result = new TestResult(); | |
result.setDescription("Ensure invalid query parameters added " | |
+ "during dispatching are ignored."); | |
String valueA = request.getParameter(KEY_A); | |
String valueB = request.getParameter(KEY_B); | |
String valueC = request.getParameter(KEY_C); | |
if (valueA == null && VALUE_B.equals(valueB) && "".equals(valueC)) { | |
result.setReturnCode(TestResult.PASSED); | |
} else if (valueA != null) { | |
TestUtils.failOnAssertion("parameter", valueA, null, result); | |
} else if (!VALUE_B.equals(valueB)) { | |
TestUtils.failOnAssertion("parameter", valueB, VALUE_B, result); | |
} else { | |
TestUtils.failOnAssertion("parameter", valueC, "", result); | |
} | |
return result; | |
} | |
private TestResult failOnUnknownTarget(ServletRequest request) { | |
TestResult result = new TestResult(); | |
result.setReturnCode(TestResult.FAILED); | |
result.setResultMessage("Unable to perform test for parameter " | |
+ KEY_TARGET + ": " + request.getParameter(KEY_TARGET)); | |
return result; | |
} | |
} | |
} | |