package net.sourceforge.stripes.controller;
import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.action.ActionBeanContext;
import net.sourceforge.stripes.action.After;
import net.sourceforge.stripes.action.Before;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.Resolution;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* TestNG based unit test of the {@link BeforeAfterMethodInterceptor} class.
*
* @author Jeppe Cramon
*/
public class BeforeAfterMethodInterceptorTests {
@Test(groups="fast")
public void testInterceptAtLifeCycleStage_ActionBeanResolution() throws Exception {
ExecutionContext context = new TestExecutionContext();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setLifecycleStage(LifecycleStage.ActionBeanResolution);
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 1);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 0);
}
@Test(groups="fast")
public void testInterceptAtLifeCycleStage_BindingAndValidation() throws Exception {
ExecutionContext context = new TestExecutionContext();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setLifecycleStage(LifecycleStage.BindingAndValidation);
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 0);
}
@Test(groups="fast")
public void testInterceptAtLifeCycleStage_CustomValidation() throws Exception {
ExecutionContext context = new TestExecutionContext();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setLifecycleStage(LifecycleStage.CustomValidation);
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 1);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 0);
}
@Test(groups="fast")
public void testInterceptAtLifeCycleStage_EventHandling() throws Exception {
ExecutionContext context = new TestExecutionContext();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setLifecycleStage(LifecycleStage.EventHandling);
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 1);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 1);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturn(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 2);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 1);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 1);
}
@Test(groups="fast")
public void testInterceptAtLifeCycleStage_HandlerResolution() throws Exception {
ExecutionContext context = new TestExecutionContext();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setLifecycleStage(LifecycleStage.HandlerResolution);
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 1);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 1);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 0);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 0);
}
@Test(groups="fast")
public void testIntercept_withEventSpecifier() throws Exception {
ExecutionContext context = new TestExecutionContext();
BeforeAfterMethodInterceptor interceptor = new BeforeAfterMethodInterceptor();
TestActionBean2 actionBean = new TestActionBean2();
context.setActionBean(actionBean);
context.setActionBeanContext(new ActionBeanContext());
context.getActionBeanContext().setEventName("edit");
context.setLifecycleStage(LifecycleStage.EventHandling); // default
Assert.assertNotNull(interceptor.intercept(context));
context.getActionBeanContext().setEventName("save");
context.setLifecycleStage(LifecycleStage.EventHandling); // default
Assert.assertNotNull(interceptor.intercept(context));
Assert.assertEquals(actionBean.getHasCalledAfterDefaultStage(), 2);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturn(), 2);
Assert.assertEquals(actionBean.getHasCalledBeforeDefaultStage(), 2);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturn(), 2);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterDefaultStage(), 4);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterOnSingleEvent(), 2);
Assert.assertEquals(actionBean.getHasCalledProtectedAfterMethod(), 2);
Assert.assertEquals(actionBean.getHasCalledProtectedBeforeMethod(), 2);
Assert.assertEquals(actionBean.getHasCalledAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledAfterWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeTwoStages(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterSpecificStage(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeAfterWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledBeforeWithReturnAndParameter(), 0);
Assert.assertEquals(actionBean.getHasCalledDummyMethod(), 0);
}
/**
* Test ActionBean class
* @author Jeppe Cramon
*/
private static class TestActionBean2 implements ActionBean {
private int hasCalledBeforeActionBeanResolutionWillNeverBeCalled;
private int hasCalledBeforeDefaultStage;
private int hasCalledBeforeSpecificStage;
private int hasCalledBeforeTwoStages;
private int hasCalledBeforeWithReturn;
private int hasCalledBeforeWithParameter;
private int hasCalledBeforeWithReturnAndParameter;
private int hasCalledProtectedBeforeMethod;
private int hasCalledDummyMethod;
private int hasCalledAfterDefaultStage;
private int hasCalledAfterSpecificStage;
private int hasCalledAfterTwoStages;
private int hasCalledAfterWithReturn;
private int hasCalledAfterWithParameter;
private int hasCalledAfterWithReturnAndParameter;
private int hasCalledProtectedAfterMethod;
private int hasCalledBeforeAfterWithParameter;
private int hasCalledBeforeAfterSpecificStage;
private int hasCalledBeforeAfterDefaultStage;
private int hasCalledBeforeAfterOnSingleEvent;
public void setContext(ActionBeanContext context) {
}
public ActionBeanContext getContext() {
return null;
}
@SuppressWarnings("unused")
@Before(stages=LifecycleStage.ActionBeanResolution)
public void beforeActionBeanResolutionWillNeverBeCalled() {
hasCalledBeforeActionBeanResolutionWillNeverBeCalled++;
}
@SuppressWarnings("unused")
@Before
public void beforeDefaultStage() {
hasCalledBeforeDefaultStage++;
}
@SuppressWarnings("unused")
@Before(stages=LifecycleStage.HandlerResolution)
public void beforeSpecificStage() {
hasCalledBeforeSpecificStage++;
}
@SuppressWarnings("unused")
@Before(stages={LifecycleStage.BindingAndValidation, LifecycleStage.CustomValidation})
public void beforeTwoStages() {
hasCalledBeforeTwoStages++;
}
@SuppressWarnings("unused")
@Before
public String beforeWithReturn() {
hasCalledBeforeWithReturn++;
return null;
}
/** Parameters are not allowed. */
@SuppressWarnings("unused")
@Before
public void beforeWithParameter(String var) {
hasCalledBeforeWithParameter++;
}
/** Parameters are not allowed. */
@SuppressWarnings("unused")
@Before
public String beforeWithReturnAndParameter(String var) {
hasCalledBeforeWithReturnAndParameter++;
return null;
}
/** Should work just like a public method. */
@SuppressWarnings("unused")
@Before
protected void protectedBeforeMethod() {
hasCalledProtectedBeforeMethod++;
}
/** Not annotated to be called by anyone */
@SuppressWarnings("unused")
public void dummyMethod() {
hasCalledDummyMethod++;
}
@SuppressWarnings("unused")
@After
public void afterDefaultStage() {
hasCalledAfterDefaultStage++;
}
@SuppressWarnings("unused")
@After(stages=LifecycleStage.ActionBeanResolution)
public void afterSpecificStage() {
hasCalledAfterSpecificStage++;
}
@SuppressWarnings("unused")
@After(stages={LifecycleStage.HandlerResolution, LifecycleStage.CustomValidation})
public void afterTwoStages() {
hasCalledAfterTwoStages++;
}
/** Returns are ok, and will just be ignored if not Resolutions. */
@SuppressWarnings("unused")
@After
public String afterWithReturn() {
hasCalledAfterWithReturn++;
return null;
}
/** Not invoked because parameters are not kosher. */
@SuppressWarnings("unused")
@After
public void afterWithParameter(String var) {
hasCalledAfterWithParameter++;
}
/** Not invoked because parameters are not kosher. */
@SuppressWarnings("unused")
@After
public String afterWithReturnAndParameter(String var) {
hasCalledAfterWithReturnAndParameter++;
return null;
}
/** Should work just like a public method. */
@SuppressWarnings("unused")
@After
protected void protectedAfterMethod() {
hasCalledProtectedAfterMethod++;
}
/** Not invoked because parameters are not kosher. */
@SuppressWarnings("unused")
@Before @After
public String beforeAfterWithParameter(String var) {
hasCalledBeforeAfterWithParameter++;
return null;
}
/** Invoked only at those stages listed. */
@SuppressWarnings("unused")
@Before(stages=LifecycleStage.BindingAndValidation)
@After(stages=LifecycleStage.CustomValidation)
public void beforeAfterSpecificStage() {
hasCalledBeforeAfterSpecificStage++;
}
/** Invoked only at default EventHandling stage. */
@SuppressWarnings("unused")
@Before @After
public void beforeAfterDefaultStage() {
hasCalledBeforeAfterDefaultStage++;
}
/** Invoked only at default EventHandling stage. */
@SuppressWarnings("unused")
@Before(on="edit") @After(on="save")
public void beforeAfterOnSingleEvent() {
hasCalledBeforeAfterOnSingleEvent++;
}
// -- Unit test properties --
public int getHasCalledAfterDefaultStage() { return hasCalledAfterDefaultStage; }
public int getHasCalledAfterSpecificStage() { return hasCalledAfterSpecificStage; }
public int getHasCalledAfterTwoStages() { return hasCalledAfterTwoStages; }
public int getHasCalledAfterWithReturn() { return hasCalledAfterWithReturn; }
public int getHasCalledAfterWithParameter() { return hasCalledAfterWithParameter; }
public int getHasCalledAfterWithReturnAndParameter() { return hasCalledAfterWithReturnAndParameter; }
public int getHasCalledBeforeDefaultStage() { return hasCalledBeforeDefaultStage; }
public int getHasCalledBeforeSpecificStage() { return hasCalledBeforeSpecificStage; }
public int getHasCalledBeforeTwoStages() { return hasCalledBeforeTwoStages; }
public int getHasCalledBeforeAfterSpecificStage() { return hasCalledBeforeAfterSpecificStage; }
public int getHasCalledBeforeAfterWithParameter() { return hasCalledBeforeAfterWithParameter; }
@SuppressWarnings("unused")
public int getHasCalledBeforeActionBeanResolutionWillNeverBeCalled() { return hasCalledBeforeActionBeanResolutionWillNeverBeCalled; }
public int getHasCalledBeforeWithReturn() { return hasCalledBeforeWithReturn; }
public int getHasCalledBeforeWithParameter() { return hasCalledBeforeWithParameter; }
public int getHasCalledBeforeWithReturnAndParameter() { return hasCalledBeforeWithReturnAndParameter; }
public int getHasCalledDummyMethod() { return hasCalledDummyMethod; }
public int getHasCalledProtectedAfterMethod() { return hasCalledProtectedAfterMethod; }
public int getHasCalledProtectedBeforeMethod() { return hasCalledProtectedBeforeMethod; }
public int getHasCalledBeforeAfterDefaultStage() { return hasCalledBeforeAfterDefaultStage; }
public int getHasCalledBeforeAfterOnSingleEvent() { return hasCalledBeforeAfterOnSingleEvent; }
}
private static class TestExecutionContext extends ExecutionContext {
@Override
public Resolution proceed() throws Exception {
return new ForwardResolution("wakker");
}
}
}