/* * $Id: TestRequestUtils.java 471754 2006-11-06 14:55:09Z husted $ * * 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.struts.util; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.struts.Globals; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.apache.struts.action.RequestProcessor; import org.apache.struts.config.ForwardConfig; import org.apache.struts.config.ModuleConfig; import org.apache.struts.mock.MockFormBean; import org.apache.struts.mock.MockPrincipal; import org.apache.struts.mock.TestMockBase; import java.net.MalformedURLException; /** * <p>Unit tests for <code>org.apache.struts.util.RequestUtils</code>.</p> * * @version $Rev: 471754 $ $Date: 2005-08-14 17:24:39 -0400 (Sun, 14 Aug 2005) * $ */ public class TestRequestUtils extends TestMockBase { // ----------------------------------------------------------------- Basics public TestRequestUtils(String name) { super(name); } public static void main(String[] args) { junit.awtui.TestRunner.main(new String[] { TestRequestUtils.class.getName() }); } public static Test suite() { return (new TestSuite(TestRequestUtils.class)); } // ----------------------------------------------------- Instance Variables // ----------------------------------------------------- Setup and Teardown public void setUp() { super.setUp(); } public void tearDown() { super.tearDown(); } // ------------------------------------------------------- Individual Tests // ---------------------------------------------------------- absoluteURL() public void testAbsoluteURL() { request.setPathElements("/myapp", "/action.do", null, null); String url = null; try { url = RequestUtils.absoluteURL(request, "/foo/bar.jsp").toString(); assertEquals("absoluteURL is correct", "http://localhost:8080/myapp/foo/bar.jsp", url); } catch (MalformedURLException e) { fail("Threw MalformedURLException: " + e); } } // ------------------------------------------------------------ actionURL() // Default application -- extension mapping public void testActionURL1() { request.setAttribute(Globals.MODULE_KEY, moduleConfig); request.setPathElements("/myapp", "/foo.do", null, null); String url = RequestUtils.actionURL(request, moduleConfig.findActionConfig("/dynamic"), "*.do"); assertNotNull("URL was returned", url); assertEquals("URL value", "/dynamic.do", url); } // Second application -- extension mapping public void testActionURL2() { request.setAttribute(Globals.MODULE_KEY, moduleConfig2); request.setPathElements("/myapp", "/2/foo.do", null, null); String url = RequestUtils.actionURL(request, moduleConfig2.findActionConfig("/dynamic2"), "*.do"); assertNotNull("URL was returned", url); assertEquals("URL value", "/2/dynamic2.do", url); } // Default application -- path mapping public void testActionURL3() { request.setAttribute(Globals.MODULE_KEY, moduleConfig); request.setPathElements("/myapp", "/do/foo", null, null); String url = RequestUtils.actionURL(request, moduleConfig.findActionConfig("/dynamic"), "/do/*"); assertNotNull("URL was returned", url); assertEquals("URL value", "/do/dynamic", url); } // ----------------------------------------------------- createActionForm() // Default module -- No ActionForm should be created public void testCreateActionForm1a() { request.setPathElements("/myapp", "/noform.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig("/noform"); assertNotNull("Found /noform mapping", mapping); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig, null); assertNull("No ActionForm returned", form); } // Second module -- No ActionForm should be created public void testCreateActionForm1b() { request.setPathElements("/myapp", "/2/noform.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig2.findActionConfig("/noform"); assertNotNull("Found /noform mapping", mapping); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig2, null); assertNull("No ActionForm returned", form); } // Default module -- Standard ActionForm should be created public void testCreateActionForm2a() { request.setPathElements("/myapp", "/static.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig("/static"); assertNotNull("Found /static mapping", mapping); assertNotNull("Mapping has non-null name", mapping.getName()); assertEquals("Mapping has correct name", "static", mapping.getName()); assertNotNull("AppConfig has form bean " + mapping.getName(), moduleConfig.findFormBeanConfig(mapping.getName())); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig, null); assertNotNull("ActionForm returned", form); assertTrue("ActionForm of correct type", form instanceof MockFormBean); } // Second module -- Standard ActionForm should be created public void testCreateActionForm2b() { request.setPathElements("/myapp", "/2/static.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig2.findActionConfig("/static"); assertNotNull("Found /static mapping", mapping); assertNotNull("Mapping has non-null name", mapping.getName()); assertEquals("Mapping has correct name", "static", mapping.getName()); assertNotNull("AppConfig has form bean " + mapping.getName(), moduleConfig.findFormBeanConfig(mapping.getName())); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig2, null); assertNotNull("ActionForm returned", form); assertTrue("ActionForm of correct type", form instanceof MockFormBean); } // Default module -- Dynamic ActionForm should be created public void testCreateActionForm3a() { request.setPathElements("/myapp", "/dynamic.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig("/dynamic"); assertNotNull("Found /dynamic mapping", mapping); assertNotNull("Mapping has non-null name", mapping.getName()); assertEquals("Mapping has correct name", "dynamic", mapping.getName()); assertNotNull("AppConfig has form bean " + mapping.getName(), moduleConfig.findFormBeanConfig(mapping.getName())); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig, null); assertNotNull("ActionForm returned", form); assertTrue("ActionForm of correct type", form instanceof DynaActionForm); } // Second module -- Dynamic ActionForm should be created public void testCreateActionForm3b() { request.setPathElements("/myapp", "/2/dynamic2.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig2.findActionConfig("/dynamic2"); assertNotNull("Found /dynamic2 mapping", mapping); assertNotNull("Mapping has non-null name", mapping.getName()); assertEquals("Mapping has correct name", "dynamic2", mapping.getName()); assertNotNull("AppConfig has form bean " + mapping.getName(), moduleConfig2.findFormBeanConfig(mapping.getName())); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig2, null); assertNotNull("ActionForm returned", form); assertTrue("ActionForm of correct type", form instanceof DynaActionForm); } // Default module -- Dynamic ActionForm with initializers public void testCreateActionForm4a() { // Retrieve an appropriately configured DynaActionForm instance request.setPathElements("/myapp", "/dynamic0.do", null, null); ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig("/dynamic0"); assertNotNull("Found /dynamic0 mapping", mapping); assertNotNull("Mapping has non-null name", mapping.getName()); assertEquals("Mapping has correct name", "dynamic0", mapping.getName()); assertNotNull("AppConfig has form bean " + mapping.getName(), moduleConfig.findFormBeanConfig(mapping.getName())); ActionForm form = RequestUtils.createActionForm(request, mapping, moduleConfig, null); assertNotNull("ActionForm returned", form); assertTrue("ActionForm of correct type", form instanceof DynaActionForm); // Validate the property values DynaActionForm dform = (DynaActionForm) form; Boolean booleanProperty = (Boolean) dform.get("booleanProperty"); assertTrue("booleanProperty is true", booleanProperty.booleanValue()); String stringProperty = (String) dform.get("stringProperty"); assertEquals("stringProperty is correct", "String Property", stringProperty); Object value = null; value = dform.get("intArray1"); assertNotNull("intArray1 exists", value); assertTrue("intArray1 is int[]", value instanceof int[]); int[] intArray1 = (int[]) value; assertEquals("intArray1 length is correct", 3, intArray1.length); assertEquals("intArray1[0] value is correct", 1, intArray1[0]); assertEquals("intArray1[1] value is correct", 2, intArray1[1]); assertEquals("intArray1[2] value is correct", 3, intArray1[2]); value = dform.get("intArray2"); assertNotNull("intArray2 exists", value); assertTrue("intArray2 is int[]", value instanceof int[]); int[] intArray2 = (int[]) value; assertEquals("intArray2 length is correct", 5, intArray2.length); assertEquals("intArray2[0] value is correct", 0, intArray2[0]); assertEquals("intArray2[1] value is correct", 0, intArray2[1]); assertEquals("intArray2[2] value is correct", 0, intArray2[2]); assertEquals("intArray2[3] value is correct", 0, intArray2[3]); assertEquals("intArray2[4] value is correct", 0, intArray2[4]); value = dform.get("principal"); assertNotNull("principal exists", value); assertTrue("principal is MockPrincipal", value instanceof MockPrincipal); value = dform.get("stringArray1"); assertNotNull("stringArray1 exists", value); assertTrue("stringArray1 is int[]", value instanceof String[]); String[] stringArray1 = (String[]) value; assertEquals("stringArray1 length is correct", 3, stringArray1.length); assertEquals("stringArray1[0] value is correct", "aaa", stringArray1[0]); assertEquals("stringArray1[1] value is correct", "bbb", stringArray1[1]); assertEquals("stringArray1[2] value is correct", "ccc", stringArray1[2]); value = dform.get("stringArray2"); assertNotNull("stringArray2 exists", value); assertTrue("stringArray2 is int[]", value instanceof String[]); String[] stringArray2 = (String[]) value; assertEquals("stringArray2 length is correct", 3, stringArray2.length); assertEquals("stringArray2[0] value is correct", new String(), stringArray2[0]); assertEquals("stringArray2[1] value is correct", new String(), stringArray2[1]); assertEquals("stringArray2[2] value is correct", new String(), stringArray2[2]); // Different form beans should get different property value instances Object value1 = null; DynaActionForm dform1 = (DynaActionForm) RequestUtils.createActionForm(request, mapping, moduleConfig, null); value = dform.get("principal"); value1 = dform1.get("principal"); assertEquals("Different form beans get equal instance values", value, value1); assertTrue("Different form beans get different instances 1", value != value1); value = dform.get("stringArray1"); value1 = dform1.get("stringArray1"); assertTrue("Different form beans get different instances 2", value != value1); dform1.set("stringProperty", "Different stringProperty value"); value = dform.get("stringProperty"); value1 = dform1.get("stringProperty"); assertTrue("Different form beans get different instances 3", value != value1); } // ----------------------------------------------------------- forwardURL() // Default module (default forwardPattern) public void testForwardURL1() { request.setAttribute(Globals.MODULE_KEY, moduleConfig); request.setPathElements("/myapp", "/action.do", null, null); ForwardConfig forward = null; String result = null; // redirect=false, module=null forward = moduleConfig.findForwardConfig("moduleForward"); assertNotNull("moduleForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleForward computed", result); assertEquals("moduleForward value", "/module/forward", result); // redirect=true, module=null forward = moduleConfig.findForwardConfig("moduleRedirect"); assertNotNull("moduleRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleRedirect computed", result); assertEquals("moduleRedirect value", "/module/redirect", result); // redirect=false, module=/context forward = moduleConfig.findForwardConfig("contextForward"); assertNotNull("contextForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextForward computed", result); assertEquals("contextForward value", "/context/forward", result); // redirect=true, module=/context forward = moduleConfig.findForwardConfig("contextRedirect"); assertNotNull("contextRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextRedirect computed", result); assertEquals("contextRedirct value", "/context/redirect", result); // noslash, module=null forward = moduleConfig.findForwardConfig("moduleNoslash"); assertNotNull("moduleNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleNoslash computed", result); assertEquals("moduleNoslash value", "/module/noslash", result); // noslash, module=/ forward = moduleConfig.findForwardConfig("contextNoslash"); assertNotNull("contextNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextNoslash computed", result); assertEquals("contextNoslash value", "/context/noslash", result); } // Second module (default forwardPattern) public void testForwardURL2() { request.setAttribute(Globals.MODULE_KEY, moduleConfig2); request.setPathElements("/myapp", "/2/action.do", null, null); ForwardConfig forward = null; String result = null; // redirect=false, module=null forward = moduleConfig2.findForwardConfig("moduleForward"); assertNotNull("moduleForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleForward computed", result); assertEquals("moduleForward value", "/2/module/forward", result); // redirect=true, module=null forward = moduleConfig2.findForwardConfig("moduleRedirect"); assertNotNull("moduleRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleRedirect computed", result); assertEquals("moduleRedirect value", "/2/module/redirect", result); // redirect=false, module=/context forward = moduleConfig2.findForwardConfig("contextForward"); assertNotNull("contextForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextForward computed", result); assertEquals("contextForward value", "/context/forward", result); // redirect=true, module=/context forward = moduleConfig2.findForwardConfig("contextRedirect"); assertNotNull("contextRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextRedirect computed", result); assertEquals("contextRedirct value", "/context/redirect", result); // noslash, module=null forward = moduleConfig2.findForwardConfig("moduleNoslash"); assertNotNull("moduleNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleNoslash computed", result); assertEquals("moduleNoslash value", "/2/module/noslash", result); // noslash, module=/ forward = moduleConfig2.findForwardConfig("contextNoslash"); assertNotNull("contextNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextNoslash computed", result); assertEquals("contextNoslash value", "/context/noslash", result); } // Third module (custom forwardPattern) public void testForwardURL3() { request.setAttribute(Globals.MODULE_KEY, moduleConfig3); request.setPathElements("/myapp", "/3/action.do", null, null); ForwardConfig forward = null; String result = null; // redirect=false, module=null forward = moduleConfig3.findForwardConfig("moduleForward"); assertNotNull("moduleForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleForward computed", result); assertEquals("moduleForward value", "/forwarding/3/module/forward", result); // redirect=true, module=null forward = moduleConfig3.findForwardConfig("moduleRedirect"); assertNotNull("moduleRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleRedirect computed", result); assertEquals("moduleRedirect value", "/forwarding/3/module/redirect", result); // redirect=false, module=/context forward = moduleConfig3.findForwardConfig("contextForward"); assertNotNull("contextForward found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextForward computed", result); assertEquals("contextForward value", "/forwarding/context/forward", result); // redirect=true, module=/context forward = moduleConfig3.findForwardConfig("contextRedirect"); assertNotNull("contextRedirect found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextRedirect computed", result); assertEquals("contextRedirct value", "/forwarding/context/redirect", result); // noslash, module=null forward = moduleConfig3.findForwardConfig("moduleNoslash"); assertNotNull("moduleNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("moduleNoslash computed", result); assertEquals("moduleNoslash value", "/forwarding/3/module/noslash", result); // noslash, module=/ forward = moduleConfig3.findForwardConfig("contextNoslash"); assertNotNull("contextNoslash found", forward); result = RequestUtils.forwardURL(request, forward, null); assertNotNull("contextNoslash computed", result); assertEquals("contextNoslash value", "/forwarding/context/noslash", result); } // Cross module forwards public void testForwardURLa() { request.setAttribute(Globals.MODULE_KEY, moduleConfig); request.setPathElements("/myapp", "/action.do", null, null); ForwardConfig forward = null; String result = null; // redirect=false, contextRelative=false, link to module 3 forward = moduleConfig3.findForwardConfig("moduleForward"); assertNotNull("moduleForward found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("moduleForward computed", result); assertEquals("moduleForward value", "/forwarding/3/module/forward", result); // redirect=true, contextRelative=false, link to module 3 forward = moduleConfig3.findForwardConfig("moduleRedirect"); assertNotNull("moduleRedirect found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("moduleRedirect computed", result); assertEquals("moduleRedirect value", "/forwarding/3/module/redirect", result); // redirect=false, module=/context forward = moduleConfig3.findForwardConfig("contextForward"); assertNotNull("contextForward found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("contextForward computed", result); assertEquals("contextForward value", "/forwarding/context/forward", result); // redirect=true, module=/context forward = moduleConfig3.findForwardConfig("contextRedirect"); assertNotNull("contextRedirect found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("contextRedirect computed", result); assertEquals("contextRedirct value", "/forwarding/context/redirect", result); // noslash, contextRelative=false, link to module 3 forward = moduleConfig3.findForwardConfig("moduleNoslash"); assertNotNull("moduleNoslash found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("moduleNoslash computed", result); assertEquals("moduleNoslash value", "/forwarding/3/module/noslash", result); // noslash, module=/ forward = moduleConfig3.findForwardConfig("contextNoslash"); assertNotNull("contextNoslash found", forward); result = RequestUtils.forwardURL(request, forward, moduleConfig3); assertNotNull("contextNoslash computed", result); assertEquals("contextNoslash value", "/forwarding/context/noslash", result); } // ----------------------------------------------------------- requestURL() public void testRequestURL() { request.setPathElements("/myapp", "/foo.do", null, null); String url = null; try { url = RequestUtils.requestURL(request).toString(); } catch (MalformedURLException e) { fail("MalformedURLException: " + e); } assertNotNull("URL was returned", url); assertEquals("URL value", "http://localhost:8080/myapp/foo.do", url); } // ---------------------------------------------------- selectApplication() // Map to the default module -- direct public void testSelectApplication1a() { request.setPathElements("/myapp", "/noform.do", null, null); ModuleUtils.getInstance().selectModule(request, context); ModuleConfig moduleConfig = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); assertNotNull("Selected a module", moduleConfig); assertEquals("Selected correct module", "", moduleConfig.getPrefix()); // FIXME - check module resources? } // Map to the second module -- direct public void testSelectApplication1b() { String[] prefixes = { "/1", "/2" }; context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes); request.setPathElements("/myapp", "/2/noform.do", null, null); ModuleUtils.getInstance().selectModule(request, context); ModuleConfig moduleConfig = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); assertNotNull("Selected a module", moduleConfig); assertEquals("Selected correct module", "/2", moduleConfig.getPrefix()); // FIXME - check module resources? } // Map to the default module -- include public void testSelectApplication2a() { request.setPathElements("/myapp", "/2/noform.do", null, null); request.setAttribute(RequestProcessor.INCLUDE_SERVLET_PATH, "/noform.do"); ModuleUtils.getInstance().selectModule(request, context); ModuleConfig moduleConfig = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); assertNotNull("Selected an application", moduleConfig); assertEquals("Selected correct application", "", moduleConfig.getPrefix()); // FIXME - check application resources? } // Map to the second module -- include public void testSelectApplication2b() { String[] prefixes = { "/1", "/2" }; context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes); request.setPathElements("/myapp", "/noform.do", null, null); request.setAttribute(RequestProcessor.INCLUDE_SERVLET_PATH, "/2/noform.do"); ModuleUtils.getInstance().selectModule(request, context); ModuleConfig moduleConfig = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); assertNotNull("Selected a module", moduleConfig); assertEquals("Selected correct module", "/2", moduleConfig.getPrefix()); // FIXME - check application resources? } // ------------------------------------------------------------ serverURL() // Basic test on values in mock objects public void testServerURL() { String url = null; try { url = RequestUtils.serverURL(request).toString(); } catch (MalformedURLException e) { fail("Threw MalformedURLException: " + e); } assertNotNull("serverURL is present", url); assertEquals("serverURL value", "http://localhost:8080", url); } }