[jboss-cvs] JBossAS SVN: r90770 - in projects/kernel/trunk: dependency/src/main/java/org/jboss/dependency/plugins and 14 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jul 2 11:02:37 EDT 2009


Author: kabir.khan at jboss.com
Date: 2009-07-02 11:02:36 -0400 (Thu, 02 Jul 2009)
New Revision: 90770

Added:
   projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/AsynchronousTestDelegate.java
   projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/Synchronizer.java
   projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/test/AsynchronousTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/BeanWithCreateStart.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/ByteManException.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Helper.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Point.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTest.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTestDelegate.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.java
   projects/kernel/trunk/kernel/src/test/resources/build.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/Copy.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase_NotAutomatic.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase_NotAutomatic.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.txt
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/BeanWithAsynchronousMode.xml
Modified:
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SecurityActions.java
   projects/kernel/trunk/kernel/.classpath
   projects/kernel/trunk/kernel/.project
   projects/kernel/trunk/kernel/pom.xml
   projects/kernel/trunk/kernel/src/main/java/org/jboss/test/kernel/junit/MicrocontainerTest.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanJaxbTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanTestCase.java
   projects/kernel/trunk/pom.xml
Log:
[JBKERNEL-25] Implementation and tests for parallel deployments

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -34,6 +34,7 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.jboss.dependency.plugins.action.ControllerContextAction;
@@ -938,7 +939,7 @@
          currentIndex = states.indexOf(fromState);
          fromContexts = fromController.getContextsByState(fromState);
          if (fromContexts.contains(context) == false)
-            throw new IllegalStateException("Context not found in previous state: " + context.toShortString());
+            throw new IllegalStateException("Context not found in previous state (" + fromState + "): " + context.toShortString());
       }
 
       int toIndex = currentIndex + 1;
@@ -1065,6 +1066,11 @@
                if (trace)
                   log.trace("Skipping already installed " + name + " for " + toState.getStateString());
             }
