You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2022/06/18 06:12:38 UTC
[struts] 04/04: WW-5190 Adds a new test to cover new logic of comparing ActionProxies
This is an automated email from the ASF dual-hosted git repository.
lukaszlenart pushed a commit to branch WW-5190-match-action-proxy
in repository https://gitbox.apache.org/repos/asf/struts.git
commit ebe1b80ed2ea8ba849094b95dc27d367bb6e0dde
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sat Jun 18 08:12:29 2022 +0200
WW-5190 Adds a new test to cover new logic of comparing ActionProxies
---
.../apache/struts2/dispatcher/DispatcherTest.java | 198 +++++++++++----------
1 file changed, 108 insertions(+), 90 deletions(-)
diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
index b71c94b37..6e996df0d 100644
--- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
+++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
@@ -21,6 +21,7 @@ package org.apache.struts2.dispatcher;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.LocalizedTextProvider;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.StubValueStack;
import com.opensymphony.xwork2.config.Configuration;
@@ -30,7 +31,6 @@ import com.opensymphony.xwork2.config.entities.InterceptorStackConfig;
import com.opensymphony.xwork2.config.entities.PackageConfig;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.interceptor.Interceptor;
-import com.opensymphony.xwork2.LocalizedTextProvider;
import com.opensymphony.xwork2.mock.MockActionInvocation;
import com.opensymphony.xwork2.mock.MockActionProxy;
import org.apache.struts2.ServletActionContext;
@@ -54,24 +54,23 @@ import java.util.Map;
/**
* Test case for Dispatcher.
- *
*/
public class DispatcherTest extends StrutsInternalTestCase {
- public void testDefaultResurceBundlePropertyLoaded() throws Exception {
+ public void testDefaultResourceBundlePropertyLoaded() {
LocalizedTextProvider localizedTextProvider = container.getInstance(LocalizedTextProvider.class);
// some i18n messages from xwork-messages.properties
assertEquals(localizedTextProvider.findDefaultText("xwork.error.action.execution", Locale.US),
- "Error during Action invocation");
+ "Error during Action invocation");
// some i18n messages from struts-messages.properties
assertEquals(localizedTextProvider.findDefaultText("struts.messages.error.uploading", Locale.US,
- new Object[] { "some error messages" }),
- "Error uploading: some error messages");
+ new Object[]{"some error messages"}),
+ "Error uploading: some error messages");
}
- public void testPrepareSetEncodingProperly() throws Exception {
+ public void testPrepareSetEncodingProperly() {
HttpServletRequest req = new MockHttpServletRequest();
HttpServletResponse res = new MockHttpServletResponse();
@@ -84,7 +83,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertEquals(res.getCharacterEncoding(), "utf-8");
}
- public void testEncodingForXMLHttpRequest() throws Exception {
+ public void testEncodingForXMLHttpRequest() {
// given
MockHttpServletRequest req = new MockHttpServletRequest();
req.addHeader("X-Requested-With", "XMLHttpRequest");
@@ -103,7 +102,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertEquals(res.getCharacterEncoding(), "UTF-8");
}
- public void testSetEncodingIfDiffer() throws Exception {
+ public void testSetEncodingIfDiffer() {
// given
Mock mock = new Mock(HttpServletRequest.class);
mock.expectAndReturn("getCharacterEncoding", "utf-8");
@@ -127,7 +126,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testPrepareSetEncodingPropertyWithMultipartRequest() throws Exception {
+ public void testPrepareSetEncodingPropertyWithMultipartRequest() {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
@@ -147,7 +146,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
req.setMethod("post");
req.setContentType("multipart/form-data; boundary=asdcvb345asd");
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
du.prepare(req, res);
HttpServletRequest wrapped = du.wrapRequest(req);
@@ -160,7 +159,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
req.setMethod("post");
req.setContentType("multipart/form-data; boundary=01=23a.bC:D((e)d'z?p+o_r,e-");
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
du.prepare(req, res);
HttpServletRequest wrapped = du.wrapRequest(req);
@@ -173,46 +172,46 @@ public class DispatcherTest extends StrutsInternalTestCase {
req.setMethod("post");
req.setContentType("multipart/form-data; boundary=01=2;3a.bC:D((e)d'z?p+o_r,e-");
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
du.prepare(req, res);
HttpServletRequest wrapped = du.wrapRequest(req);
assertFalse(wrapped instanceof MultiPartRequestWrapper);
}
- public void testDispatcherListener() throws Exception {
+ public void testDispatcherListener() {
- final DispatcherListenerState state = new DispatcherListenerState();
+ final DispatcherListenerState state = new DispatcherListenerState();
- Dispatcher.addDispatcherListener(new DispatcherListener() {
- public void dispatcherDestroyed(Dispatcher du) {
- state.isDestroyed = true;
- }
- public void dispatcherInitialized(Dispatcher du) {
- state.isInitialized = true;
- }
- });
+ Dispatcher.addDispatcherListener(new DispatcherListener() {
+ public void dispatcherDestroyed(Dispatcher du) {
+ state.isDestroyed = true;
+ }
+ public void dispatcherInitialized(Dispatcher du) {
+ state.isInitialized = true;
+ }
+ });
- assertFalse(state.isDestroyed);
- assertFalse(state.isInitialized);
- Dispatcher du = initDispatcher(new HashMap<String, String>() );
+ assertFalse(state.isDestroyed);
+ assertFalse(state.isInitialized);
- assertTrue(state.isInitialized);
+ Dispatcher du = initDispatcher(new HashMap<>());
- du.cleanup();
+ assertTrue(state.isInitialized);
- assertTrue(state.isDestroyed);
- }
+ du.cleanup();
+ assertTrue(state.isDestroyed);
+ }
public void testConfigurationManager() {
- Dispatcher du;
- final InternalConfigurationManager configurationManager = new InternalConfigurationManager(Container.DEFAULT_NAME);
- try {
- du = new MockDispatcher(new MockServletContext(), new HashMap<String, String>(), configurationManager);
- du.init();
+ Dispatcher du;
+ final InternalConfigurationManager configurationManager = new InternalConfigurationManager(Container.DEFAULT_NAME);
+ try {
+ du = new MockDispatcher(new MockServletContext(), new HashMap<>(), configurationManager);
+ du.init();
Dispatcher.setInstance(du);
assertFalse(configurationManager.destroyConfiguration);
@@ -221,18 +220,17 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertTrue(configurationManager.destroyConfiguration);
- }
- finally {
- Dispatcher.setInstance(null);
- }
+ } finally {
+ Dispatcher.setInstance(null);
+ }
}
public void testInitLoadsDefaultConfig() {
- Dispatcher du = new Dispatcher(new MockServletContext(), new HashMap<String, String>());
+ Dispatcher du = new Dispatcher(new MockServletContext(), new HashMap<>());
du.init();
Configuration config = du.getConfigurationManager().getConfiguration();
assertNotNull(config);
- HashSet<String> expected = new HashSet<String>();
+ HashSet<String> expected = new HashSet<>();
expected.add("struts-default.xml");
expected.add("struts-plugin.xml");
expected.add("struts.xml");
@@ -243,17 +241,17 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertTrue(packageConfig.getResultTypeConfigs().size() > 0);
}
- public void testObjectFactoryDestroy() throws Exception {
+ public void testObjectFactoryDestroy() {
ConfigurationManager cm = new ConfigurationManager(Container.DEFAULT_NAME);
- Dispatcher du = new MockDispatcher(new MockServletContext(), new HashMap<String, String>(), cm);
+ Dispatcher du = new MockDispatcher(new MockServletContext(), new HashMap<>(), cm);
Mock mockConfiguration = new Mock(Configuration.class);
- cm.setConfiguration((Configuration)mockConfiguration.proxy());
+ cm.setConfiguration((Configuration) mockConfiguration.proxy());
Mock mockContainer = new Mock(Container.class);
String reloadConfigs = container.getInstance(String.class, StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD);
mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD)),
- reloadConfigs);
+ reloadConfigs);
final InnerDestroyableObjectFactory destroyedObjectFactory = new InnerDestroyableObjectFactory();
destroyedObjectFactory.setContainer((Container) mockContainer.proxy());
mockContainer.expectAndReturn("getInstance", C.args(C.eq(ObjectFactory.class)), destroyedObjectFactory);
@@ -271,7 +269,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mockContainer.verify();
}
- public void testInterceptorDestroy() throws Exception {
+ public void testInterceptorDestroy() {
Mock mockInterceptor = new Mock(Interceptor.class);
mockInterceptor.matchAndReturn("hashCode", 0);
mockInterceptor.expect("destroy");
@@ -282,14 +280,14 @@ public class DispatcherTest extends StrutsInternalTestCase {
PackageConfig packageConfig = new PackageConfig.Builder("test").addInterceptorStackConfig(isc).build();
- Map<String, PackageConfig> packageConfigs = new HashMap<String, PackageConfig>();
+ Map<String, PackageConfig> packageConfigs = new HashMap<>();
packageConfigs.put("test", packageConfig);
Mock mockContainer = new Mock(Container.class);
mockContainer.matchAndReturn("getInstance", C.args(C.eq(ObjectFactory.class)), new ObjectFactory());
String reloadConfigs = container.getInstance(String.class, StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD);
mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD)),
- reloadConfigs);
+ reloadConfigs);
Mock mockConfiguration = new Mock(Configuration.class);
mockConfiguration.matchAndReturn("getPackageConfigs", packageConfigs);
@@ -299,7 +297,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
ConfigurationManager configurationManager = new ConfigurationManager(Container.DEFAULT_NAME);
configurationManager.setConfiguration((Configuration) mockConfiguration.proxy());
- Dispatcher dispatcher = new MockDispatcher(new MockServletContext(), new HashMap<String, String>(), configurationManager);
+ Dispatcher dispatcher = new MockDispatcher(new MockServletContext(), new HashMap<>(), configurationManager);
dispatcher.init();
dispatcher.cleanup();
@@ -308,22 +306,22 @@ public class DispatcherTest extends StrutsInternalTestCase {
mockConfiguration.verify();
}
- public void testMultipartSupportEnabledByDefault() throws Exception {
+ public void testMultipartSupportEnabledByDefault() {
HttpServletRequest req = new MockHttpServletRequest();
HttpServletResponse res = new MockHttpServletResponse();
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
du.prepare(req, res);
assertTrue(du.isMultipartSupportEnabled(req));
}
- public void testIsMultipartRequest() throws Exception {
+ public void testIsMultipartRequest() {
MockHttpServletRequest req = new MockHttpServletRequest();
HttpServletResponse res = new MockHttpServletResponse();
req.setMethod("POST");
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
du.prepare(req, res);
req.setContentType("multipart/form-data");
@@ -370,7 +368,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
}
public void testServiceActionResumePreviousProxy() throws Exception {
- Dispatcher du = initDispatcher(Collections.<String, String>emptyMap());
+ Dispatcher du = initDispatcher(Collections.emptyMap());
MockActionInvocation mai = new MockActionInvocation();
ActionContext.getContext().withActionInvocation(mai);
@@ -393,14 +391,41 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertTrue("should execute previous proxy", actionProxy.isExecutedCalled());
}
+ public void testServiceActionCreatesNewProxyIfDifferentMapping() throws Exception {
+ Dispatcher du = initDispatcher(Collections.emptyMap());
+ container.inject(du);
+
+ MockActionInvocation mai = new MockActionInvocation();
+ ActionContext.getContext().withActionInvocation(mai);
+
+ MockActionProxy previousActionProxy = new MockActionProxy();
+ previousActionProxy.setActionName("first-action");
+ previousActionProxy.setNamespace("namespace1");
+ previousActionProxy.setInvocation(mai);
+ mai.setProxy(previousActionProxy);
+
+ mai.setStack(new StubValueStack());
+
+ HttpServletRequest request = new MockHttpServletRequest();
+ request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, mai.getStack());
+
+ HttpServletResponse response = new MockHttpServletResponse();
+
+ assertFalse(previousActionProxy.isExecutedCalled());
+
+ ActionMapping newActionMapping = new ActionMapping();
+ newActionMapping.setName("hello");
+ du.serviceAction(request, response, newActionMapping);
+
+ assertFalse(previousActionProxy.isExecutedCalled());
+ }
+
/**
* Verify proper default (true) handleExceptionState for Dispatcher and that
* it properly reflects a manually configured change to false.
- *
- * @throws Exception
*/
- public void testHandleException() throws Exception {
- Dispatcher du = initDispatcher(new HashMap<String, String>());
+ public void testHandleException() {
+ Dispatcher du = initDispatcher(new HashMap<>());
assertTrue("Default Dispatcher handleException state not true ?", du.isHandleException());
Dispatcher du2 = initDispatcher(new HashMap<String, String>() {{
@@ -412,11 +437,9 @@ public class DispatcherTest extends StrutsInternalTestCase {
/**
* Verify proper default (false) devMode for Dispatcher and that
* it properly reflects a manually configured change to true.
- *
- * @throws Exception
*/
- public void testDevMode() throws Exception {
- Dispatcher du = initDispatcher(new HashMap<String, String>());
+ public void testDevMode() {
+ Dispatcher du = initDispatcher(new HashMap<>());
assertFalse("Default Dispatcher devMode state not false ?", du.isDevMode());
Dispatcher du2 = initDispatcher(new HashMap<String, String>() {{
@@ -425,7 +448,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
assertTrue("Modified Dispatcher devMode state not true ?", du2.isDevMode());
}
- public void testGetLocale_With_DefaultLocale_FromConfiguration() throws Exception {
+ public void testGetLocale_With_DefaultLocale_FromConfiguration() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -451,7 +474,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testGetLocale_With_DefaultLocale_fr_CA() throws Exception {
+ public void testGetLocale_With_DefaultLocale_fr_CA() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -477,7 +500,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testGetLocale_With_BadDefaultLocale_RequestLocale_en_UK() throws Exception {
+ public void testGetLocale_With_BadDefaultLocale_RequestLocale_en_UK() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -505,7 +528,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testGetLocale_With_BadDefaultLocale_And_RuntimeException() throws Exception {
+ public void testGetLocale_With_BadDefaultLocale_And_RuntimeException() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -533,7 +556,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testGetLocale_With_NullDefaultLocale() throws Exception {
+ public void testGetLocale_With_NullDefaultLocale() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -563,7 +586,7 @@ public class DispatcherTest extends StrutsInternalTestCase {
mock.verify();
}
- public void testGetLocale_With_NullDefaultLocale_And_RuntimeException() throws Exception {
+ public void testGetLocale_With_NullDefaultLocale_And_RuntimeException() {
// Given
Mock mock = new Mock(HttpServletRequest.class);
MockHttpSession mockHttpSession = new MockHttpSession();
@@ -595,19 +618,14 @@ public class DispatcherTest extends StrutsInternalTestCase {
/**
* Create a test context Map from a Dispatcher instance.
- *
+ * <p>
* The method directly calls getParameterMap() and getSession(true) on the HttpServletRequest.
- *
+ * <p>
* The method indirectly calls getLocale(request) on the Dispatcher instance, allowing a test of that code path.
* The derived Struts Dispatcher Locale can be retrieved from the Map afterwards.
- *
- * @param dispatcher
- * @param request
- * @param response
- * @return
*/
protected static Map<String, Object> createTestContextMap(Dispatcher dispatcher,
- HttpServletRequest request, HttpServletResponse response) {
+ HttpServletRequest request, HttpServletResponse response) {
if (dispatcher == null) {
throw new IllegalArgumentException("Cannot create a test ContextMap from a null Dispatcher");
}
@@ -619,31 +637,31 @@ public class DispatcherTest extends StrutsInternalTestCase {
}
return dispatcher.createContextMap(new RequestMap(request),
- HttpParameters.create(request.getParameterMap()).build(),
- new SessionMap(request),
- new ApplicationMap(request.getSession(true).getServletContext()),
- request,
- response);
+ HttpParameters.create(request.getParameterMap()).build(),
+ new SessionMap(request),
+ new ApplicationMap(request.getSession(true).getServletContext()),
+ request,
+ response);
}
- class InternalConfigurationManager extends ConfigurationManager {
- public boolean destroyConfiguration = false;
+ static class InternalConfigurationManager extends ConfigurationManager {
+ public boolean destroyConfiguration = false;
public InternalConfigurationManager(String name) {
super(name);
}
@Override
- public synchronized void destroyConfiguration() {
- super.destroyConfiguration();
- destroyConfiguration = true;
- }
+ public synchronized void destroyConfiguration() {
+ super.destroyConfiguration();
+ destroyConfiguration = true;
+ }
}
- class DispatcherListenerState {
- public boolean isInitialized = false;
- public boolean isDestroyed = false;
+ static class DispatcherListenerState {
+ public boolean isInitialized = false;
+ public boolean isDestroyed = false;
}
public static class InnerDestroyableObjectFactory extends ObjectFactory implements ObjectFactoryDestroyable {