blob: 4dc9181ab4418aae43eaa1f109b051e77f21c20d [file] [log] [blame]
/*
* $Id$
*
* 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.config;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.mock.TestMockBase;
import java.util.HashMap;
/**
* <p>
* Unit tests for <code>org.apache.struts.util.ActionConfigMatcher</code>.
* </p>
*
* @version $Rev$ $Date$
*/
public class TestActionConfigMatcher extends TestMockBase {
// ----------------------------------------------------------------- Basics
public TestActionConfigMatcher(String name) {
super(name);
}
public static void main(String[] args) {
junit.awtui.TestRunner.main(new String[] { TestActionConfigMatcher.class.getName() });
}
public static Test suite() {
return (new TestSuite(TestActionConfigMatcher.class));
}
// ----------------------------------------------------- Instance Variables
// ----------------------------------------------------- Setup and Teardown
public void setUp() {
super.setUp();
}
public void tearDown() {
super.tearDown();
}
// ------------------------------------------------------- Individual Tests
// ---------------------------------------------------------- match()
public void testNoMatch() {
ActionConfig[] configs = new ActionConfig[1];
ActionConfig mapping = buildActionConfig("/foo");
configs[0] = mapping;
ActionConfigMatcher matcher = new ActionConfigMatcher(configs);
assertNull("ActionConfig shouldn't be matched", matcher.match("/test"));
}
/**
* Verifies that a match succeeds when the substituted value contains a
* placeholder key.
* <p>
* See STR-3169.
*
* @since Struts 1.3.11
*/
public void testMatchWithKeyInPath() {
ActionMapping[] mapping = new ActionMapping[1];
mapping[0] = new ActionMapping();
mapping[0].setPath("/page-*");
ActionConfigMatcher matcher = new ActionConfigMatcher(mapping);
ActionConfig matched = matcher.match("/page-{0}");
assertNotNull("ActionConfig should be matched", matched);
assertEquals("Path hasn't been replaced", "/page-{0}", matched.getPath());
}
/**
* Verifies that an infinite loop is prevented and substitution is skipped when
* the substituted value equals the placeholder key.
* <p>
* See STR-3169.
*
* @since Struts 1.3.11
* @see #testMatchWithSubstitutionEqualPlaceholderKey1()
*/
public void testMatchWithSubstitutionEqualPlaceholderKey0() {
ActionMapping[] mapping = new ActionMapping[1];
mapping[0] = new ActionMapping();
mapping[0].setPath("/page-*");
mapping[0].setParameter("{0}");
ActionConfigMatcher matcher = new ActionConfigMatcher(mapping);
ActionConfig matched = matcher.match("/page-{1}");
assertNull("ActionConfig should not be matched", matched);
}
/**
* Verifies that an infinite loop is prevented and substitution is skipped when
* the substituted value equals the placeholder key.
* <p>
* See STR-3169.
*
* @since Struts 1.3.11
* @see #testMatchWithSubstitutionEqualPlaceholderKey0()
*/
public void testMatchWithSubstitutionEqualPlaceholderKey1() {
ActionMapping[] mapping = new ActionMapping[1];
mapping[0] = new ActionMapping();
mapping[0].setPath("/page-*");
mapping[0].setParameter("{1}");
ActionConfigMatcher matcher = new ActionConfigMatcher(mapping);
ActionConfig matched = matcher.match("/page-{1}");
assertNull("ActionConfig should not be matched", matched);
}
/**
* Verifies that an infinite loop is prevented and substitution is skipped when
* the the placeholder key is contained within the substituted value.
* <p>
* See STR-3169.
*
* @since Struts 1.3.11
*/
public void testMatchWhenSubstitutionContainsPlaceholderKey() {
ActionMapping[] mapping = new ActionMapping[1];
mapping[0] = new ActionMapping();
mapping[0].setPath("/page-*");
mapping[0].setParameter("{1}");
ActionConfigMatcher matcher = new ActionConfigMatcher(mapping);
ActionConfig matched = matcher.match("/page-{0}");
assertNull("ActionConfig should not be matched", matched);
}
public void testNoWildcardMatch() {
ActionConfig[] configs = new ActionConfig[1];
ActionConfig mapping = buildActionConfig("/fooBar");
configs[0] = mapping;
ActionConfigMatcher matcher = new ActionConfigMatcher(configs);
assertNull("ActionConfig shouldn't be matched", matcher.match("/fooBar"));
}
public void testShouldMatch() {
ActionConfig[] configs = new ActionConfig[1];
ActionConfig mapping = buildActionConfig("/foo*");
configs[0] = mapping;
ActionConfigMatcher matcher = new ActionConfigMatcher(configs);
ActionConfig matched = matcher.match("/fooBar");
assertNotNull("ActionConfig should be matched", matched);
assertTrue("ActionConfig should have two action forward", matched.findForwardConfigs().length == 2);
assertTrue("ActionConfig should have two exception forward", matched.findExceptionConfigs().length == 2);
assertTrue("ActionConfig should have properties", matched.getProperties().size() == 2);
}
public void testCheckSubstitutionsMatch() {
ActionConfig[] configs = new ActionConfig[1];
ActionConfig mapping = buildActionConfig("/foo*");
configs[0] = mapping;
ActionConfigMatcher matcher = new ActionConfigMatcher(configs);
ActionConfig m = matcher.match("/fooBar");
assertTrue("Name hasn't been replaced", "name,Bar".equals(m.getName()));
assertTrue("Path hasn't been replaced", "/fooBar".equals(m.getPath()));
assertTrue("Scope isn't correct", "request".equals(m.getScope()));
assertTrue("Unknown isn't correct", !m.getUnknown());
assertTrue("Validate isn't correct", m.getValidate());
assertTrue("Prefix hasn't been replaced", "foo,Bar".equals(m.getPrefix()));
assertTrue("Suffix hasn't been replaced", "bar,Bar".equals(m.getSuffix()));
assertTrue("Type hasn't been replaced", "foo.bar.BarAction".equals(m.getType()));
assertTrue("Roles hasn't been replaced", "public,Bar".equals(m.getRoles()));
assertTrue("Parameter hasn't been replaced", "param,Bar".equals(m.getParameter()));
assertTrue("Attribute hasn't been replaced", "attrib,Bar".equals(m.getAttribute()));
assertTrue("Forward hasn't been replaced", "fwd,Bar".equals(m.getForward()));
assertTrue("Include hasn't been replaced", "include,Bar".equals(m.getInclude()));
assertTrue("Input hasn't been replaced", "input,Bar".equals(m.getInput()));
assertTrue("ActionConfig property not replaced", "testBar".equals(m.getProperty("testprop2")));
ForwardConfig[] fConfigs = m.findForwardConfigs();
boolean found = false;
for (int x = 0; x < fConfigs.length; x++) {
ForwardConfig cfg = fConfigs[x];
if ("name".equals(cfg.getName())) {
found = true;
assertTrue("Path hasn't been replaced", "path,Bar".equals(cfg.getPath()));
assertTrue("Property foo hasn't been replaced", "bar,Bar".equals(cfg.getProperty("foo")));
assertTrue("Module hasn't been replaced", "modBar".equals(cfg.getModule()));
}
}
assertTrue("The forward config 'name' cannot be found", found);
}
public void testCheckMultipleSubstitutions() {
ActionMapping[] mapping = new ActionMapping[1];
mapping[0] = new ActionMapping();
mapping[0].setPath("/foo*");
mapping[0].setName("name,{1}-{1}");
ActionConfigMatcher matcher = new ActionConfigMatcher(mapping);
ActionConfig m = matcher.match("/fooBar");
assertTrue("Name hasn't been replaced correctly: " + m.getName(), "name,Bar-Bar".equals(m.getName()));
}
private ActionConfig buildActionConfig(String path) {
ActionMapping mapping = new ActionMapping();
mapping.setName("name,{1}");
mapping.setPath(path);
mapping.setScope("request");
mapping.setUnknown(false);
mapping.setValidate(true);
mapping.setPrefix("foo,{1}");
mapping.setSuffix("bar,{1}");
mapping.setType("foo.bar.{1}Action");
mapping.setRoles("public,{1}");
mapping.setParameter("param,{1}");
mapping.setAttribute("attrib,{1}");
mapping.setForward("fwd,{1}");
mapping.setInclude("include,{1}");
mapping.setInput("input,{1}");
ForwardConfig cfg = new ActionForward();
cfg.setName("name");
cfg.setPath("path,{1}");
cfg.setModule("mod{1}");
cfg.setProperty("foo", "bar,{1}");
mapping.addForwardConfig(cfg);
cfg = new ActionForward();
cfg.setName("name2");
cfg.setPath("path2");
cfg.setModule("mod{1}");
mapping.addForwardConfig(cfg);
ExceptionConfig excfg = new ExceptionConfig();
excfg.setKey("foo");
excfg.setType("foo.Bar");
excfg.setPath("path");
mapping.addExceptionConfig(excfg);
excfg = new ExceptionConfig();
excfg.setKey("foo2");
excfg.setType("foo.Bar2");
excfg.setPath("path2");
mapping.addExceptionConfig(excfg);
mapping.setProperty("testprop", "testval");
mapping.setProperty("testprop2", "test{1}");
mapping.freeze();
return mapping;
}
}