blob: 6ea92db98fdbf01734530cc9cdee9a81d118ecbe [file] [log] [blame]
/*
* 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 com.opensymphony.xwork2.interceptor;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.validator.ValidationException;
import java.util.HashMap;
/**
* Unit test for ExceptionMappingInterceptor.
*
* @author Matthew E. Porter (matthew dot porter at metissian dot com)
*/
public class ExceptionMappingInterceptorTest extends XWorkTestCase {
ActionInvocation invocation;
ExceptionMappingInterceptor interceptor;
Mock mockInvocation;
ValueStack stack;
public void testThrownExceptionMatching() throws Exception {
this.setUpWithExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new XWorkException("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
String result = interceptor.intercept(invocation);
assertNotNull(stack.findValue("exception"));
assertEquals(stack.findValue("exception"), exception);
assertEquals(result, "spooky");
ExceptionHolder holder = (ExceptionHolder) stack.getRoot().get(0); // is on top of the root
assertNotNull(holder.getExceptionStack()); // to invoke the method for unit test
}
public void testThrownExceptionMatching2() throws Exception {
this.setUpWithExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new ValidationException("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
String result = interceptor.intercept(invocation);
assertNotNull(stack.findValue("exception"));
assertEquals(stack.findValue("exception"), exception);
assertEquals(result, "throwable");
}
public void testNoThrownException() throws Exception {
this.setUpWithExceptionMappings();
Mock action = new Mock(Action.class);
mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
String result = interceptor.intercept(invocation);
assertEquals(result, Action.SUCCESS);
assertNull(stack.findValue("exception"));
}
public void testThrownExceptionNoMatch() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLogging() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategory() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategoryLevelFatal() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("fatal");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
assertEquals("fatal", interceptor.getLogLevel());
assertEquals(true, interceptor.isLogEnabled());
assertEquals("showcase.unhandled", interceptor.getLogCategory());
}
public void testThrownExceptionNoMatchLoggingCategoryLevelError() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("error");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategoryLevelWarn() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("warn");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategoryLevelInfo() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("info");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategoryLevelDebug() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("debug");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingCategoryLevelTrace() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogCategory("showcase.unhandled");
interceptor.setLogLevel("trace");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (Exception e) {
assertEquals(e, exception);
}
}
public void testThrownExceptionNoMatchLoggingUnknownLevel() throws Exception {
this.setupWithoutExceptionMappings();
Mock action = new Mock(Action.class);
Exception exception = new Exception("test");
mockInvocation.expectAndThrow("invoke", exception);
mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
try {
interceptor.setLogEnabled(true);
interceptor.setLogLevel("xxx");
interceptor.intercept(invocation);
fail("Should not have reached this point.");
} catch (IllegalArgumentException e) {
// success
}
}
private void setupWithoutExceptionMappings() {
ActionConfig actionConfig = new ActionConfig.Builder("", "", "").build();
Mock actionProxy = new Mock(ActionProxy.class);
actionProxy.expectAndReturn("getConfig", actionConfig);
mockInvocation.expectAndReturn("getProxy", ((ActionProxy) actionProxy.proxy()));
invocation = (ActionInvocation) mockInvocation.proxy();
}
private void setUpWithExceptionMappings() {
ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
.addExceptionMapping(new ExceptionMappingConfig.Builder("xwork", "com.opensymphony.xwork2.XWorkException", "spooky").build())
.addExceptionMapping(new ExceptionMappingConfig.Builder("throwable", "java.lang.Throwable", "throwable").build())
.build();
Mock actionProxy = new Mock(ActionProxy.class);
actionProxy.expectAndReturn("getConfig", actionConfig);
mockInvocation.expectAndReturn("getProxy", ((ActionProxy) actionProxy.proxy()));
invocation = (ActionInvocation) mockInvocation.proxy();
}
@Override
protected void setUp() throws Exception {
super.setUp();
stack = ActionContext.getContext().getValueStack();
mockInvocation = new Mock(ActionInvocation.class);
mockInvocation.expectAndReturn("getStack", stack);
mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(new HashMap<String, Object>()));
interceptor = new ExceptionMappingInterceptor();
interceptor.init();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
interceptor.destroy();
invocation = null;
interceptor = null;
mockInvocation = null;
stack = null;
}
}