/**************************************************************************************
* 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.call;
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() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithAround();
assertEquals("adviseWithAround ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAround(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around1_pre_call ");
Object result = jp.proceed();
InterceptTest.log("around1_post_call ");
return result;
}
}
);
LOG = "";
callee.adviseWithAround();
assertEquals("around1_pre_call adviseWithAround around1_post_call ", LOG);
}
public void testAddAndRemoveAround() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithAround2();
assertEquals("adviseWithAround2 ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAround2(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around1_pre_call ");
Object result = jp.proceed();
InterceptTest.log("around1_post_call ");
return result;
}
}
);
LOG = "";
callee.adviseWithAround2();
assertEquals("around1_pre_call adviseWithAround2 around1_post_call ", LOG);
((Advisable) this).aw_removeAdvice("call(* test.intercept.call.Callee.adviseWithAround2(..))", AroundAdvice.class);
LOG = "";
callee.adviseWithAround2();
assertEquals("adviseWithAround2 ", LOG);
}
public void testAddAroundStack() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithAroundStack();
assertEquals("adviseWithAroundStack ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAroundStack(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around2_pre_call ");
Object result = jp.proceed();
InterceptTest.log("around2_post_call ");
return result;
}
}
);
LOG = "";
callee.adviseWithAroundStack();
assertEquals("around2_pre_call adviseWithAroundStack around2_post_call ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAroundStack(..))",
new AroundAdvice() {
public Object invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("around3_pre_call ");
Object result = jp.proceed();
InterceptTest.log("around3_post_call ");
return result;
}
}
);
LOG = "";
callee.adviseWithAroundStack();
assertEquals(
"around2_pre_call around3_pre_call adviseWithAroundStack around3_post_call around2_post_call ", LOG
);
}
public void testAddBefore() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithBefore();
assertEquals("adviseWithBefore ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithBefore(..))",
new BeforeAdvice() {
public void invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("before ");
}
}
);
LOG = "";
callee.adviseWithBefore();
assertEquals("before adviseWithBefore ", LOG);
}
public void testAddAfter() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithAfter();
assertEquals("adviseWithAfter ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAfter(..))",
new AfterAdvice() {
public void invoke(JoinPoint jp) throws Throwable {
InterceptTest.log("afterFinally ");
}
}
);
LOG = "";
callee.adviseWithAfter();
assertEquals("adviseWithAfter afterFinally ", LOG);
}
public void testAddAfterReturning() {
Callee callee = new Callee();
LOG = "";
callee.adviseWithAfterReturning();
assertEquals("adviseWithAfterReturning ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAfterReturning(..))",
new AfterReturningAdvice() {
public void invoke(JoinPoint jp, Object returnValue) throws Throwable {
InterceptTest.log("afterReturning ");
InterceptTest.log((String) returnValue);
InterceptTest.log(" ");
}
}
);
LOG = "";
callee.adviseWithAfterReturning();
assertEquals("adviseWithAfterReturning afterReturning returnValue ", LOG);
}
public void testAddAfterThrowing() {
Callee callee = new Callee();
LOG = "";
try {
callee.adviseWithAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("adviseWithAfterThrowing ", LOG);
((Advisable) this).aw_addAdvice(
"call(* test.intercept.call.Callee.adviseWithAfterThrowing(..))",
new AfterThrowingAdvice() {
public void invoke(JoinPoint jp, Throwable exception) throws Throwable {
InterceptTest.log("afterThrowing ");
InterceptTest.log(exception.getMessage());
InterceptTest.log(" ");
}
}
);
LOG = "";
try {
callee.adviseWithAfterThrowing();
} catch (RuntimeException e) {
}
assertEquals("adviseWithAfterThrowing afterThrowing noop ", 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);
}
}