From 8b4755dc4964226762398567e4c6aa6fda9a072f Mon Sep 17 00:00:00 2001
From: Philipp Heidelbach
Date: Thu, 15 Nov 2018 10:49:02 +0100
Subject: [PATCH] WW-4930 Add test run with enabled SMI inheritance
---
.../PackageBasedActionConfigBuilderTest.java | 103 +++++++++++++++---
1 file changed, 87 insertions(+), 16 deletions(-)
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
index 90b58986f..a19be9bed 100644
--- a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
@@ -32,6 +32,8 @@ import com.opensymphony.xwork2.util.fs.DefaultFileManager;
import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory;
import com.opensymphony.xwork2.util.reflection.ReflectionException;
import junit.framework.TestCase;
+
+import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.actions.DefaultResultPathAction;
import org.apache.struts2.convention.actions.NoAnnotationAction;
import org.apache.struts2.convention.actions.Skip;
@@ -108,7 +110,18 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
run("org.apache.struts2.convention.actions", null, "org.apache.struts2.convention.actions.exclude");
}
+ public void testSmiInheritanceEnabled() throws MalformedURLException {
+ run("org.apache.struts2.convention.actions", null, null, "true");
+ }
+
+ public void testSmiInheritanceDisabled() throws MalformedURLException {
+ run("org.apache.struts2.convention.actions", null, null, "false");
+ }
+
private void run(String actionPackages, String packageLocators, String excludePackages) throws MalformedURLException {
+ run(actionPackages, packageLocators, excludePackages, "");
+ }
+ private void run(String actionPackages, String packageLocators, String excludePackages, String enableSmiInheritance) throws MalformedURLException {
//setup interceptors
List defaultInterceptors = new ArrayList<>();
defaultInterceptors.add(makeInterceptorConfig("interceptor-1"));
@@ -121,6 +134,19 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
InterceptorMapping interceptor2 = new InterceptorMapping("interceptor-2", new TestInterceptor());
defaultInterceptorStacks.add(makeInterceptorStackConfig("stack-1", interceptor1, interceptor2));
+ //setup strict MethodInvocation
+ boolean strictMethodInvocation = true;
+ boolean isSmiInheritanceEnabled = false;
+ // Sets the SMI value to false so we can test that the created package configs adopt the SMI value of their parent.
+ // If enableSmiInheritance is set to false it is expected that the generated package configs have their SMI value set to true (the default)
+ // even when the SMI of their parent is set to false.
+ if (StringUtils.equals(enableSmiInheritance, "true")) {
+ strictMethodInvocation = false;
+ isSmiInheritanceEnabled = true;
+ } else if (StringUtils.equals(enableSmiInheritance, "false")) {
+ strictMethodInvocation = false;
+ }
+
//setup results
ResultTypeConfig[] defaultResults = new ResultTypeConfig[]{new ResultTypeConfig.Builder("dispatcher",
ServletDispatcherResult.class.getName()).defaultResultParam("location").build(),
@@ -130,8 +156,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
Set globalAllowedMethods = TextParseUtil.commaDelimitedStringToSet("execute,browse,cancel,input");
PackageConfig strutsDefault = makePackageConfig("struts-default", null, null, "dispatcher",
- defaultResults, defaultInterceptors, defaultInterceptorStacks, globalAllowedMethods);
-
+ defaultResults, defaultInterceptors, defaultInterceptorStacks, globalAllowedMethods, strictMethodInvocation);
PackageConfig packageLevelParentPkg = makePackageConfig("package-level", null, null, null);
PackageConfig classLevelParentPkg = makePackageConfig("class-level", null, null, null);
@@ -347,7 +372,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
mockContainer.setResultMapBuilder(resultMapBuilder);
mockContainer.setConventionsService(new ConventionsServiceImpl(""));
- PackageBasedActionConfigBuilder builder = new PackageBasedActionConfigBuilder(configuration, mockContainer ,of, "false", "struts-default", "false");
+ PackageBasedActionConfigBuilder builder = new PackageBasedActionConfigBuilder(configuration, mockContainer , of, "false", "struts-default", enableSmiInheritance);
builder.setFileProtocols("jar");
if (actionPackages != null) {
builder.setActionPackages(actionPackages);
@@ -369,6 +394,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.action */
PackageConfig pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.action#struts-default#/action");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(14, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action1", ActionNameAction.class, "run1", pkgConfig.getName());
verifyActionConfig(pkgConfig, "action2", ActionNameAction.class, "run2", pkgConfig.getName());
@@ -392,12 +418,14 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
//action on namespace1 (action level)
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace3#struts-default#/namespaces1");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-level-namespaces", ActionLevelNamespacesAction.class, "execute", pkgConfig.getName());
//action on namespace2 (action level)
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace3#struts-default#/namespaces2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-level-namespaces", ActionLevelNamespacesAction.class, "execute", pkgConfig.getName());
@@ -405,12 +433,14 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
//action on namespace3 (action level)
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace4#struts-default#/namespaces3");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-and-package-level-namespaces", ActionAndPackageLevelNamespacesAction.class, "execute", pkgConfig.getName());
//action on namespace4 (package level)
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace4#struts-default#/namespaces4");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-and-package-level-namespaces", ActionAndPackageLevelNamespacesAction.class, "execute", pkgConfig.getName());
@@ -419,6 +449,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.params */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.params#struts-default#/params");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
ActionConfig ac = pkgConfig.getAllActionConfigs().get("actionParam1");
assertNotNull(ac);
@@ -431,6 +462,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.params */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.exception#struts-default#/exception");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
ac = pkgConfig.getAllActionConfigs().get("exception1");
@@ -468,6 +500,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.idx */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.idx#struts-default#/idx");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(3, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "", org.apache.struts2.convention.actions.idx.Index.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "index", org.apache.struts2.convention.actions.idx.Index.class, "execute", pkgConfig.getName());
@@ -477,11 +510,13 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.defaultinterceptor */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.defaultinterceptor#struts-default#/defaultinterceptor");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals("validationWorkflowStack", pkgConfig.getDefaultInterceptorRef());
/* org.apache.struts2.convention.actions.idx.idx2 */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.idx.idx2#struts-default#/idx/idx2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "", org.apache.struts2.convention.actions.idx.idx2.Index.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "index", org.apache.struts2.convention.actions.idx.idx2.Index.class, "execute", pkgConfig.getName());
@@ -489,24 +524,28 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.namespace action level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/action-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action", ActionLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace class level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/class-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-namespace", ClassLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace package level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/package-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "package-level-namespace", PackageLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace2 */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace2#struts-default#/namespace2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "default-namespace", DefaultNamespaceAction.class, "execute", pkgConfig.getName());
@@ -539,37 +578,52 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.allowedmethods class level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-allowed-methods", ClassLevelAllowedMethodsAction.class, "execute", pkgConfig.getName());
assertEquals("struts-default", pkgConfig.getParents().get(0).getName());
ActionConfig actionConfig = pkgConfig.getActionConfigs().get("class-level-allowed-methods");
- assertEquals(7, actionConfig.getAllowedMethods().size());
assertTrue(actionConfig.getAllowedMethods().contains("execute"));
- assertTrue(actionConfig.getAllowedMethods().contains("end"));
- assertTrue(actionConfig.getAllowedMethods().contains("input"));
- assertTrue(actionConfig.getAllowedMethods().contains("cancel"));
- assertTrue(actionConfig.getAllowedMethods().contains("start"));
- assertTrue(actionConfig.getAllowedMethods().contains("home"));
- assertTrue(actionConfig.getAllowedMethods().contains("browse"));
+ int allowedMethodsSize = actionConfig.getAllowedMethods().size();
+ if (!pkgConfig.isStrictMethodInvocation()) {
+ // With strict method invocation disabled the allowed methods are "execute" and the wildcard "*"
+ assertEquals(2, allowedMethodsSize);
+ } else {
+ assertEquals(7, allowedMethodsSize);
+ assertTrue(actionConfig.getAllowedMethods().contains("end"));
+ assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ assertTrue(actionConfig.getAllowedMethods().contains("cancel"));
+ assertTrue(actionConfig.getAllowedMethods().contains("start"));
+ assertTrue(actionConfig.getAllowedMethods().contains("home"));
+ assertTrue(actionConfig.getAllowedMethods().contains("browse"));
+ }
/* org.apache.struts2.convention.actions.allowedmethods.sub package level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods.sub#struts-default#/allowedmethods/sub");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "package-level-allowed-methods-child", PackageLevelAllowedMethodsChildAction.class, "execute", pkgConfig.getName());
assertEquals("struts-default", pkgConfig.getParents().get(0).getName());
actionConfig = pkgConfig.getActionConfigs().get("package-level-allowed-methods-child");
- assertEquals(actionConfig.getAllowedMethods().size(), 6);
assertTrue(actionConfig.getAllowedMethods().contains("execute"));
- assertTrue(actionConfig.getAllowedMethods().contains("home"));
- assertTrue(actionConfig.getAllowedMethods().contains("start"));
- assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ allowedMethodsSize = actionConfig.getAllowedMethods().size();
+ if (!pkgConfig.isStrictMethodInvocation()) {
+ // With strict method invocation disabled the allowed methods are execute and the wildcard *
+ assertEquals(2, allowedMethodsSize);
+ } else {
+ assertEquals(6, allowedMethodsSize);
+ assertTrue(actionConfig.getAllowedMethods().contains("home"));
+ assertTrue(actionConfig.getAllowedMethods().contains("start"));
+ assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ }
/* org.apache.struts2.convention.actions.result */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(7, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-result", ClassLevelResultAction.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "class-level-results", ClassLevelResultsAction.class, "execute", pkgConfig.getName());
@@ -580,6 +634,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.resultpath */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.resultpath#struts-default#/resultpath");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-result-path", ClassLevelResultPathAction.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "package-level-result-path", PackageLevelResultPathAction.class, "execute", pkgConfig.getName());
@@ -587,6 +642,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.interceptorRefs */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.interceptor#struts-default#/interceptor");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(9, pkgConfig.getActionConfigs().size());
verifyActionConfigInterceptors(pkgConfig, "action100", "interceptor-1");
verifyActionConfigInterceptors(pkgConfig, "action200", "interceptor-1", "interceptor-2");
@@ -605,6 +661,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions#struts-default#");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(4, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "no-annotation", NoAnnotationAction.class, "execute", pkgConfig.getName());
@@ -615,6 +672,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
/* org.apache.struts2.convention.actions.transactions */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.transactions#struts-default#/transactions");
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
verifyActionConfig(pkgConfig, "trans1", TransNameAction.class, "trans1", pkgConfig.getName());
verifyActionConfig(pkgConfig, "trans2", TransNameAction.class, "trans2", pkgConfig.getName());
@@ -628,6 +686,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
//test unknown handler automatic chaining
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.chain#struts-default#/chain");
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
ServletContext context = EasyMock.createNiceMock(ServletContext.class);
EasyMock.replay(context);
@@ -672,6 +731,14 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
assertEquals(packageName, ac.getPackageName());
}
+ private void checkSmiValue(PackageConfig pkgConfig, PackageConfig parentConfig, boolean isSmiInheritanceEnabled) {
+ if (isSmiInheritanceEnabled) {
+ assertEquals(parentConfig.isStrictMethodInvocation(), pkgConfig.isStrictMethodInvocation());
+ } else if (!isSmiInheritanceEnabled && !parentConfig.isStrictMethodInvocation()){
+ assertTrue(pkgConfig.isStrictMethodInvocation());
+ }
+ }
+
private void verifyActionConfigInterceptors(PackageConfig pkgConfig, String actionName, String... refs) {
ActionConfig ac = pkgConfig.getAllActionConfigs().get(actionName);
assertNotNull(ac);
@@ -684,12 +751,12 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
private PackageConfig makePackageConfig(String name, String namespace, PackageConfig parent,
String defaultResultType, ResultTypeConfig... results) {
- return makePackageConfig(name, namespace, parent, defaultResultType, results, null, null, null);
+ return makePackageConfig(name, namespace, parent, defaultResultType, results, null, null, null, true);
}
private PackageConfig makePackageConfig(String name, String namespace, PackageConfig parent,
String defaultResultType, ResultTypeConfig[] results, List interceptors,
- List interceptorStacks, Set globalAllowedMethods) {
+ List interceptorStacks, Set globalAllowedMethods, boolean strictMethodInvocation) {
PackageConfig.Builder builder = new PackageConfig.Builder(name);
if (namespace != null) {
builder.namespace(namespace);
@@ -720,6 +787,10 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
builder.addGlobalAllowedMethods(globalAllowedMethods);
}
+ if (!strictMethodInvocation) {
+ builder.strictMethodInvocation(strictMethodInvocation);
+ }
+
return new MyPackageConfig(builder.build());
}