LocalExtensionManagerTest.java :  » Byte-Code » PROSE » ch » ethz » prose » Java Open Source

Java Open Source » Byte Code » PROSE 
PROSE » ch » ethz » prose » LocalExtensionManagerTest.java
// $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$
//
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.