/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package test.intercept.execution;
import junit.framework.TestCase;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
import org.codehaus.aspectwerkz.intercept.BeforeAdvice;
import org.codehaus.aspectwerkz.intercept.Advisable;
import org.codehaus.aspectwerkz.intercept.AroundAdvice;
import org.codehaus.aspectwerkz.intercept.AfterAdvice;
import org.codehaus.aspectwerkz.intercept.AfterReturningAdvice;
import org.codehaus.aspectwerkz.intercept.AfterThrowingAdvice;
/**
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class InterceptTest extends TestCase {
private static String LOG = "";
public static void log(String msg) {
LOG += msg;
}
public void testIsAdvisable() {
assertTrue(this instanceof Advisable);
}
public void testAddAround() {
LOG = "";
adviseWithAround();
assertEquals("adviseWithAround ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAround(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around1_pre_execution ");
Object result = jp.copy().proceed();
InterceptTest.log("around1_post_execution ");
return result;
}
}
);
LOG = "";
adviseWithAround();
assertEquals("around1_pre_execution adviseWithAround around1_post_execution ", LOG);
}
public void testAddAndRemoveAround() {
LOG = "";
adviseWithAround2();
assertEquals("adviseWithAround2 ", LOG);
final AroundAdvice advice = new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around1_pre_execution ");
Object result = jp.proceed();
InterceptTest.log("around1_post_execution ");
return result;
}
};
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAround2(..))",
advice
);
LOG = "";
adviseWithAround2();
assertEquals("around1_pre_execution adviseWithAround2 around1_post_execution ", LOG);
((Advisable) this).aw_removeAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAround2(..))",
advice.getClass()
);
LOG = "";
adviseWithAround2();
assertEquals("adviseWithAround2 ", LOG);
}
public void testAddAroundStack() {
LOG = "";
adviseWithAroundStack();
assertEquals("adviseWithAroundStack ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAroundStack(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around2_pre_execution ");
Object result = jp.proceed();
InterceptTest.log("around2_post_execution ");
return result;
}
}
);
LOG = "";
adviseWithAroundStack();
assertEquals("around2_pre_execution adviseWithAroundStack around2_post_execution ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAroundStack(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around3_pre_execution ");
Object result = jp.proceed();
InterceptTest.log("around3_post_execution ");
return result;
}
}
);
LOG = "";
adviseWithAroundStack();
assertEquals(
"around2_pre_execution around3_pre_execution adviseWithAroundStack around3_post_execution around2_post_execution ",
LOG
);
}
public void testAddBefore() {
LOG = "";
adviseWithBefore();
assertEquals("adviseWithBefore ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithBefore(..))",
new BeforeAdvice() {
public void invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("before ");
}
}
);
LOG = "";
adviseWithBefore();
assertEquals("before adviseWithBefore ", LOG);
}
public void testAddAfter() {
LOG = "";
adviseWithAfter();
assertEquals("adviseWithAfter ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAfter(..))",
new AfterAdvice() {
public void invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("afterFinally ");
}
}
);
LOG = "";
adviseWithAfter();
assertEquals("adviseWithAfter afterFinally ", LOG);
}
public void testAddAfterReturning() {
LOG = "";
adviseWithAfterReturning();
assertEquals("adviseWithAfterReturning ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAfterReturning(..))",
new AfterReturningAdvice() {
public void invoke(JoinPoint jp, Object returnValue) throws Throwable {
InterceptTest.log("afterReturning ");
InterceptTest.log((String) returnValue);
InterceptTest.log(" ");
}
}
);
LOG = "";
adviseWithAfterReturning();
assertEquals("adviseWithAfterReturning afterReturning returnValue ", LOG);
}
public void testAddAfterReturningPrimitive() {
LOG = "";
adviseWithAfterReturningPrimitive();
assertEquals("adviseWithAfterReturningPrimitive ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAfterReturningPrimitive(..))",
new AfterReturningAdvice() {
public void invoke(JoinPoint jp, Object returnValue) throws Throwable {
InterceptTest.log("afterReturning ");
InterceptTest.log(((Integer) returnValue).toString());
InterceptTest.log(" ");
}
}
);
LOG = "";
adviseWithAfterReturningPrimitive();
assertEquals("adviseWithAfterReturningPrimitive afterReturning -1 ", LOG);
}
public void testAddAfterThrowing() {
LOG = "";
try {
adviseWithAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("adviseWithAfterThrowing ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.adviseWithAfterThrowing(..))",
new AfterThrowingAdvice() {
public void invoke(JoinPoint jp, Throwable exception) throws Throwable {
InterceptTest.log("afterThrowing ");
InterceptTest.log(exception.getMessage());
InterceptTest.log(" ");
}
}
);
LOG = "";
try {
adviseWithAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("adviseWithAfterThrowing afterThrowing noop ", LOG);
}
public void testAddAfterAndAfterThrowing() {
LOG = "";
try {
addAfterAndAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("addAfterAndAfterThrowing ", LOG);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.addAfterAndAfterThrowing(..))",
new AfterAdvice() {
public void invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("after ");
}
}
);
((Advisable) this).aw_addAdvice(
"execution(* test.intercept.execution.InterceptTest.addAfterAndAfterThrowing(..))",
new AfterThrowingAdvice() {
public void invoke(JoinPoint jp, Throwable exception) throws Throwable {
InterceptTest.log("afterThrowing ");
InterceptTest.log(exception.getMessage());
InterceptTest.log(" ");
}
}
);
LOG = "";
try {
addAfterAndAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("addAfterAndAfterThrowing afterThrowing noop after ", LOG);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static junit.framework.Test suite() {
return new junit.framework.TestSuite(InterceptTest.class);
}
public void adviseWithAround() {
log("adviseWithAround ");
}
public void adviseWithAround2() {
log("adviseWithAround2 ");
}
public void adviseWithAroundStack() {
log("adviseWithAroundStack ");
}
public void adviseWithBefore() {
log("adviseWithBefore ");
}
public void adviseWithAfter() {
log("adviseWithAfter ");
}
public Object adviseWithAfterReturning() {
log("adviseWithAfterReturning ");
return "returnValue";
}
public int adviseWithAfterReturningPrimitive() {
log("adviseWithAfterReturningPrimitive ");
return -1;
}
public void adviseWithAfterThrowing() {
log("adviseWithAfterThrowing ");
throw new RuntimeException("noop");
}
public void addAfterAndAfterThrowing() {
log("addAfterAndAfterThrowing ");
throw new RuntimeException("noop");
}
}