// $Id$
// =====================================================================
//
// (history at end)
//
package ch.ethz.prose;
// used packages
import java.lang.reflect.Method;
import java.util.*;
import junit.framework.*;
import ch.ethz.jvmai.ExceptionJoinPoint;
import ch.ethz.prose.crosscut.*;
import ch.ethz.prose.engine.ExceptionThrowRequest;
import ch.ethz.prose.engine.JoinPointManager;
import ch.ethz.prose.filter.*;
import ch.ethz.prose.query.*;
/**
* JUnit testcase for class tests the correctness of the
* <code>Local Aspect Manager</code> implementation.
*
* @version $Revision$
* @author Andrei Popovici
*/
public class LocalExtensionManagerTest extends TestCase {
public boolean visited = false;
public boolean visited1 = false;
public boolean visited2=false;
public void myTestMethod() { }
class TestExtension1 extends DefaultAspect
{
public void insertionAction(boolean flag)
{
LocalExtensionManagerTest.this.myTestMethod();
}
public Crosscut c1 = new MethodCut()
{
public void METHOD_ARGS(LocalExtensionManagerTest x)
{
visited1=true;
visited = true;
}
protected PointCutter pointCutter() { return Within.method("myTestMethod");}
};
};
class TestExtension2 extends DefaultAspect
{
public void insertionAction(boolean flag)
{
LocalExtensionManagerTest.this.myTestMethod();
}
public Crosscut c1 = new MethodCut()
{
public void METHOD_ARGS(LocalExtensionManagerTest x)
{
visited2 = true;
}
protected PointCutter pointCutter() { return Within.method("myTestMethod");}
};
}
Aspect tstExtension = null;
Aspect tstExtension2 = null;
// fixture for queryMethods
int ASP = QueryManager.SELECT_ASPECT; int CRO = QueryManager.SELECT_CROSSCUT; int JOI = QueryManager.SELECT_JOINPOINT;
int ASP_CRO = ASP+CRO; int ASP_JOI = ASP+JOI; int CRO_JOI = CRO+JOI;
int ASP_CRO_JOI = ASP+CRO+JOI;
int GROUP_ASP = QueryManager.GROUP_BY_ASPECT;
int GROUP_CRO = QueryManager.GROUP_BY_CROSSCUT;
int GROUP_JOI = QueryManager.GROUP_BY_JOINPOINT;
JoinPointManager jpm = null;
AspectManager exMngr = null;
public static class Extension1 extends DefaultAspect
{
public Crosscut c1a = new ThrowCut()
{
public void THROW_ARGS() { }
public Class[] potentialCrosscutClasses()
{
Class[] result = { LinkageError.class,
IllegalStateException.class,
InstantiationError.class,
NullPointerException.class,
RuntimeException.class,
ClassFormatError.class,
UnknownError.class};
return result;
}
protected PointCutter pointCutter()
{ return (Exceptions.type("LinkageError")) . OR (Exceptions.type("IllegalStateException")) ;}
};
};
public static class Extension2 extends DefaultAspect
{
//2 excceptions
public Crosscut c2a = new ThrowCut()
{
public void THROW_ARGS() { }
public Class[] potentialCrosscutClasses()
{ Class[] result = { LinkageError.class,
IllegalStateException.class,
InstantiationError.class,
NullPointerException.class,
RuntimeException.class,
ClassFormatError.class,
UnknownError.class}; return result; }
protected PointCutter pointCutter()
{
return (Exceptions.type("InstantiationError")) . OR (Exceptions.type("UnknownError"));
}
};
public Crosscut c2b = new ThrowCut()
{
// 2 exceptions
public void THROW_ARGS() { }
public Class[] potentialCrosscutClasses()
{ Class[] result = { LinkageError.class,
IllegalStateException.class,
InstantiationError.class,
NullPointerException.class,
RuntimeException.class,
ClassFormatError.class,
UnknownError.class}; return result; }
protected PointCutter pointCutter()
{ return (Exceptions.type("NullPointerException")) . OR (Exceptions.type("RuntimeException"));}
};
// 2 exceptions
public Crosscut c2c = new ThrowCut()
{
public void THROW_ARGS() { }
public Class[] potentialCrosscutClasses()
{
Class[] result = { LinkageError.class,
IllegalStateException.class,
InstantiationError.class,
NullPointerException.class,
RuntimeException.class,
ClassFormatError.class,
UnknownError.class}; return result;
}
protected PointCutter pointCutter()
{ return (Exceptions.type("ClassFormatError")) . OR (Exceptions.type("UnknownError")); }
};
};
// This Aspect don't have a joinpoint!
public static class Extension3 extends DefaultAspect
{
public Crosscut c3a = new ThrowCut()
{
public void THROW_ARGS() { }
protected PointCutter pointCutter()
{ return (Exceptions.type("thisIsSurelyNotAnException")) ;}
};
};
/**
* Construct test with given name.
* @param name test name
*/
public LocalExtensionManagerTest(String name)
{
super(name);
}
/**
* Set up fixture.
*/
public void setUp()
{
tstExtension = new TestExtension1();
tstExtension2 = new TestExtension2();
try {
ProseSystem.startup();
exMngr = ProseSystem.getAspectManager();
jpm = ProseSystem.getAspectManager().getJoinPointManager();
}
catch (SystemStartupException e) {
Assert.fail("could not start ProseSystem");
}
}
public void tearDown()
{
try {
ProseSystem.teardown();
}
catch (SystemTeardownException e) {
Assert.fail("could not teardown ProseSystem");
}
}
/** This test checks that the call to a breakpointed method
* <em>during</em> <code>insert</code> is not dispatched to
* the extension. <em>THIS TEST FAILES!! FIX!!</em>
*
*/
public void test0010_SilenceDuringInsertion()
{
visited = false;
ProseSystem.getAspectManager().insert(tstExtension);
assertTrue("not visited during insertion",!visited);
visited = false;
myTestMethod();
assertTrue("visited after insertion", visited);
}
public void test0020_queryAspect()
{
List result;
List aspectList = new Vector();
AspectManager exMngr = ProseSystem.getAspectManager();
Aspect aspect1 = new Extension1();
Aspect aspect2 = new Extension2();
Aspect aspect3 = new Extension3();
ProseSystem.getAspectManager().insert(aspect1);
ProseSystem.getAspectManager().insert(aspect2);
ProseSystem.getAspectManager().insert(aspect3);
aspectList.add(new AspectSurrogate(aspect1));
aspectList.add(new AspectSurrogate(aspect2));
aspectList.add(new AspectSurrogate(aspect3));
QueryManager qMgr = new QueryManager(ProseSystem.getAspectManager());
// Test every combination of 'select' value in queryAspect
assertTrue("wrong select range", qMgr.queryAspects(aspectList, 0x00, GROUP_ASP).isEmpty());
// FIXME!!
result = qMgr.queryAspects(aspectList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("select Aspect + Crosscut + Joinpoint", 9, result.size());
result = qMgr.queryAspects(aspectList, ASP_CRO, GROUP_ASP);
assertEquals("select Aspect + Crosscut", 5, result.size());
//result = qMgr.queryAspects(aspectList, ASP_JOI, GROUP_ASP);
//assertEquals("select Aspect + Joinpoint", 8, result.size());
result = qMgr.queryAspects(aspectList, CRO_JOI, GROUP_ASP);
assertEquals("select Crosscut + Joinpoint", 9, result.size());
result = qMgr.queryAspects(aspectList, ASP, GROUP_ASP);
assertEquals("select Aspect", 3, result.size());
result = qMgr.queryAspects(aspectList, CRO, GROUP_ASP);
assertEquals("select Crosscut", 5, result.size());
result = qMgr.queryAspects(aspectList, JOI, GROUP_ASP);
assertEquals("select Joinpoint", 8, result.size());
}
public void test0030_queryCrosscut()
{
List result;
List crosscutList = new Vector();
LocalExtensionManagerTest.Extension1 aspect1 = new Extension1();
LocalExtensionManagerTest.Extension2 aspect2 = new Extension2();
LocalExtensionManagerTest.Extension3 aspect3 = new Extension3();
ProseSystem.getAspectManager().insert(aspect1);
ProseSystem.getAspectManager().insert(aspect2);
ProseSystem.getAspectManager().insert(aspect3);
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect1),aspect1.c1a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2b));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2c));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect3),aspect3.c3a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect1),aspect1.c1a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect1),aspect1.c1a));
QueryManager qMgr = new QueryManager(ProseSystem.getAspectManager());
// Test every combination of 'select' value in queryCrosscuts
assertTrue("wrong select range", qMgr.queryCrosscuts(crosscutList, 0x00, GROUP_ASP).isEmpty());
result = qMgr.queryCrosscuts(crosscutList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("select Aspect + Crosscut + Joinpoint", 9, result.size());
result = qMgr.queryCrosscuts(crosscutList, ASP_CRO, GROUP_ASP);
assertEquals("select Aspect + Crosscut", 5, result.size());
result = qMgr.queryCrosscuts(crosscutList, ASP_JOI, GROUP_ASP);
assertEquals("select Aspect + Joinpoint", 8, result.size());
result = qMgr.queryCrosscuts(crosscutList, CRO_JOI, GROUP_ASP);
assertEquals("select Crosscut + Joinpoint", 9, result.size());
result = qMgr.queryCrosscuts(crosscutList, ASP, GROUP_ASP);
assertEquals("select Aspect", 3, result.size());
result = qMgr.queryCrosscuts(crosscutList, CRO, GROUP_ASP);
assertEquals("select Crosscut", 5, result.size());
result = qMgr.queryCrosscuts(crosscutList, JOI, GROUP_ASP);
assertEquals("select Joinpoint", 8, result.size());
}
public void test0040_queryJoinpoint()
{
List result;
List joinpointList = new Vector();
try{
Aspect aspect1 = new Extension1();
Aspect aspect2 = new Extension2();
Aspect aspect3 = new Extension3();
QueryManager qMgr = new QueryManager(ProseSystem.getAspectManager());
ProseSystem.getAspectManager().insert(aspect1);
ProseSystem.getAspectManager().insert(aspect2);
ProseSystem.getAspectManager().insert(aspect3);
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,LinkageError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,IllegalStateException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,InstantiationError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,UnknownError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,NullPointerException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,RuntimeException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,ClassFormatError.class)));
// one joinpoint that is not member to an inserted aspect
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,SystemStartupException.class)));
// two joinpoints added twice (should not have any influence)
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,RuntimeException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,ClassFormatError.class)));
// Test every combination of 'select' value in queryJoinpoints
assertTrue("wrong select range", qMgr.queryJoinpoints(joinpointList, 0x00, GROUP_ASP).isEmpty());
result = qMgr.queryJoinpoints(joinpointList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("select Aspect + Crosscut + Joinpoint", 8, result.size());
result = qMgr.queryJoinpoints(joinpointList, ASP_CRO, GROUP_ASP);
assertEquals("select Aspect + Crosscut", 4, result.size());
result = qMgr.queryJoinpoints(joinpointList, ASP_JOI, GROUP_ASP);
assertEquals("select Aspect + Joinpoint", 7, result.size());
result = qMgr.queryJoinpoints(joinpointList, CRO_JOI, GROUP_ASP);
assertEquals("select Crosscut + Joinpoint", 8, result.size());
result = qMgr.queryJoinpoints(joinpointList, ASP, GROUP_ASP);
assertEquals("select Aspect", 2, result.size());
result = qMgr.queryJoinpoints(joinpointList, CRO, GROUP_ASP);
assertEquals("select Crosscut", 4, result.size());
result = qMgr.queryJoinpoints(joinpointList, JOI, GROUP_ASP);
assertEquals("select Joinpoint", 7, result.size());
} catch (Exception e) {e.printStackTrace();}
}
// Test the 3 GROUP_BY combinations in all 3 'query'-methods (where all columns are selected)
public void test0050_queryGroupBy()
{
try{
List result;
List aspectList = new Vector();
List crosscutList = new Vector();
List joinpointList = new Vector();
LocalExtensionManagerTest.Extension1 aspect1 = new Extension1();
LocalExtensionManagerTest.Extension2 aspect2 = new Extension2();
LocalExtensionManagerTest.Extension3 aspect3 = new Extension3();
ProseSystem.getAspectManager().insert(aspect1);
ProseSystem.getAspectManager().insert(aspect2);
ProseSystem.getAspectManager().insert(aspect3);
aspectList.add(new AspectSurrogate(aspect1));
aspectList.add(new AspectSurrogate(aspect2));
aspectList.add(new AspectSurrogate(aspect3));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect1),aspect1.c1a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2a));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2b));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect2),aspect2.c2c));
crosscutList.add(new CrosscutSurrogate(new AspectSurrogate(aspect3),aspect3.c3a));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,LinkageError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,IllegalStateException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,InstantiationError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,UnknownError.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,NullPointerException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,RuntimeException.class)));
joinpointList.add(new JoinPointRequestSurrogate((ExceptionThrowRequest)jpm.createJoinPointRequest(ExceptionJoinPoint.KIND,ClassFormatError.class)));
QueryManager qMngr = new QueryManager(ProseSystem.getAspectManager());
result = qMngr.queryAspects(aspectList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("queryAspects with groupBy Aspects", 2, computeTransitions(result, "getAspectSurrogate"));
result = qMngr.queryAspects(aspectList, ASP_CRO_JOI, GROUP_CRO);
assertEquals("queryAspects with groupBy Crosscuts", 4, computeTransitions(result, "getCrosscutSurrogate"));
result = qMngr.queryAspects(aspectList, ASP_CRO_JOI, GROUP_JOI);
assertEquals("queryAspects with groupBy Joinpoints", 7, computeTransitions(result, "getRequestSurrogate"));
result = qMngr.queryCrosscuts(crosscutList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("queryCrosscuts with groupBy Aspects", 2, computeTransitions(result, "getAspectSurrogate"));
result = qMngr.queryCrosscuts(crosscutList, ASP_CRO_JOI, GROUP_CRO);
assertEquals("queryCrosscuts with groupBy Crosscuts", 4, computeTransitions(result, "getCrosscutSurrogate"));
result = qMngr.queryCrosscuts(crosscutList, ASP_CRO_JOI, GROUP_JOI);
assertEquals("queryCrosscuts with groupBy Joinpoints", 7, computeTransitions(result, "getRequestSurrogate"));
result = qMngr.queryJoinpoints(joinpointList, ASP_CRO_JOI, GROUP_ASP);
assertEquals("queryJoinpoints with groupBy Aspects", 1, computeTransitions(result, "getAspectSurrogate"));
result = qMngr.queryJoinpoints(joinpointList, ASP_CRO_JOI, GROUP_CRO);
assertEquals("queryJoinpoints with groupBy Crosscuts", 3, computeTransitions(result, "getCrosscutSurrogate"));
result = qMngr.queryJoinpoints(joinpointList, ASP_CRO_JOI, GROUP_JOI);
assertEquals("queryJoinpoints with groupBy Joinpoints", 6, computeTransitions(result, "getRequestSurrogate"));
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.toString());
}
}
// compute the transitions in the ordered collection. it should be the minimum.
// for multiple use of this method, the method invokation in the comparing is parameterized.
private int computeTransitions(List resultList, String queryMethod)
{
try {
Object o=null; int code=0, codeOld=0; boolean start=true;
int transition = 0;
Method m = Tuple.class.getDeclaredMethod(queryMethod, new Class[] {});
Object[] emptyArray = new Object[] {};
Iterator i = resultList.listIterator();
while (i.hasNext())
{
Tuple crtTuple = (Tuple)i.next();
o = m.invoke(crtTuple, emptyArray);
if (o == null)
code = 0;
else {
code = o.hashCode();
}
if (start) {
start = false;
codeOld = code;
continue;
}
if (code != codeOld)
transition++;
codeOld = code;
}
return transition;
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public void test0060_testCommit()
{
Object txId = new Object();
visited1 = false; visited2=false;
ProseSystem.getAspectManager().insert(tstExtension,txId);
myTestMethod();
assertTrue("[1] not visited before commit",!visited1);
assertTrue("[2] not visited before commit",!visited2);
ProseSystem.getAspectManager().insert(tstExtension2,txId);
myTestMethod();
assertTrue("[3] not visited before commit",!visited1);
assertTrue("[4] not visited before commit",!visited2);
ProseSystem.getAspectManager().commit(txId);
myTestMethod();
assertTrue("[5] visited after commit",visited1);
assertTrue("[6] visited after commit",visited2);
}
public void test0070_testAbort()
{
Object txId = new Object();
visited1 = false; visited2=false;
ProseSystem.getAspectManager().insert(tstExtension,txId);
myTestMethod();
assertTrue("[1] not visited before commit",!visited1);
assertTrue("[2] not visited before commit",!visited2);
ProseSystem.getAspectManager().insert(tstExtension2,txId);
myTestMethod();
assertTrue("[3] not visited before commit",!visited1);
assertTrue("[4] not visited before commit",!visited2);
ProseSystem.getAspectManager().abort(txId);
myTestMethod();
assertTrue("[5] visited after commit",!visited1);
assertTrue("[6] visited after commit",!visited2);
assertEquals("no extension inserted", ProseSystem.getAspectManager().getAllAspects().size(),0);
}
/**
* Test suite.
* @return test instance
*/
public static Test suite()
{
return new TestSuite(LocalExtensionManagerTest.class);
}
}
//======================================================================
//
// $Log$
//
|