+            else if (executorThreadsByContext.get(context) != null && Thread.currentThread() != executorThreadsByContext.get(context))
+            {
+               if (trace)
+                  log.trace("Installed by other thread " + name);
+            }
             else if (installing.add(context) == false)
             {
                if (trace)
@@ -1096,7 +1102,7 @@
                         if (trace)
                            log.trace("Dependencies resolved " + name + " for " + toState.getStateString());
 
-                        if (incrementState(context, trace))
+                        if (executeOrIncrementStateDirectly(context, trace))
                         {
                            resolutions = true;
                            if (trace)
@@ -1126,8 +1132,90 @@
 
       return resolutions;
    }
+   
+   /**
+    * Increment state in the current thread, or asynchonously if the context has {@link ControllerMode#ASYNCHRONOUS} and we find an executor<p>
+    * <p/>
+    * This method must be invoked with the write lock taken.
+    *
+    * @param context the context
+    * @param trace   whether trace is enabled
+    * @return whether the increment suceeded. If the context could be incremented asynchronously false is returned
+    */
+   private boolean executeOrIncrementStateDirectly(ControllerContext context, boolean trace)
+   {
+      boolean asynch = false;
+      if (context.getMode() == ControllerMode.ASYNCHRONOUS)
+      {
+         if (Thread.currentThread() != executorThreadsByContext.get(context))
+         {
+            final Thread ctxThread = executorThreadsByContext.get(context);
+            if (ctxThread == null || ctxThread != Thread.currentThread())
+            {
+               asynch = true;
+            }
+         }
+      }
+      
+      if (asynch)
+      {
+         if (executor == null)
+            log.warn("No executor in controller " + this + " to use installing asynchronous context " + context);
 
+         Executor foundExecutor = searchForExecutor();
+         if (foundExecutor != null)
+         {
+            executorThreadsByContext.put(context, SCHEDULED_FOR_EXECUTOR);
+
+            if (trace)
+               log.trace("Recorded for asynchronous installation " + context.getName());
+
+            InstallControllerContextTask task = new InstallControllerContextTask(context, trace);
+            try
+            {
+               foundExecutor.execute(task);
+               return false;
+            }
+            catch(RejectedExecutionException e)
+            {
+               log.warn("Asynchronous execution rejected by executor for context " + context.getName() + ":" + e.getMessage());
+               executorThreadsByContext.remove(context);
+            }
+         }
+      }
+
+      return incrementState(context, trace);
+   }
+   
    /**
+    * Return the executor stored in this controller or in its parent hierarchy. The nearest executor is returned.
+    * <p/>
+    * This method must be called with the write or read lock taken
+    * @return The found executor
+    */
+   protected Executor searchForExecutor()
+   {
+      if (executor != null)
+      {
+         return executor;
+      }
+      AbstractController parent = getParentController();
+      if (parent != null)
+      {
+        try
+        {
+           parent.lockRead();
+           return parent.searchForExecutor();
+        }
+        finally
+        {
+           parent.unlockRead();
+        }
+      }
+      return null;
+   }
+
+   /**
     * Resolve contexts<p>
     * <p/>
     * This method must be invoked with the write lock taken
@@ -1147,10 +1235,9 @@
          {
             if (advance(ctx))
             {
-               DependencyInfo dependencies = ctx.getDependencyInfo();
                try
                {
-                  if (dependencies == null || dependencies.resolveDependencies(this, state))
+                  if (resolveDependencies(ctx, state))
                      result.add(ctx);
                }
                catch (Throwable error)
@@ -1166,6 +1253,21 @@
 
       return result;
    }
+   
+   /**
+    * See if the context has its dependencies resolved to move to the given state.
+    * <p/>
+    * This method must be invoked with the write lock taken
+    * 
+    * @param ctx The context
+    * @param state The state we want to move to
+    * @return true if the dependencies are resolved
+    */
+   private boolean resolveDependencies(ControllerContext ctx, ControllerState state)
+   {
+      DependencyInfo dependencies = ctx.getDependencyInfo();
+      return dependencies == null || dependencies.resolveDependencies(this, state);
+   }
 
    /**
     * Uninstall a context
@@ -2052,4 +2154,101 @@
       else
          return states.get(index);
    }
+   
+
+   private Map<ControllerContext, Thread> executorThreadsByContext = new ConcurrentHashMap<ControllerContext, Thread>();
+   
+   class InstallControllerContextTask implements Runnable
+   {
+      ControllerContext context;
+      ClassLoader classLoader;
+      boolean trace;
+
+      public InstallControllerContextTask(ControllerContext context, boolean trace)
+      {
+         this.context = context;
+         this.classLoader = SecurityActions.getContextClassLoader();
+         this.trace = trace;
+      }
+      
+      public void run()
+      {
+         if (trace)
+            log.trace(Thread.currentThread().getName() + " starting asyncronous install of " + context.getName());
+         
+         lockWrite();
+         ClassLoader tcl = SecurityActions.setContextClassLoader(classLoader);
+         executorThreadsByContext.put(context, Thread.currentThread());
+         try
+         {
+            //Move the given context as far through the states as possible
+            boolean stateChanged = installMyContext();
+            
+            //The given context had its state changed, now see if anybody was dependent on it
+            if (stateChanged)
+            {
+               resolveContexts(trace);
+            }
+         }
+         catch (Throwable t)
+         {
+            log.error("Problem installing context asynchronously " + context, t);
+         }
+         finally
+         {
+            if (trace)
+               log.trace(Thread.currentThread().getName() + " asynchronous install done for " + context.getName());
+            executorThreadsByContext.remove(context);
+            SecurityActions.resetContextClassLoader(tcl);
+            unlockWrite();
+         }
+      }
+      
+      boolean installMyContext()
+      {
+         int currentIndex = states.indexOf(context.getState());
+         int requiredIndex = states.indexOf(context.getRequiredState());
+         if (requiredIndex == -1)
+            throw new IllegalArgumentException("Unknown state: " + context.getRequiredState());
+         
+         boolean resolved = true;
+         boolean stateChanged = false;
+
+         while(resolved && currentIndex < requiredIndex)
+         {
+            resolved = false;
+            ControllerState toState = states.get(currentIndex + 1);
+            if (advance(context))
+            {
+               try
+               {
+                  if (resolveDependencies(context, toState))
+                  {
+                     resolved = true;
+                  }
+               }
+               catch (Throwable error)
+               {
+                  log.error("Error resolving dependencies for " + toState.getStateString() + ": " + context.toShortString(), error);
+                  uninstallContext(context, ControllerState.NOT_INSTALLED, trace);
+                  errorContexts.put(context.getName(), context);
+                  context.setError(error);
+               }
+               
+               if (resolved)
+               {
+                  resolved = incrementState(context, trace);
+                  if (resolved)
+                  {
+                     stateChanged = true;
+                     currentIndex = states.indexOf(context.getState());
+                  }
+               }
+            }
+         }
+         return stateChanged;
+      }
+   }
+   
+   final static Thread SCHEDULED_FOR_EXECUTOR = new Thread();
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -248,9 +248,6 @@
    
    public void setMode(ControllerMode mode)
    {
-      if (ControllerMode.ASYNCHRONOUS.equals(mode))
-         throw new IllegalArgumentException("Not yet implemented, asynchronouse mode.");
-
       this.mode = mode;
       flushJBossObjectCache();
    }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SecurityActions.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SecurityActions.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SecurityActions.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -79,6 +79,31 @@
       }
    }
 
+   private static ClassLoader setContextClassLoaderInternal(final ClassLoader classLoader)
+   {
+      ClassLoader result = Thread.currentThread().getContextClassLoader();
+      Thread.currentThread().setContextClassLoader(classLoader);
+      return result;
+   }
+   
+   static ClassLoader setContextClassLoader(final ClassLoader classLoader)
+   {
+      if (System.getSecurityManager() == null)
+      {
+         return setContextClassLoaderInternal(classLoader);
+      }
+      else
+      {
+         return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+         {
+             public ClassLoader run()
+             {
+                return setContextClassLoaderInternal(classLoader);
+             }
+         });
+      }
+   }
+   
    static void resetContextClassLoader(final ClassLoader classLoader)
    {
       if (System.getSecurityManager() == null)
@@ -97,4 +122,22 @@
          });
       }
    }
+   
+   static ClassLoader getContextClassLoader()
+   {
+      if (System.getSecurityManager() == null)
+      {
+         return Thread.currentThread().getContextClassLoader();
+      }
+      else
+      {
+         return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+         {
+             public ClassLoader run()
+             {
+                return Thread.currentThread().getContextClassLoader();
+             }
+         });
+      }
+   }
 }

Added: projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/AsynchronousTestDelegate.java
===================================================================
--- projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/AsynchronousTestDelegate.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/AsynchronousTestDelegate.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,145 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.dependency.controller.support;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.logging.Logger;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousTestDelegate extends TestDelegate
+{
+   Synchronizer installSynchronizer;
+   Logger log = Logger.getLogger(AsynchronousTestDelegate.class);
+   
+   public AsynchronousTestDelegate(Object name, Synchronizer installSynchronizer)
+   {
+      super(name);
+      this.installSynchronizer = installSynchronizer;
+   }
+   
+   public void setInstallSynchronizer(Synchronizer installSynchronizer)
+   {
+      this.installSynchronizer = installSynchronizer;
+   }
+
+   @Override
+   public void configureInstall()
+   {
+      awaitStateEntryBarrier();
+      super.configureInstall();
+      debugLogThread("Configure");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.CONFIGURED);
+   }
+
+   @Override
+   public void createInstall()
+   {
+      awaitStateEntryBarrier();
+      super.createInstall();
+      debugLogThread("Create");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.CREATE);
+   }
+
+   @Override
+   public void describeInstall()
+   {
+      awaitInstallLatch();
+      awaitStateEntryBarrier();
+      super.describeInstall();
+      debugLogThread("Describe");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.DESCRIBED);
+   }
+
+   @Override
+   public void installInstall()
+   {
+      awaitStateEntryBarrier();
+      super.installInstall();
+      debugLogThread("Install");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.INSTALLED);
+   }
+
+   @Override
+   public void instantiateInstall()
+   {
+      awaitStateEntryBarrier();
+      super.instantiateInstall();
+      debugLogThread("Instantiate");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.INSTANTIATED);
+   }
+
+   @Override
+   public void startInstall()
+   {
+      awaitStateEntryBarrier();
+      super.startInstall();
+      debugLogThread("Start");
+      awaitStateExitBarrier();
+      countdownInstallWorkerEnd(ControllerState.START);
+   }
+
+   private void awaitInstallLatch()
+   {
+      if (installSynchronizer != null)
+      {
+         installSynchronizer.countdownWorkersAndWaitForStartSignal();
+      }
+   }
+   
+   private void awaitStateEntryBarrier()
+   {
+      if (installSynchronizer != null)
+      {
+         installSynchronizer.waitAtStateEntryBarrier();
+      }
+   }
+   
+   private void awaitStateExitBarrier()
+   {
+      if (installSynchronizer != null)
+      {
+         installSynchronizer.waitAtStateExitBarrier();
+      }
+   }
+   
+   private void countdownInstallWorkerEnd(ControllerState state)
+   {
+      if (installSynchronizer != null && installSynchronizer.getWorkerDoneState() == state)
+      {
+         installSynchronizer.countdownWorkerEnd();
+      }
+   }
+   
+   private void debugLogThread(String msg)
+   {
+      log.debug(Thread.currentThread().getName() + " " + getName() + " " + msg);
+   }
+}

Added: projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/Synchronizer.java
===================================================================
--- projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/Synchronizer.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/support/Synchronizer.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,188 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.dependency.controller.support;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CyclicBarrier;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.logging.Logger;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class Synchronizer
+{
+   Logger log = Logger.getLogger(Synchronizer.class.getName());
+   
+   int workers;
+   volatile CountDownLatch workerStartLatch;
+   volatile CountDownLatch startLatch;
+   volatile CountDownLatch workerEndLatch;
+   volatile CyclicBarrier workerStateEntryBarrier;
+   volatile CyclicBarrier workerStateExitBarrier;
+   volatile ControllerState workerDoneState = ControllerState.INSTALLED;
+   
+   public Synchronizer(int workers)
+   {
+      this(workers, true);
+   }
+   
+   public Synchronizer(int workers, boolean useBarrier)
+   {
+      this(workers, useBarrier, ControllerState.INSTALLED);
+   }
+
+   public Synchronizer(int workers, boolean useBarrier, ControllerState workerDoneState)
+   {
+      this(workers, true, useBarrier, workerDoneState);
+   }
+   
+   public Synchronizer(int workers, boolean useWorkersStart, boolean useBarrier, ControllerState workerDoneState)
+   {
+      this.workers = workers;
+      if (useWorkersStart)
+      {
+         workerStartLatch = new CountDownLatch(workers);
+         startLatch = new CountDownLatch(1);
+      }
+      workerEndLatch = new CountDownLatch(workers);
+      
+      if (useBarrier)
+      {
+         workerStateEntryBarrier = new CyclicBarrier(workers);
+         workerStateExitBarrier = new CyclicBarrier(workers);
+      }
+      this.workerDoneState = workerDoneState;
+   }
+   
+   public ControllerState getWorkerDoneState()
+   {
+      return workerDoneState;
+   }
+   
+   public void resetWorkerDone(ControllerState state)
+   {
+      workerDoneState = state;
+      workerEndLatch = new CountDownLatch(workers);
+   }
+   
+   public void countdownWorkersAndWaitForStartSignal()
+   {
+      if (workerStartLatch != null)
+      {
+         log.debug(Thread.currentThread().getName() + " worker counting down from " + workerStartLatch);
+         workerStartLatch.countDown();
+         log.debug(Thread.currentThread().getName() + " worker counted down to " + workerStartLatch);
+         try
+         {
+            log.debug(Thread.currentThread().getName() + " worker awaiting start");
+            startLatch.await();
+            log.debug(Thread.currentThread().getName() + " worker go!");
+         }
+         catch (InterruptedException e)
+         {
+            throw new RuntimeException(e);
+         }
+      }
+   }
+   
+   public void countdownWorkerEnd()
+   {
+      workerEndLatch.countDown();
+   }
+   
+   public void waitForWorkersAndEmitStartSignal()
+   {
+      if (workerStartLatch != null)
+      {
+         try
+         {
+            log.debug(Thread.currentThread().getName() + " main awaiting worker");
+            workerStartLatch.await();
+            log.debug(Thread.currentThread().getName() + " main driver go");
+         }
+         catch (InterruptedException e)
+         {
+            throw new RuntimeException(e);
+         }
+         log.debug(Thread.currentThread().getName() + " main counting down from " + startLatch);
+         startLatch.countDown();
+         log.debug(Thread.currentThread().getName() + " main counted down to " + startLatch);
+      }
+   }
+   
+   public void waitForWorkersToEnd()
+   {
+      try
+      {
+         workerEndLatch.await();
+         //This additional sleep should give enough time for the worker to finish before we check the state
+         Thread.sleep(100);
+      }
+      catch(InterruptedException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   public void waitAtStateEntryBarrier()
+   {
+      if (workerStateEntryBarrier != null)
+      {
+         try
+         {
+            workerStateEntryBarrier.await();
+         }
+         catch(BrokenBarrierException e)
+         {
+            throw new RuntimeException(e);
+         }
+         catch(InterruptedException e)
+         {
+            Thread.currentThread().interrupt();
+         }
+      }
+   }
+   
+   public void waitAtStateExitBarrier()
+   {
+      if (workerStateExitBarrier != null)
+      {
+         try
+         {
+            workerStateExitBarrier.await();
+         }
+         catch(BrokenBarrierException e)
+         {
+            throw new RuntimeException(e);
+         }
+         catch(InterruptedException e)
+         {
+            Thread.currentThread().interrupt();
+         }
+      }
+   }
+}

Added: projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/test/AsynchronousTestCase.java
===================================================================
--- projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/test/AsynchronousTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/test/AsynchronousTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,858 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.dependency.controller.test;
+
+import java.util.Arrays;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerMode;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.dependency.controller.support.AsynchronousTestDelegate;
+import org.jboss.test.dependency.controller.support.Synchronizer;
+import org.jboss.test.dependency.controller.support.TestControllerContext;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousTestCase extends AbstractDependencyTest
+{
+   public AsynchronousTestCase(String name)
+   {
+      super(name);
+   }
+
+   public void testSearchForExecutor() throws Throwable
+   {
+      class TestController extends AbstractController
+      {
+         @Override
+         protected Executor searchForExecutor()
+         {
+            return super.searchForExecutor();
+         }
+         
+         protected void setParentController(AbstractController parentController)
+         {
+            super.setParentController(parentController);
+         }
+      }
+
+      TestController root = new TestController();
+      assertNull(root.searchForExecutor());
+      Executor executor = Executors.newFixedThreadPool(1);
+      root.setExecutor(executor);
+      assertSame(executor, root.searchForExecutor());
+      root.setExecutor(null);
+      assertNull(root.searchForExecutor());
+      
+      TestController child1 = new TestController();
+      child1.setParentController(root);
+      TestController child2 = new TestController();
+      child2.setParentController(child1);
+      assertNull(root.searchForExecutor());
+      assertNull(child1.searchForExecutor());
+      assertNull(child2.searchForExecutor());
+      
+      root.setExecutor(executor);
+      assertSame(executor, root.searchForExecutor());
+      assertSame(executor, child1.searchForExecutor());
+      assertSame(executor, child2.searchForExecutor());
+      root.setExecutor(null);
+      
+      child1.setExecutor(executor);
+      assertNull(root.searchForExecutor());
+      assertSame(executor, child1.searchForExecutor());
+      assertSame(executor, child2.searchForExecutor());
+      child1.setExecutor(null);
+      
+      Executor executor2 = Executors.newFixedThreadPool(1);
+      root.setExecutor(executor);
+      child2.setExecutor(executor2);
+      assertSame(executor, root.searchForExecutor());
+      assertSame(executor, child1.searchForExecutor());
+      assertSame(executor2, child2.searchForExecutor());
+   }
+   
+   public void testNoExecutorInController() throws Throwable
+   {
+      clearExecutorInController();
+      AsynchronousTestDelegate delegate = getAsynchronousDelegate("Bean");
+      ControllerContext ctx = null;
+      boolean passed = false;
+      try
+      {
+         ctx = createAndInstallContext(delegate, ControllerState.INSTALLED);
+         assertInstalled(ctx);
+         assertEquals(1, delegate.describeInstallOrder);
+         assertEquals(2, delegate.instantiateInstallOrder);
+         assertEquals(3, delegate.configureInstallOrder);
+         assertEquals(4, delegate.createInstallOrder);
+         assertEquals(5, delegate.startInstallOrder);
+         assertEquals(6, delegate.installInstallOrder);
+         assertEquals(-1, delegate.installUninstallOrder);
+         assertEquals(-1, delegate.startUninstallOrder);
+         assertEquals(-1, delegate.createUninstallOrder);
+         assertEquals(-1, delegate.configureUninstallOrder);
+         assertEquals(-1, delegate.instantiateUninstallOrder);
+         assertEquals(-1, delegate.describeUninstallOrder);
+         passed = true;
+      }
+      finally
+      {
+         if (passed)
+         {
+            uninstallContext(ctx);
+            assertUninstalled(ctx);
+         }
+      }
+   }
+   
+   public void testOneAsynchronousContext() throws Throwable
+   {
+      setExecutorInController(1);
+      Synchronizer installSynchronizer = new Synchronizer(1);
+      AsynchronousTestDelegate delegate = getAsynchronousDelegate("Bean", installSynchronizer);
+      ControllerContext ctx = null;
+      try
+      {
+         ctx = createAndInstallContext(delegate, ControllerState.INSTALLED);
+         if (ctx.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         installSynchronizer.waitForWorkersAndEmitStartSignal();
+         installSynchronizer.waitForWorkersToEnd();
+         
+         assertEquals(1, delegate.describeInstallOrder);
+         assertEquals(2, delegate.instantiateInstallOrder);
+         assertEquals(3, delegate.configureInstallOrder);
+         assertEquals(4, delegate.createInstallOrder);
+         assertEquals(5, delegate.startInstallOrder);
+         assertEquals(6, delegate.installInstallOrder);
+         assertEquals(-1, delegate.installUninstallOrder);
+         assertEquals(-1, delegate.startUninstallOrder);
+         assertEquals(-1, delegate.createUninstallOrder);
+         assertEquals(-1, delegate.configureUninstallOrder);
+         assertEquals(-1, delegate.instantiateUninstallOrder);
+         assertEquals(-1, delegate.describeUninstallOrder);
+         
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx);
+            assertUninstalled(ctx);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+   
+   public void testChange() throws Throwable
+   {
+      setExecutorInController(2);
+      Synchronizer installSynchronizer = new Synchronizer(1);
+      AsynchronousTestDelegate delegate = getAsynchronousDelegate("Bean", installSynchronizer);
+      ControllerContext ctx = null;
+      try
+      {
+         ctx = createAndInstallContext(delegate, ControllerState.INSTALLED);
+         if (ctx.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         installSynchronizer.waitForWorkersAndEmitStartSignal();
+         installSynchronizer.waitForWorkersToEnd();
+         assertInstalled(ctx);
+         
+         controller.change(ctx, ControllerState.PRE_INSTALL);
+         
+         installSynchronizer = new Synchronizer(1);
+         delegate.setInstallSynchronizer(installSynchronizer);
+         controller.change(ctx, ControllerState.INSTALLED);
+         if (ctx.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         installSynchronizer.waitForWorkersAndEmitStartSignal();
+         installSynchronizer.waitForWorkersToEnd();
+         assertInstalled(ctx);
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx);
+            assertUninstalled(ctx);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+   
+   public void testTwoAsynchronousContexts() throws Throwable
+   {
+      setExecutorInController(2);
+      Synchronizer installSynchronizer = new Synchronizer(2);
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", installSynchronizer);
+      ControllerContext ctx1 = null;
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", installSynchronizer);
+      ControllerContext ctx2 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         if (ctx1.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         if (ctx1.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         installSynchronizer.waitForWorkersAndEmitStartSignal();
+         installSynchronizer.waitForWorkersToEnd();
+         assertInstalled(ctx1);
+         assertInstalled(ctx2);
+         assertSortedArray(new int[] {1, 2}, new int[] {delegate1.describeInstallOrder, delegate2.describeInstallOrder});
+         assertSortedArray(new int[] {3, 4}, new int[] {delegate1.instantiateInstallOrder, delegate2.instantiateInstallOrder});
+         assertSortedArray(new int[] {5, 6}, new int[] {delegate1.configureInstallOrder, delegate2.configureInstallOrder});
+         assertSortedArray(new int[] {7, 8}, new int[] {delegate1.createInstallOrder, delegate2.createInstallOrder});
+         assertSortedArray(new int[] {9, 10}, new int[] {delegate1.startInstallOrder, delegate2.startInstallOrder});
+         assertSortedArray(new int[] {11, 12}, new int[] {delegate1.installInstallOrder, delegate2.installInstallOrder});
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx1);
+            uninstallContext(ctx2);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+
+   public void testFiveAsynchronousContexts() throws Throwable
+   {
+      setExecutorInController(5);
+      Synchronizer installSynchronizer = new Synchronizer(5);
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", installSynchronizer);
+      ControllerContext ctx1 = null;
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", installSynchronizer);
+      ControllerContext ctx2 = null;
+      AsynchronousTestDelegate delegate3 = getAsynchronousDelegate("Bean3", installSynchronizer);
+      ControllerContext ctx3 = null;
+      AsynchronousTestDelegate delegate4 = getAsynchronousDelegate("Bean4", installSynchronizer);
+      ControllerContext ctx4 = null;
+      AsynchronousTestDelegate delegate5 = getAsynchronousDelegate("Bean5", installSynchronizer);
+      ControllerContext ctx5 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         if (ctx1.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         if (ctx1.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         ctx3 = createAndInstallContext(delegate3, ControllerState.INSTALLED);
+         if (ctx3.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         ctx4 = createAndInstallContext(delegate4, ControllerState.INSTALLED);
+         if (ctx4.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         ctx5 = createAndInstallContext(delegate5, ControllerState.INSTALLED);
+         if (ctx5.getState() == ControllerState.INSTALLED)
+         {
+            fail("Should have been installed asynchronously");
+         }
+         
+         installSynchronizer.waitForWorkersAndEmitStartSignal();
+         installSynchronizer.waitForWorkersToEnd();
+         assertInstalled(ctx1);
+         assertInstalled(ctx2);
+         assertInstalled(ctx3);
+         assertInstalled(ctx4);
+         assertInstalled(ctx5);
+
+         assertSortedArray(new int[] {1, 2, 3, 4, 5}, new int[] {
+               delegate1.describeInstallOrder, 
+               delegate2.describeInstallOrder, 
+               delegate3.describeInstallOrder, 
+               delegate4.describeInstallOrder, 
+               delegate5.describeInstallOrder});
+         assertSortedArray(new int[] {6, 7, 8, 9, 10}, new int[] {
+               delegate1.instantiateInstallOrder, 
+               delegate2.instantiateInstallOrder, 
+               delegate3.instantiateInstallOrder, 
+               delegate4.instantiateInstallOrder, 
+               delegate5.instantiateInstallOrder});
+         assertSortedArray(new int[] {11, 12, 13, 14, 15}, new int[] {
+               delegate1.configureInstallOrder, 
+               delegate2.configureInstallOrder, 
+               delegate3.configureInstallOrder, 
+               delegate4.configureInstallOrder, 
+               delegate5.configureInstallOrder});
+         assertSortedArray(new int[] {16, 17, 18, 19, 20}, new int[] {
+               delegate1.createInstallOrder, 
+               delegate2.createInstallOrder, 
+               delegate3.createInstallOrder, 
+               delegate4.createInstallOrder, 
+               delegate5.createInstallOrder});
+         assertSortedArray(new int[] {21, 22, 23, 24, 25}, new int[] {
+               delegate1.startInstallOrder, 
+               delegate2.startInstallOrder, 
+               delegate3.startInstallOrder, 
+               delegate4.startInstallOrder, 
+               delegate5.startInstallOrder});
+         assertSortedArray(new int[] {26, 27, 28, 29, 30}, new int[] {
+               delegate1.installInstallOrder, 
+               delegate2.installInstallOrder, 
+               delegate3.installInstallOrder, 
+               delegate4.installInstallOrder, 
+               delegate5.installInstallOrder});
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx1);
+            uninstallContext(ctx2);
+            uninstallContext(ctx3);
+            uninstallContext(ctx4);
+            uninstallContext(ctx5);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+            assertUninstalled(ctx3);
+            assertUninstalled(ctx4);
+            assertUninstalled(ctx5);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+
+   public void testAsynchronousContextWithDependencyOnAutomaticContext() throws Throwable
+   {
+      setExecutorInController(2);
+      Synchronizer synchronizer = new Synchronizer(1, false, ControllerState.INSTANTIATED);
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", synchronizer);
+      delegate1.addDependency(new AbstractDependencyItem("Bean1", "Bean2", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx1 = null;
+      AsynchronousTestDelegate delegate2 = getAutomaticDelegate("Bean2");
+      ControllerContext ctx2 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         synchronizer.waitForWorkersAndEmitStartSignal();
+         synchronizer.waitForWorkersToEnd();
+         synchronizer.resetWorkerDone(ControllerState.INSTALLED);
+         assertState(ctx1, ControllerState.INSTANTIATED);
+         
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         assertInstalled(ctx2);
+         
+         synchronizer.waitForWorkersToEnd();
+         assertInstalled(ctx1);
+         assertEquals(1, delegate1.describeInstallOrder);
+         assertEquals(2, delegate1.instantiateInstallOrder);
+         assertEquals(3, delegate2.describeInstallOrder);
+         assertEquals(4, delegate2.instantiateInstallOrder);
+         assertEquals(5, delegate2.configureInstallOrder);
+         assertEquals(6, delegate2.createInstallOrder);
+         assertEquals(7, delegate2.startInstallOrder);
+         assertEquals(8, delegate2.installInstallOrder);
+         assertEquals(9, delegate1.configureInstallOrder);
+         assertEquals(10, delegate1.createInstallOrder);
+         assertEquals(11, delegate1.startInstallOrder);
+         assertEquals(12, delegate1.installInstallOrder);
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx2);
+            uninstallContext(ctx1);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+   
+   public void testAutomaticContextWithDependencyOnAsynchronousContext() throws Throwable
+   {
+      setExecutorInController(2);
+      Synchronizer synchronizer1 = new Synchronizer(1, false, false, ControllerState.INSTALLED);
+      AsynchronousTestDelegate delegate1 = getAutomaticDelegate("Bean1", synchronizer1);
+      delegate1.addDependency(new AbstractDependencyItem("Bean1", "Bean2", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx1 = null;
+      
+      Synchronizer synchronizer2 = new Synchronizer(1, false, ControllerState.INSTANTIATED);
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", synchronizer2);
+      ControllerContext ctx2 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         assertState(ctx1, ControllerState.INSTANTIATED);
+         
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         synchronizer2.waitForWorkersAndEmitStartSignal();
+         assertNotSame(ControllerState.INSTALLED, ctx2.getState());
+         
+         synchronizer2.waitForWorkersToEnd();
+         synchronizer1.waitForWorkersToEnd();
+         
+         assertInstalled(ctx1);
+         assertInstalled(ctx2);
+         assertEquals(1, delegate1.describeInstallOrder);
+         assertEquals(2, delegate1.instantiateInstallOrder);
+         assertEquals(3, delegate2.describeInstallOrder);
+         assertEquals(4, delegate2.instantiateInstallOrder);
+         assertEquals(5, delegate2.configureInstallOrder);
+         assertEquals(6, delegate2.createInstallOrder);
+         assertEquals(7, delegate2.startInstallOrder);
+         assertEquals(8, delegate2.installInstallOrder);
+         assertEquals(9, delegate1.configureInstallOrder);
+         assertEquals(10, delegate1.createInstallOrder);
+         assertEquals(11, delegate1.startInstallOrder);
+         assertEquals(12, delegate1.installInstallOrder);
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx2);
+            uninstallContext(ctx1);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+   
+   public void testAsynchronousContextWithDependencyOnAsynchronousContext() throws Throwable
+   {
+      setExecutorInController(2);
+      Synchronizer synchronizer1 = new Synchronizer(1, false, false, ControllerState.INSTANTIATED);
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", synchronizer1);
+      delegate1.addDependency(new AbstractDependencyItem("Bean1", "Bean2", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx1 = null;
+      
+      Synchronizer synchronizer2 = new Synchronizer(1, false, false, ControllerState.INSTANTIATED);
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", synchronizer2);
+      ControllerContext ctx2 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         synchronizer1.waitForWorkersAndEmitStartSignal();
+         synchronizer1.waitForWorkersToEnd();
+         synchronizer1.resetWorkerDone(ControllerState.INSTALLED);
+         assertState(ctx1, ControllerState.INSTANTIATED);
+         
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         synchronizer2.waitForWorkersAndEmitStartSignal();
+         synchronizer2.waitForWorkersToEnd();
+         synchronizer1.waitForWorkersToEnd();
+         
+         assertInstalled(ctx1);
+         assertInstalled(ctx2);
+         assertEquals(1, delegate1.describeInstallOrder);
+         assertEquals(2, delegate1.instantiateInstallOrder);
+         assertEquals(3, delegate2.describeInstallOrder);
+         assertEquals(4, delegate2.instantiateInstallOrder);
+         assertEquals(5, delegate2.configureInstallOrder);
+         assertEquals(6, delegate2.createInstallOrder);
+         assertEquals(7, delegate2.startInstallOrder);
+         assertEquals(8, delegate2.installInstallOrder);
+         assertEquals(9, delegate1.configureInstallOrder);
+         assertEquals(10, delegate1.createInstallOrder);
+         assertEquals(11, delegate1.startInstallOrder);
+         assertEquals(12, delegate1.installInstallOrder);
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx2);
+            uninstallContext(ctx1);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+
+   public void testSeveralAsynchronousContextsWithDependencyOnAsynchronousContext() throws Throwable
+   {
+      setExecutorInController(5);
+      Synchronizer synchronizer1 = new Synchronizer(5, true, true, ControllerState.INSTANTIATED);
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", synchronizer1);
+      delegate1.addDependency(new AbstractDependencyItem("Bean1", "Bean6", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx1 = null;
+
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", synchronizer1);
+      delegate2.addDependency(new AbstractDependencyItem("Bean2", "Bean6", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx2 = null;
+
+      AsynchronousTestDelegate delegate3 = getAsynchronousDelegate("Bean3", synchronizer1);
+      delegate3.addDependency(new AbstractDependencyItem("Bean3", "Bean6", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx3 = null;
+
+      AsynchronousTestDelegate delegate4 = getAsynchronousDelegate("Bean4", synchronizer1);
+      delegate4.addDependency(new AbstractDependencyItem("Bean4", "Bean6", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx4 = null;
+
+      AsynchronousTestDelegate delegate5 = getAsynchronousDelegate("Bean5", synchronizer1);
+      delegate5.addDependency(new AbstractDependencyItem("Bean5", "Bean6", ControllerState.CONFIGURED, ControllerState.INSTALLED));
+      ControllerContext ctx5 = null;
+
+      Synchronizer synchronizer2 = new Synchronizer(1, false, false, ControllerState.INSTALLED);
+      AsynchronousTestDelegate delegate6 = getAsynchronousDelegate("Bean6", synchronizer2);
+      ControllerContext ctx6 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         ctx3 = createAndInstallContext(delegate3, ControllerState.INSTALLED);
+         ctx4 = createAndInstallContext(delegate4, ControllerState.INSTALLED);
+         ctx5 = createAndInstallContext(delegate5, ControllerState.INSTALLED);
+         synchronizer1.waitForWorkersAndEmitStartSignal();
+         synchronizer1.waitForWorkersToEnd();
+         synchronizer1.resetWorkerDone(ControllerState.INSTALLED);
+         assertState(ctx1, ControllerState.INSTANTIATED);
+         assertState(ctx2, ControllerState.INSTANTIATED);
+         assertState(ctx3, ControllerState.INSTANTIATED);
+         assertState(ctx4, ControllerState.INSTANTIATED);
+         assertState(ctx5, ControllerState.INSTANTIATED);
+         
+         ctx6 = createAndInstallContext(delegate6, ControllerState.INSTALLED);
+         synchronizer2.waitForWorkersAndEmitStartSignal();
+         synchronizer2.waitForWorkersToEnd();
+         assertInstalled(ctx6);
+         synchronizer1.waitForWorkersToEnd();
+         
+         assertInstalled(ctx1);
+         assertInstalled(ctx2);
+         assertInstalled(ctx3);
+         assertInstalled(ctx4);
+         assertInstalled(ctx5);
+         assertSortedArray(new int[] {1, 2, 3, 4, 5}, new int[] {
+               delegate1.describeInstallOrder, 
+               delegate2.describeInstallOrder, 
+               delegate3.describeInstallOrder, 
+               delegate4.describeInstallOrder, 
+               delegate5.describeInstallOrder});
+         assertSortedArray(new int[] {6, 7, 8, 9, 10}, new int[] {
+               delegate1.instantiateInstallOrder, 
+               delegate2.instantiateInstallOrder, 
+               delegate3.instantiateInstallOrder, 
+               delegate4.instantiateInstallOrder, 
+               delegate5.instantiateInstallOrder});
+
+         assertEquals(11, delegate6.describeInstallOrder);
+         assertEquals(12, delegate6.instantiateInstallOrder);
+         assertEquals(13, delegate6.configureInstallOrder);
+         assertEquals(14, delegate6.createInstallOrder);
+         assertEquals(15, delegate6.startInstallOrder);
+         assertEquals(16, delegate6.installInstallOrder);
+
+         assertSortedArray(new int[] {17, 18, 19, 20, 21}, new int[] {
+               delegate1.configureInstallOrder, 
+               delegate2.configureInstallOrder, 
+               delegate3.configureInstallOrder, 
+               delegate4.configureInstallOrder, 
+               delegate5.configureInstallOrder});
+         assertSortedArray(new int[] {22, 23, 24, 25, 26}, new int[] {
+               delegate1.createInstallOrder, 
+               delegate2.createInstallOrder, 
+               delegate3.createInstallOrder, 
+               delegate4.createInstallOrder, 
+               delegate5.createInstallOrder});
+         assertSortedArray(new int[] {27, 28, 29, 30, 31}, new int[] {
+               delegate1.startInstallOrder, 
+               delegate2.startInstallOrder, 
+               delegate3.startInstallOrder, 
+               delegate4.startInstallOrder, 
+               delegate5.startInstallOrder});
+         assertSortedArray(new int[] {32, 33, 34, 35, 36}, new int[] {
+               delegate1.installInstallOrder, 
+               delegate2.installInstallOrder, 
+               delegate3.installInstallOrder, 
+               delegate4.installInstallOrder, 
+               delegate5.installInstallOrder});
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx1);
+            uninstallContext(ctx2);
+            uninstallContext(ctx3);
+            uninstallContext(ctx4);
+            uninstallContext(ctx5);
+            uninstallContext(ctx6);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+            assertUninstalled(ctx3);
+            assertUninstalled(ctx4);
+            assertUninstalled(ctx5);
+            assertUninstalled(ctx6);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+
+   public void testExecutorFull() throws Throwable
+   {
+      //Create an executor with 1 thread and a maximum queue size of 1
+      TestRejectedExecutionHandler handler = new TestRejectedExecutionHandler();
+      setExecutorInController(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1), handler));
+      Synchronizer synchronizer = new Synchronizer(1, false, ControllerState.INSTALLED);
+      Synchronizer synchronizer2 = new Synchronizer(1, false, false, ControllerState.INSTALLED);
+      
+      //This should get picked up by the executor
+      AsynchronousTestDelegate delegate1 = getAsynchronousDelegate("Bean1", synchronizer);
+      ControllerContext ctx1 = null;
+      //This should fill up the executor queue
+      AsynchronousTestDelegate delegate2 = getAsynchronousDelegate("Bean2", synchronizer2);
+      ControllerContext ctx2 = null;
+      //This should get rejected by the executor and get run in the main thread
+      AsynchronousTestDelegate delegate3 = getAsynchronousDelegate("Bean3");
+      ControllerContext ctx3 = null;
+      try
+      {
+         ctx1 = createAndInstallContext(delegate1, ControllerState.INSTALLED);
+         sleep(200); //Make sure 1 gets picked up by the executor
+         ctx2 = createAndInstallContext(delegate2, ControllerState.INSTALLED);
+         assertEquals(0, handler.getRejectCount());
+         ctx3 = createAndInstallContext(delegate3, ControllerState.INSTALLED);
+         assertTrue(0 < handler.getRejectCount());
+         assertNotSame(ControllerState.INSTALLED, ctx1);
+         assertNotSame(ControllerState.INSTALLED, ctx2);
+         assertInstalled(ctx3);
+
+         synchronizer.waitForWorkersAndEmitStartSignal();
+         synchronizer.waitForWorkersToEnd();
+         synchronizer2.waitForWorkersToEnd();
+         
+         assertEquals(1, delegate3.describeInstallOrder);
+         assertEquals(2, delegate3.instantiateInstallOrder);
+         assertEquals(3, delegate3.configureInstallOrder);
+         assertEquals(4, delegate3.createInstallOrder);
+         assertEquals(5, delegate3.startInstallOrder);
+         assertEquals(6, delegate3.installInstallOrder);
+         assertEquals(7, delegate1.describeInstallOrder);
+         assertEquals(8, delegate1.instantiateInstallOrder);
+         assertEquals(9, delegate1.configureInstallOrder);
+         assertEquals(10, delegate1.createInstallOrder);
+         assertEquals(11, delegate1.startInstallOrder);
+         assertEquals(12, delegate1.installInstallOrder);
+         assertEquals(13, delegate2.describeInstallOrder);
+         assertEquals(14, delegate2.instantiateInstallOrder);
+         assertEquals(15, delegate2.configureInstallOrder);
+         assertEquals(16, delegate2.createInstallOrder);
+         assertEquals(17, delegate2.startInstallOrder);
+         assertEquals(18, delegate2.installInstallOrder);
+      }
+      finally
+      {
+         try
+         {
+            uninstallContext(ctx1);
+            uninstallContext(ctx2);
+            uninstallContext(ctx3);
+            assertUninstalled(ctx1);
+            assertUninstalled(ctx2);
+            assertUninstalled(ctx3);
+         }
+         finally
+         {
+            clearExecutorInController();
+         }
+      }
+   }
+   
+   private void setExecutorInController(int threads)
+   {
+      Executor executor = null;
+      if (threads >= 0)
+      {
+         executor = Executors.newFixedThreadPool(threads);
+      }
+      setExecutorInController(executor);
+   }
+   
+   private void setExecutorInController(Executor executor)
+   {
+      ((AbstractController)controller).setExecutor(executor);  
+   }
+   
+   private void clearExecutorInController()
+   {
+      setExecutorInController(-1);
+   }
+   
+   private AsynchronousTestDelegate getAsynchronousDelegate(Object name)
+   {
+      return getAnyDelegate(name, ControllerMode.ASYNCHRONOUS, null);
+   }
+
+   private AsynchronousTestDelegate getAsynchronousDelegate(Object name, Synchronizer installLatches)
+   {
+      return getAnyDelegate(name, ControllerMode.ASYNCHRONOUS, installLatches);
+   }
+   
+   private AsynchronousTestDelegate getAutomaticDelegate(Object name)
+   {
+      return getAnyDelegate(name, ControllerMode.AUTOMATIC, null);
+   }
+
+   private AsynchronousTestDelegate getAutomaticDelegate(Object name, Synchronizer installSynchronizer)
+   {
+      return getAnyDelegate(name, ControllerMode.AUTOMATIC, installSynchronizer);
+   }
+
+   private AsynchronousTestDelegate getAnyDelegate(Object name, ControllerMode mode, Synchronizer installSynchronizer)
+   {
+      AsynchronousTestDelegate result = new AsynchronousTestDelegate(name, installSynchronizer);
+      result.setMode(mode);
+      return result;
+   }
+   
+   private ControllerContext createAndInstallContext(AsynchronousTestDelegate delegate, ControllerState expected) throws Throwable
+   {
+      TestControllerContext context = new TestControllerContext(delegate);
+      controller.install(context);
+      return context;
+   }
+   
+   private void assertInstalled(ControllerContext context) throws Throwable
+   {
+      assertState(context, ControllerState.INSTALLED);
+   }
+
+   private void assertState(ControllerContext context, ControllerState expected) throws Throwable
+   {
+      assertContext(context, expected);
+   }
+
+   private void uninstallContext(ControllerContext context)
+   {
+      if (context != null)
+      {
+         controller.uninstall(context.getName());
+      }
+   }
+   
+   private void assertUninstalled(ControllerContext context) throws Throwable
+   {
+      assertState(context, ControllerState.ERROR);
+   }
+
+   private void assertSortedArray(int[] expected, int[] actual)
+   {
+      assertNotNull(expected);
+      assertNotNull(actual);
+      assertEquals(expected.length, actual.length);
+
+      Arrays.sort(expected);
+      Arrays.sort(actual);
+
+      for (int i = 0 ; i < actual.length ; i++)
+      {
+         assertEquals("Wrong value at index " + i, expected[i], actual[i]);
+      }
+   }
+   
+
+   private void sleep(long unit)
+   {
+      try
+      {
+         Thread.sleep(7 * unit);
+      }
+      catch(InterruptedException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   private static class TestRejectedExecutionHandler implements RejectedExecutionHandler
+   {
+      AtomicInteger count = new AtomicInteger(0);
+
+      public int getRejectCount()
+      {
+         return count.get();
+      }
+      
+      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor)
+      {
+         count.incrementAndGet();
+         throw new RejectedExecutionException();
+      }
+   }
+}

Modified: projects/kernel/trunk/kernel/.classpath
===================================================================
--- projects/kernel/trunk/kernel/.classpath	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/.classpath	2009-07-02 15:02:36 UTC (rev 90770)
@@ -1,18 +1,20 @@
 <classpath>
-  <classpathentry kind="src" path="src/test/java" output="eclipse-target/tests-classes" including="**/*.java"/>
-  <classpathentry kind="src" path="src/test/resources" output="eclipse-target/tests-classes" excluding="**/*.java"/>
-  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/java"/>
   <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
-  <classpathentry kind="output" path="eclipse-target/classes"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1.1/activation-1.1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/byteman/byteman/1.0.2/byteman-1.0.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/wutka-dtdparser/dtdparser121/1.2.1/dtdparser121-1.2.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar" sourcepath="M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/sun-jaxb/jaxb-api/2.1.9/jaxb-api-2.1.9.jar" sourcepath="M2_REPO/sun-jaxb/jaxb-api/2.1.9/jaxb-api-2.1.9-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/jboss-common-core/2.2.13.GA/jboss-common-core-2.2.13.GA.jar" sourcepath="M2_REPO/org/jboss/jboss-common-core/2.2.13.GA/jboss-common-core-2.2.13.GA-sources.jar"/>
-  <classpathentry kind="src" path="/jboss-dependency"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/kernel/jboss-dependency/2.2.0-SNAPSHOT/jboss-dependency-2.2.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/kernel/jboss-dependency/2.2.0-SNAPSHOT/jboss-dependency-2.2.0-SNAPSHOT-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/logging/jboss-logging-log4j/2.0.5.GA/jboss-logging-log4j-2.0.5.GA.jar" sourcepath="M2_REPO/org/jboss/logging/jboss-logging-log4j/2.0.5.GA/jboss-logging-log4j-2.0.5.GA-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/logging/jboss-logging-spi/2.0.5.GA/jboss-logging-spi-2.0.5.GA.jar" sourcepath="M2_REPO/org/jboss/logging/jboss-logging-spi/2.0.5.GA/jboss-logging-spi-2.0.5.GA-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/man/jboss-managed/2.1.1.CR1/jboss-managed-2.1.1.CR1.jar" sourcepath="M2_REPO/org/jboss/man/jboss-managed/2.1.1.CR1/jboss-managed-2.1.1.CR1-sources.jar"/>
@@ -27,5 +29,4 @@
   <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/apache-xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.9.1/xml-apis-2.9.1.jar"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 </classpath>
\ No newline at end of file

Modified: projects/kernel/trunk/kernel/.project
===================================================================
--- projects/kernel/trunk/kernel/.project	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/.project	2009-07-02 15:02:36 UTC (rev 90770)
@@ -1,9 +1,7 @@
 <projectDescription>
   <name>jboss-kernel</name>
   <comment>JBoss Microcontainer Kernel</comment>
-  <projects>
-    <project>jboss-dependency</project>
-  </projects>
+  <projects/>
   <buildSpec>
     <buildCommand>
       <name>org.eclipse.jdt.core.javabuilder</name>

Modified: projects/kernel/trunk/kernel/pom.xml
===================================================================
--- projects/kernel/trunk/kernel/pom.xml	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/pom.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -26,9 +26,13 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <!--configuration>
-          <testFailureIgnore>true</testFailureIgnore>
-        </configuration-->
+        <configuration>
+          <!-- skip>true</skip -->
+          <!--testFailureIgnore>true</testFailureIgnore-->
+          <excludes>
+            <exclude>org/jboss/test/kernel/asynchronous/**/*</exclude>
+          </excludes>          
+        </configuration>
       </plugin>   	   
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -41,6 +45,43 @@
           </descriptors>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <version>1.2</version>
+        <executions>
+          <execution>
+            <id>run-asynchronous-tests</id>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <phase>test</phase>
+            <configuration>
+              <tasks unless="maven.test.skip">
+                <property name="byteman.path" value="${maven.dependency.org.jboss.byteman.byteman.jar.path}"/>
+                <property name="report.dir" value="${project.build.directory}/surefire-reports"/>
+                <property name="testOutputDirectory" value="${project.build.testOutputDirectory}"/>
+
+                <ant antfile="${project.build.testOutputDirectory}/build.xml"  inheritrefs="true">
+                  <target name="asynchronous-tests"/>
+                </ant>                
+              </tasks>
+            </configuration>
+          </execution>
+        </executions>
+        <dependencies>
+          <dependency>
+            <groupId>ant</groupId>
+            <artifactId>ant-junit</artifactId>
+            <version>${version.ant.junit}</version>
+          </dependency>
+          <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${version.junit}</version>
+          </dependency>
+        </dependencies>     
+      </plugin>      
     </plugins>
   </build>
   
@@ -98,5 +139,11 @@
       <artifactId>jboss-logging-log4j</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.jboss.byteman</groupId>
+      <artifactId>byteman</artifactId>
+      <version>1.0.2</version>
+      <scope>test</scope>
+    </dependency>    
   </dependencies>
 </project>

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/test/kernel/junit/MicrocontainerTest.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/test/kernel/junit/MicrocontainerTest.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/test/kernel/junit/MicrocontainerTest.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -115,6 +115,7 @@
       configureLogging();
       // Validate everything deployed
       getMCDelegate().validate();
+      
    }
 
    @Override

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/BeanWithCreateStart.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/BeanWithCreateStart.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/BeanWithCreateStart.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,61 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.support;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class BeanWithCreateStart
+{
+   Object dependency;
+   String name;
+   
+   public void create()
+   {
+   }
+   
+   public void start()
+   {
+   }
+
+   public Object getDependency()
+   {
+      return dependency;
+   }
+
+   public void setDependency(Object dependency)
+   {
+      this.dependency = dependency;
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/ByteManException.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/ByteManException.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/ByteManException.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,32 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.support;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ByteManException extends RuntimeException
+{
+   private static final long serialVersionUID = 1L;
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Helper.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Helper.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Helper.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,68 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.support;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.jboss.byteman.agent.Transformer;
+import org.jboss.byteman.rule.Rule;
+import org.jboss.logging.Logger;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class Helper extends org.jboss.byteman.rule.helper.Helper
+{
+   static List<Point> points = new CopyOnWriteArrayList<Point>();
+   Logger log = Logger.getLogger(Helper.class);
+   
+   protected Helper(Rule rule)
+   {
+      super(rule);
+   }
+
+   @Override
+   public boolean debug(String text)
+   {
+      if (Transformer.isDebug()) 
+      {
+         log.debug("[" + Thread.currentThread().getName() + "] - rule.debug{" + rule.getName() + "} : " + text);
+      }
+      return true;
+   }
+   
+   public boolean addPoint(String name)
+   {
+      debug("Adding point " + name);
+      points.add(new Point(name));
+      return true;
+   }
+   
+   public static List<Point> getPoints()
+   {
+      return points; 
+   }
+   
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Point.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Point.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/support/Point.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,55 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.support;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class Point
+{
+   String name;
+   String threadName;
+   
+   public Point(String name)
+   {
+      this.name = name;
+      threadName = Thread.currentThread().getName();
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+
+   public String getThreadName()
+   {
+      return threadName;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "Point[name=" + name + ",thread=" + threadName + "]";
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,90 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart;
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Test that an asynchronous context with a dependency on an asynchronous
+ * context is paused and picked up again as expected.
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousContextWithDependencyOnAsynchronousTestCase extends AsynchronousTest
+{
+
+   public AsynchronousContextWithDependencyOnAsynchronousTestCase(String name)
+   {
+      super(name, 2);
+   }
+
+   public void testAsynchronousContextWithDependencyOnAsynchronous() throws Exception
+   {
+      deploy("AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml");
+      try
+      {
+         assertNoBean("Bean2");
+         assertBean("Bean1", ControllerState.INSTANTIATED, BeanWithCreateStart.class);
+         deploy("AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml");
+         try
+         {
+            BeanWithCreateStart bean1 = (BeanWithCreateStart)getBean("Bean1");
+            assertNotNull(bean1);
+            BeanWithCreateStart bean2 = (BeanWithCreateStart)getBean("Bean2");
+            assertNotNull(bean2);
+            assertSame(bean1.getDependency(), bean2);
+            
+            List<Point> points = Helper.getPoints();
+            assertEquals(14, points.size());
+
+            checkPoint(0, "PreInstall-Bean1", false);
+            checkPoint(1, "Describe-Bean1", false);
+            checkPoint(2, "Instantiate-Bean1", false);
+            checkPoint(3, "PreInstall-Bean2", false);
+            checkPoint(4, "Describe-Bean2", false);
+            checkPoint(5, "Instantiate-Bean2", false);
+            checkPoint(6, "Configure-Bean2", false);
+            checkPoint(7, "Create-Bean2", false);
+            checkPoint(8, "Start-Bean2", false);
+            checkPoint(9, "Install-Bean2", false);
+            checkPoint(10, "Configure-Bean1", false);
+            checkPoint(11, "Create-Bean1", false);
+            checkPoint(12, "Start-Bean1", false);
+            checkPoint(13, "Install-Bean1", false);
+         }
+         finally
+         {
+            undeploy("AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml");
+         }
+      }
+      finally
+      {
+         undeploy("AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml");
+      }
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,90 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart;
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Test that an asynchronous context with a dependency on an automatic
+ * context is paused and picked up again as expected.
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousContextWithDependencyOnAutomaticTestCase extends AsynchronousTest
+{
+
+   public AsynchronousContextWithDependencyOnAutomaticTestCase(String name)
+   {
+      super(name, 2);
+   }
+
+   public void testAsynchronousContextWithDependencyOnAutomatic() throws Exception
+   {
+      deploy("AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml");
+      try
+      {
+         assertNoBean("Bean2");
+         assertBean("Bean1", ControllerState.INSTANTIATED, BeanWithCreateStart.class);
+         deploy("AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml");
+         try
+         {
+            BeanWithCreateStart bean1 = (BeanWithCreateStart)getBean("Bean1");
+            assertNotNull(bean1);
+            BeanWithCreateStart bean2 = (BeanWithCreateStart)getBean("Bean2");
+            assertNotNull(bean2);
+            assertSame(bean1.getDependency(), bean2);
+            
+            List<Point> points = Helper.getPoints();
+            assertEquals(14, points.size());
+
+            checkPoint(0, "PreInstall-Bean1", false);
+            checkPoint(1, "Describe-Bean1", false);
+            checkPoint(2, "Instantiate-Bean1", false);
+            checkPoint(3, "PreInstall-Bean2", true);
+            checkPoint(4, "Describe-Bean2", true);
+            checkPoint(5, "Instantiate-Bean2", true);
+            checkPoint(6, "Configure-Bean2", true);
+            checkPoint(7, "Create-Bean2", true);
+            checkPoint(8, "Start-Bean2", true);
+            checkPoint(9, "Install-Bean2", true);
+            checkPoint(10, "Configure-Bean1", false);
+            checkPoint(11, "Create-Bean1", false);
+            checkPoint(12, "Start-Bean1", false);
+            checkPoint(13, "Install-Bean1", false);
+         }
+         finally
+         {
+            undeploy("AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml");
+         }
+      }
+      finally
+      {
+         undeploy("AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml");
+      }
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,85 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart;
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Test that an asynchronous context with a dependency on an asynchronous
+ * context is paused and picked up again as expected.
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousContextWithDependencyOnOnDemandTestCase extends AsynchronousTest
+{
+
+   public AsynchronousContextWithDependencyOnOnDemandTestCase(String name)
+   {
+      super(name, 2);
+   }
+
+   public void testAsynchronousContextWithDependencyOnOnDemand() throws Exception
+   {
+      deploy("AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml");
+      try
+      {
+         assertBean("Bean2", ControllerState.DESCRIBED, BeanWithCreateStart.class);
+         deploy("AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml");
+         try
+         {
+            BeanWithCreateStart bean1 = (BeanWithCreateStart)getBean("Bean1");
+            assertNotNull(bean1);
+            BeanWithCreateStart bean2 = (BeanWithCreateStart)getBean("Bean2");
+            assertNotNull(bean2);
+            assertSame(bean1.getDependency(), bean2);
+            
+            List<Point> points = Helper.getPoints();
+            assertEquals(6, points.size());
+
+            checkPoint(0, "PreInstall-Bean2", true);
+            checkPoint(1, "Describe-Bean2", true);
+            
+            checkPoint(2, "PreInstall-Bean1", false);
+            checkPoint(3, "Describe-Bean1", false);
+
+            //Don't check the thread for these it is an implemetation detail
+            checkPoint(4, "Install-Bean2", null);
+            
+            checkPoint(5, "Install-Bean1", false);
+         }
+         finally
+         {
+            undeploy("AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml");
+         }
+      }
+      finally
+      {
+         undeploy("AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml");
+      }
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTest.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTest.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTest.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,98 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.jboss.test.AbstractTestDelegate;
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+import org.jboss.test.kernel.junit.MicrocontainerTest;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousTest extends MicrocontainerTest
+{
+   static Executor executor;
+   
+   public AsynchronousTest(String name, int threads)
+   {
+      super(name);
+      executor = Executors.newFixedThreadPool(threads);
+   }
+   
+   public AsynchronousTest(String name, Executor executor)
+   {
+      super(name);
+      AsynchronousTest.executor = executor;
+   }
+
+   /**
+    * Get the test delegate
+    * 
+    * @param clazz the test class
+    * @return the delegate
+    * @throws Exception for any error
+    */
+   public static AbstractTestDelegate getDelegate(Class<?> clazz) throws Exception
+   {
+      return new AsynchronousTestDelegate(clazz, executor);
+   }
+
+
+   protected Point assertGetPoint(int index)
+   {
+      List<Point> points = Helper.getPoints();
+      assertTrue(index < points.size());
+      Point point = points.get(index);
+      assertNotNull(point);
+      return point;
+   }
+
+   protected void checkPoint(int index, String name, Boolean mainThread)
+   {
+      Point point = assertGetPoint(index);
+      assertEquals(name, point.getName());
+      String mainThreadName = Thread.currentThread().getName();
+      if (mainThread != null)
+      {
+         if (mainThread)
+         {
+            assertEquals(mainThreadName, point.getThreadName());
+         }
+         else
+         {
+            assertFalse(mainThreadName.equals(point.getThreadName()));
+         }
+      }
+   }
+
+   protected AsynchronousTestDelegate getAsynchronousDelegate()
+   {
+      return (AsynchronousTestDelegate)getDelegate();
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTestDelegate.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTestDelegate.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AsynchronousTestDelegate.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,82 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.concurrent.Executor;
+
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.kernel.plugins.deployment.xml.BasicXMLDeployer;
+import org.jboss.test.kernel.junit.MicrocontainerTestDelegate;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AsynchronousTestDelegate extends MicrocontainerTestDelegate
+{
+   Executor executor;
+   public AsynchronousTestDelegate(Class<?> clazz, Executor executor) throws Exception
+   {
+      super(clazz);
+      this.executor = executor;
+   }
+   
+   protected void setExecutor(Executor executor)
+   {
+      Controller controller = kernel.getController();
+      if (controller instanceof AbstractController == false)
+      {
+         throw new IllegalStateException("Controller is not instance of AbstractController");
+      }
+      ((AbstractController)controller).setExecutor(executor);
+   }
+
+   @Override
+   protected void deploy() throws Exception
+   {
+      setExecutor(executor);
+      super.deploy();
+   }
+
+   protected void deployTestXml() throws Exception
+   {
+      deploy(getTestResource(getTestResourceName()));
+   }
+   
+   protected void undeployTestXml()
+   {
+      undeploy(getTestResource(getTestResourceName()));
+   }
+   
+   private String getTestResourceName()
+   {
+      String testName = clazz.getName();
+      return testName.replace('.', '/') + "NotAutomatic.xml";
+   }
+   
+   protected BasicXMLDeployer createDeployer()
+   {
+      return new BasicXMLDeployer(kernel, null);
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,92 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart;
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Test that an automatic context with a dependency on an asynchronous
+ * context is paused and picked up again as expected.
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class AutomaticContextWithDependencyOnAsynchronousTestCase extends AsynchronousTest
+{
+
+   public AutomaticContextWithDependencyOnAsynchronousTestCase(String name)
+   {
+      super(name, 2);
+   }
+
+   public void testAutomaticContextWithDependencyOnAsynchronous() throws Exception
+   {
+      deploy("AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml");
+      try
+      {
+         assertNoBean("Bean2");
+         assertBean("Bean1", ControllerState.INSTANTIATED, BeanWithCreateStart.class);
+         deploy("AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml");
+         try
+         {
+            BeanWithCreateStart bean1 = (BeanWithCreateStart)getBean("Bean1");
+            assertNotNull(bean1);
+            BeanWithCreateStart bean2 = (BeanWithCreateStart)getBean("Bean2");
+            assertNotNull(bean2);
+            assertSame(bean1.getDependency(), bean2);
+            
+            List<Point> points = Helper.getPoints();
+            assertEquals(14, points.size());
+
+            checkPoint(0, "PreInstall-Bean1", true);
+            checkPoint(1, "Describe-Bean1", true);
+            checkPoint(2, "Instantiate-Bean1", true);
+            checkPoint(3, "PreInstall-Bean2", false);
+            checkPoint(4, "Describe-Bean2", false);
+            checkPoint(5, "Instantiate-Bean2", false);
+            checkPoint(6, "Configure-Bean2", false);
+            checkPoint(7, "Create-Bean2", false);
+            checkPoint(8, "Start-Bean2", false);
+            checkPoint(9, "Install-Bean2", false);
+            //Don't check the thread for these it is an implemetation detail
+            checkPoint(10, "Configure-Bean1", null);
+            checkPoint(11, "Create-Bean1", null);
+            checkPoint(12, "Start-Bean1", null);
+            checkPoint(13, "Install-Bean1", null);
+         }
+         finally
+         {
+            undeploy("AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml");
+         }
+      }
+      finally
+      {
+         undeploy("AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml");
+      }
+   }
+
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,103 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Using byteman to verify that several asynchronous contexts can be in the same lifecycle
+ * at the same time
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class FiveParallelDeploymentsTestCase extends AsynchronousTest
+{
+   public FiveParallelDeploymentsTestCase(String name)
+   {
+      super(name, 5);
+   }
+
+   public void testFiveParallelDeployments() throws Exception
+   {
+      deploy("FiveParallelDeploymentsTestCase_NotAutomatic.xml");
+      try
+      {
+         assertNotNull(getBean("Bean1"));
+         assertNotNull(getBean("Bean2"));
+         assertNotNull(getBean("Bean3"));
+         assertNotNull(getBean("Bean4"));
+         assertNotNull(getBean("Bean5"));
+
+         List<Point> points = Helper.getPoints();
+         assertEquals(points.toString(), 35, points.size());
+         
+         assertPoints("PreInstallAction", points, 0);
+         assertPoints("DescribeAction", points, 5);
+         assertPoints("InstantiateAction", points, 10);
+         assertPoints("ConfigureAction", points, 15);
+         assertPoints("create", points, 20);
+         assertPoints("start", points, 25);
+         assertPoints("InstallAction", points, 30);
+      }
+      finally
+      {
+         undeploy("FiveParallelDeploymentsTestCase_NotAutomatic.xml");
+      }
+   }
+   
+   private void assertPoints(String name, List<Point> points, int start)
+   {
+      assertTrue(start + 3 <= points.size());
+      Point point1 = assertGetPoint(start);
+      Point point2 = assertGetPoint(start + 1);
+      Point point3 = assertGetPoint(start + 2);
+      Point point4 = assertGetPoint(start + 3);
+      Point point5 = assertGetPoint(start + 4);
+      
+      assertEquals(name, point1.getName());
+      assertEquals(name, point2.getName());
+      assertEquals(name, point3.getName());
+      assertEquals(name, point4.getName());
+      assertEquals(name, point5.getName());
+      
+      assertNotNull(point1.getThreadName());
+      assertNotNull(point2.getThreadName());
+      assertNotNull(point3.getThreadName());
+      assertNotNull(point4.getThreadName());
+      assertNotNull(point5.getThreadName());
+      
+      assertFalse(point1.getThreadName().equals(point2.getThreadName()));
+      assertFalse(point1.getThreadName().equals(point3.getThreadName()));
+      assertFalse(point1.getThreadName().equals(point4.getThreadName()));
+      assertFalse(point1.getThreadName().equals(point5.getThreadName()));
+      assertFalse(point2.getThreadName().equals(point3.getThreadName()));
+      assertFalse(point2.getThreadName().equals(point4.getThreadName()));
+      assertFalse(point2.getThreadName().equals(point5.getThreadName()));
+      assertFalse(point3.getThreadName().equals(point4.getThreadName()));
+      assertFalse(point3.getThreadName().equals(point5.getThreadName()));
+      assertFalse(point4.getThreadName().equals(point5.getThreadName()));
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,78 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import java.util.List;
+
+import org.jboss.test.kernel.asynchronous.support.Helper;
+import org.jboss.test.kernel.asynchronous.support.Point;
+
+/**
+ * Using byteman to verify that several asynchronous contexts can be in the same lifecycle
+ * at the same time
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class TwoParallelDeploymentsTestCase extends AsynchronousTest
+{
+   public TwoParallelDeploymentsTestCase(String name)
+   {
+      super(name, 2);
+   }
+
+   public void testTwoParallelDeployments() throws Exception
+   {
+      deploy("TwoParallelDeploymentsTestCase_NotAutomatic.xml");
+      try
+      {
+         assertNotNull(getBean("Bean1"));
+         assertNotNull(getBean("Bean2"));
+
+         List<Point> points = Helper.getPoints();
+         assertEquals(points.toString(), 14, points.size());
+         
+         assertPoints("PreInstallAction", 0, 1);
+         assertPoints("DescribeAction", 2, 3);
+         assertPoints("InstantiateAction", 4, 5);
+         assertPoints("ConfigureAction", 6, 7);
+         assertPoints("create", 8, 9);
+         assertPoints("start", 10, 11);
+         assertPoints("InstallAction", 12, 13);
+      }
+      finally
+      {
+         undeploy("TwoParallelDeploymentsTestCase_NotAutomatic.xml");
+      }
+   }
+   
+   private void assertPoints(String name, int index1, int index2)
+   {
+      Point point1 = assertGetPoint(index1);
+      Point point2 = assertGetPoint(index2);
+      assertEquals(name, point1.getName());
+      assertEquals(name, point2.getName());
+      assertNotNull(point1.getThreadName());
+      assertNotNull(point1.getThreadName());
+      assertFalse(point1.getThreadName().equals(point2.getThreadName()));
+   }
+}

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,54 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.kernel.asynchronous.test;
+
+import org.jboss.test.kernel.asynchronous.support.ByteManException;
+
+import junit.framework.TestCase;
+
+/**
+ * Silly little test to verify that ByteMan is working correctly from our set up
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class VerifyByteManTestCase extends TestCase
+{
+   public void testByteManTriggers()
+   {
+      try
+      {
+         trigger();
+         fail("ByteMan did not trigger");
+      }
+      catch(ByteManException expected)
+      {
+      }
+   }
+   
+   /**
+    * ByteMan should throw an error when entering this method
+    */
+   private void trigger()
+   {
+   }
+}

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanJaxbTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanJaxbTestCase.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanJaxbTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -116,6 +116,30 @@
       assertNull(bean.getUninstallCallbacks());
    }
 
+   public void testBeanWithAsynchronousMode() throws Exception
+   {
+      AbstractBeanMetaData bean = unmarshalBean();
+      assertNull(bean.getName());
+      assertEquals("Dummy", bean.getBean());
+      assertEquals(ControllerMode.ASYNCHRONOUS, bean.getMode());
+      assertNull(bean.getErrorHandlingMode());
+      assertNull(bean.getAccessMode());
+      assertNull(bean.getAnnotations());
+      assertNull(bean.getClassLoader());
+      assertNull(bean.getConstructor());
+      assertNull(bean.getProperties());
+      assertNull(bean.getCreate());
+      assertNull(bean.getStart());
+      assertNull(bean.getStop());
+      assertNull(bean.getDestroy());
+      assertNull(bean.getDemands());
+      assertNull(bean.getSupplies());
+      assertNull(bean.getInstalls());
+      assertNull(bean.getUninstalls());
+      assertNull(bean.getInstallCallbacks());
+      assertNull(bean.getUninstallCallbacks());
+   }
+
    public void testBeanWithErrorHandlingMode() throws Exception
    {
       AbstractBeanMetaData bean = unmarshalBean();

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanTestCase.java	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/BeanTestCase.java	2009-07-02 15:02:36 UTC (rev 90770)
@@ -114,6 +114,29 @@
       assertNull(bean.getUninstallCallbacks());
    }
 
+   public void testBeanWithAsynchronousMode() throws Exception
+   {
+      AbstractBeanMetaData bean = unmarshalBean("BeanWithAsynchronousMode.xml");
+      assertNull(bean.getName());
+      assertEquals("Dummy", bean.getBean());
+      assertEquals(ControllerMode.ASYNCHRONOUS, bean.getMode());
+      assertNull(bean.getErrorHandlingMode());
+      assertNull(bean.getAccessMode());
+      assertNull(bean.getAnnotations());
+      assertNull(bean.getClassLoader());
+      assertNull(bean.getConstructor());
+      assertNull(bean.getProperties());
+      assertNull(bean.getCreate());
+      assertNull(bean.getStart());
+      assertNull(bean.getStop());
+      assertNull(bean.getDestroy());
+      assertNull(bean.getDemands());
+      assertNull(bean.getSupplies());
+      assertNull(bean.getInstalls());
+      assertNull(bean.getUninstalls());
+      assertNull(bean.getInstallCallbacks());
+      assertNull(bean.getUninstallCallbacks());
+   }
    public void testBeanWithErrorHandlingMode() throws Exception
    {
       AbstractBeanMetaData bean = unmarshalBean("BeanWithErrorHandlingMode.xml");

Added: projects/kernel/trunk/kernel/src/test/resources/build.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/build.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/build.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- $Id: build-tests-jdk50.xml 87118 2009-04-10 10:42:21Z kabir.khan at jboss.com $ -->
+
+<project>
+   <target name="asynchronous-tests">
+   	<mkdir dir="${report.dir}"/>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="VerifyByteManTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="TwoParallelDeploymentsTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="FiveParallelDeploymentsTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="AsynchronousContextWithDependencyOnAutomaticTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="AutomaticContextWithDependencyOnAsynchronousTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="AsynchronousContextWithDependencyOnAsynchronousTestCase"/>
+      </antcall>
+      <antcall target="run-asynchronous-test" inheritrefs="true">
+         <param name="test" value="AsynchronousContextWithDependencyOnOnDemandTestCase"/>
+      </antcall>
+   </target>
+   
+   <target name="run-asynchronous-test">
+  	   <property name="bytemanScript" value="${testOutputDirectory}/org/jboss/test/kernel/asynchronous/test/${test}.txt"/>
+
+      <junit printsummary="yes" fork="true" haltonfailure="true" haltonerror="true">
+         <classpath>
+            <path refid="maven.test.classpath"/>
+        </classpath>
+        <jvmarg value="-javaagent:${byteman.path}=script:${bytemanScript}"/>
+        <sysproperty key="org.jboss.byteman.debug" value="true"/>
+        <formatter type="plain" usefile="true" extension=".txt" />
+        <formatter classname="org.jboss.ant.taskdefs.XMLJUnitMultipleResultFormatter" usefile="true" extension=".xml" />
+        <test fork="yes" name="org.jboss.test.kernel.asynchronous.test.${test}" todir="${report.dir}"/>
+      </junit>
+   </target>
+</project>
\ No newline at end of file

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,100 @@
+RULE Wait for Complete following deploy on main thread
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+RULE Signal Complete for Bean1 in InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND ctx:KernelControllerContext = $1
+IF ctx.getName().equals("Bean1")
+DO debug("signalling wake"),
+   signalWake("Complete", true),
+   debug("signalled!")
+ENDRULE
+
+RULE Signal Complete for Bean1 in InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND ctx:KernelControllerContext = $1
+IF ctx.getName().equals("Bean1")
+DO debug("signalling wake"),
+   signalWake("Complete", true),
+   debug("signalled!")
+ENDRULE
+
+RULE Mark PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("PreInstall-" + ctx.getName())
+ENDRULE
+
+RULE Mark DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Describe-" + ctx.getName())
+ENDRULE
+
+RULE Mark InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Instantiate-" + ctx.getName())
+ENDRULE
+
+RULE Mark ConfigureAction
+CLASS org.jboss.kernel.plugins.dependency.ConfigureAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Configure-" + ctx.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark create
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD create
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Create-" + bean.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark StartStopLifecycleAction
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD start
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Start-" + bean.getName())
+ENDRULE
+
+RULE Mark InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Install-" + ctx.getName())
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Asynchronous.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous">
+      <property name="name">Bean1</property>
+      <property name="dependency"><inject bean="Bean2"/></property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAsynchronousTestCase_Dependency.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous">
+      <property name="name">Bean2</property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,88 @@
+RULE Wait for Complete following deploy on main thread
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+RULE Signal wake Complete following complete deploy in thread
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("signalling wake in AbstractController$InstallControllerContextTask"),
+   signalWake("Complete", true),
+   debug("signalled!")
+ENDRULE
+
+RULE Mark PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("PreInstall-" + ctx.getName())
+ENDRULE
+
+RULE Mark DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Describe-" + ctx.getName())
+ENDRULE
+
+RULE Mark InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Instantiate-" + ctx.getName())
+ENDRULE
+
+RULE Mark ConfigureAction
+CLASS org.jboss.kernel.plugins.dependency.ConfigureAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Configure-" + ctx.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark create
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD create
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Create-" + bean.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark StartStopLifecycleAction
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD start
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Start-" + bean.getName())
+ENDRULE
+
+RULE Mark InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Install-" + ctx.getName())
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Asynchronous.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous">
+      <property name="name">Bean1</property>
+      <property name="dependency"><inject bean="Bean2"/></property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnAutomaticTestCase_Dependency.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart">
+      <property name="name">Bean2</property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,50 @@
+RULE Wait for the asynchronous deployments
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF !createCounter("Counter") && incrementCounter("Counter")==1
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+RULE Signal Complete for Bean1 in InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND ctx:KernelControllerContext = $1
+IF ctx.getName().equals("Bean1")
+DO debug("signalling wake"),
+   signalWake("Complete", true),
+   debug("signalled!")
+ENDRULE
+
+RULE Mark PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("PreInstall-" + ctx.getName())
+ENDRULE
+
+RULE Mark DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Describe-" + ctx.getName())
+ENDRULE
+
+RULE Mark InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Install-" + ctx.getName())
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Asynchronous.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous">
+      <property name="name">Bean1</property>
+      <property name="dependency"><inject bean="Bean2"/></property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AsynchronousContextWithDependencyOnOnDemandTestCase_Dependency.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="On Demand">
+      <property name="name">Bean2</property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,89 @@
+RULE Wait for Complete following deploy on main thread
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF 1 < incrementCounter("Start")
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+
+RULE Signal wake Complete following complete deploy in thread
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("signalling wake in AbstractController$InstallControllerContextTask"),
+   signalWake("Complete", true),
+   debug("signalled!")
+ENDRULE
+
+RULE Mark PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("PreInstall-" + ctx.getName())
+ENDRULE
+
+RULE Mark DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Describe-" + ctx.getName())
+ENDRULE
+
+RULE Mark InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Instantiate-" + ctx.getName())
+ENDRULE
+
+RULE Mark ConfigureAction
+CLASS org.jboss.kernel.plugins.dependency.ConfigureAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Configure-" + ctx.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark create
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD create
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Create-" + bean.getName())
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Mark StartStopLifecycleAction
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD start
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND bean = $0
+IF TRUE
+DO addPoint("Start-" + bean.getName())
+ENDRULE
+
+RULE Mark InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal(KernelControllerContext)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND ctx:KernelControllerContext = $1
+IF TRUE
+DO addPoint("Install-" + ctx.getName())
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Automatic.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart">
+      <property name="name">Bean1</property>
+      <property name="dependency"><inject bean="Bean2"/></property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/AutomaticContextWithDependencyOnAsynchronousTestCase_Dependency.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous">
+      <property name="name">Bean2</property>
+   </bean>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/Copy.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/Copy.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/Copy.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,11 @@
+RULE Initialise Counter
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+#AT EXIT
+BIND NOTHING
+IF !createCounter("Counter") && incrementCounter("Counter")==1
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,131 @@
+RULE Rendezvous on first thread execution
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("Run", 5),
+   debug("rendezvous in AbstractController$InstallControllerContextTask"),
+   rendezvous("Run"),
+   debug("go!!!")
+ENDRULE
+
+RULE Wait for Complete following deploy on main thread
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+RULE Signal wake Complete following complete deploy in thread
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO createRendezvous("End", 2),
+   debug("End rendezvous in AbstractController$InstallControllerContextTask"),
+   rendezvous("End"),
+   debug("signalling wake in AbstractController$InstallControllerContextTask"),
+   signalWake("Complete"),
+   debug("signalled!")
+ENDRULE
+
+RULE Rendezvous in PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("PreInstallAction", 5),
+   debug("rendezvous in PreInstallAction.installActionInternal"),
+   rendezvous("PreInstallAction"),
+   addPoint("PreInstallAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("DescribeAction", 5),
+   debug("rendezvous in DescribeAction.installActionInternal"),
+   rendezvous("DescribeAction"),
+   addPoint("DescribeAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("InstantiateAction", 5),
+   debug("rendezvous in InstantiateAction.installActionInternal"),
+   rendezvous("InstantiateAction"),
+   addPoint("InstantiateAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in ConfigureAction
+CLASS org.jboss.kernel.plugins.dependency.ConfigureAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("ConfigureAction", 5),
+   debug("rendezvous in ConfigureAction.installActionInternal"),
+   rendezvous("ConfigureAction"),
+   addPoint("ConfigureAction"),
+   debug("go!!!")
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Rendezvous in create
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD create
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("create", 5),
+   debug("rendezvous in BeanWithCreateStart.create"),
+   rendezvous("create"),
+   addPoint("create"),
+   debug("go!!!")
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Rendezvous in StartStopLifecycleAction
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD start
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("start", 5),
+   debug("rendezvous in BeanWithCreateStart.start"),
+   rendezvous("start"),
+   addPoint("start"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("InstallAction", 5),
+   debug("rendezvous in InstallAction.installActionInternal"),
+   rendezvous("InstallAction"),
+   addPoint("InstallAction"),
+   debug("go!!!")
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase_NotAutomatic.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase_NotAutomatic.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/FiveParallelDeploymentsTestCase_NotAutomatic.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+   <bean name="Bean3" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+   <bean name="Bean4" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+   <bean name="Bean5" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,131 @@
+RULE Rendezvous on first thread execution
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("Run", 2),
+   debug("rendezvous in AbstractController$InstallControllerContextTask"),
+   rendezvous("Run"),
+   debug("go!!!")
+ENDRULE
+
+RULE Wait for Complete following deploy on main thread
+CLASS org.jboss.test.kernel.junit.MicrocontainerTestDelegate 
+METHOD deploy(java.net.URL)
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO debug("wait in deploy"),
+   waitFor("Complete", 10000),
+   debug("go!!!")
+ENDRULE
+
+RULE Signal wake Complete following complete deploy in thread
+CLASS org.jboss.dependency.plugins.AbstractController$InstallControllerContextTask 
+METHOD run
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+AT EXIT
+BIND NOTHING
+IF TRUE
+DO createRendezvous("End", 2),
+   debug("End rendezvous in AbstractController$InstallControllerContextTask"),
+   rendezvous("End"),
+   debug("signalling wake in AbstractController$InstallControllerContextTask"),
+   signalWake("Complete"),
+   debug("signalled!")
+ENDRULE
+
+RULE Rendezvous in PreInstallAction
+CLASS org.jboss.kernel.plugins.dependency.PreInstallAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("PreInstallAction", 2),
+   debug("rendezvous in PreInstallAction.installActionInternal"),
+   rendezvous("PreInstallAction"),
+   addPoint("PreInstallAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in DescribeAction
+CLASS org.jboss.kernel.plugins.dependency.DescribeAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("DescribeAction", 2),
+   debug("rendezvous in DescribeAction.installActionInternal"),
+   rendezvous("DescribeAction"),
+   addPoint("DescribeAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in InstantiateAction
+CLASS org.jboss.kernel.plugins.dependency.InstantiateAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("InstantiateAction", 2),
+   debug("rendezvous in InstantiateAction.installActionInternal"),
+   rendezvous("InstantiateAction"),
+   addPoint("InstantiateAction"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in ConfigureAction
+CLASS org.jboss.kernel.plugins.dependency.ConfigureAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("ConfigureAction", 2),
+   debug("rendezvous in ConfigureAction.installActionInternal"),
+   rendezvous("ConfigureAction"),
+   addPoint("ConfigureAction"),
+   debug("go!!!")
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Rendezvous in create
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD create
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("create", 2),
+   debug("rendezvous in BeanWithCreateStart.create"),
+   rendezvous("create"),
+   addPoint("create"),
+   debug("go!!!")
+ENDRULE
+
+#We don't do this in the Action class since there is no point invoked once on install
+RULE Rendezvous in StartStopLifecycleAction
+CLASS org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart
+METHOD start
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("start", 2),
+   debug("rendezvous in BeanWithCreateStart.start"),
+   rendezvous("start"),
+   addPoint("start"),
+   debug("go!!!")
+ENDRULE
+
+RULE Rendezvous in InstallAction
+CLASS org.jboss.kernel.plugins.dependency.InstallAction
+METHOD installActionInternal
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO createRendezvous("InstallAction", 2),
+   debug("rendezvous in InstallAction.installActionInternal"),
+   rendezvous("InstallAction"),
+   addPoint("InstallAction"),
+   debug("go!!!")
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase_NotAutomatic.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase_NotAutomatic.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/TwoParallelDeploymentsTestCase_NotAutomatic.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="Bean1" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+   <bean name="Bean2" class="org.jboss.test.kernel.asynchronous.support.BeanWithCreateStart" mode="Asynchronous"/>
+</deployment>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.txt
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.txt	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/asynchronous/test/VerifyByteManTestCase.txt	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,8 @@
+RULE test byteman
+CLASS org.jboss.test.kernel.asynchronous.test.VerifyByteManTestCase 
+METHOD trigger
+HELPER org.jboss.test.kernel.asynchronous.support.Helper
+BIND NOTHING
+IF TRUE
+DO throw org.jboss.test.kernel.asynchronous.support.ByteManException()
+ENDRULE

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/BeanWithAsynchronousMode.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/BeanWithAsynchronousMode.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/BeanWithAsynchronousMode.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy" mode="Asynchronous"/>

Modified: projects/kernel/trunk/pom.xml
===================================================================
--- projects/kernel/trunk/pom.xml	2009-07-02 14:28:30 UTC (rev 90769)
+++ projects/kernel/trunk/pom.xml	2009-07-02 15:02:36 UTC (rev 90770)
@@ -51,6 +51,7 @@
     <version.jboss.drools>4.0.1</version.jboss.drools>
     <version.jboss.jbpm>3.1.1</version.jboss.jbpm>
     <version.google.guice>1.0</version.google.guice>
+    <version.jboss.byteman>1.0.2</version.jboss.byteman>
   </properties>
 
   <build>
@@ -280,6 +281,12 @@
         <artifactId>guice</artifactId>
         <version>${version.google.guice}</version>
       </dependency>
+      <dependency>
+        <groupId>org.jboss.byteman</groupId>
+        <artifactId>byteman</artifactId>
+        <version>${version.jboss.byteman}</version>
+        <scope>test</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 




More information about the jboss-cvs-commits mailing list