Open Source Repository

Home /junit/junit-4.10 | Repository Home


junit/extensions/ActiveTestSuite.java
package junit.extensions;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestResult;
import junit.framework.TestSuite;

/**
 * A TestSuite for active Tests. It runs each
 * test in a separate thread and waits until all
 * threads have terminated.
 * -- Aarhus Radisson Scandinavian Center 11th floor
 */ 
public class ActiveTestSuite extends TestSuite {
  private volatile int fActiveTestDeathCount;

  public ActiveTestSuite() {
  }
    
  public ActiveTestSuite(Class<? extends TestCase> theClass) {
    super(theClass);
  }
  
  public ActiveTestSuite(String name) {
    super (name);
  }
  
  public ActiveTestSuite(Class<? extends TestCase> theClass, String name) {
    super(theClass, name);
  }
  
  @Override
  public void run(TestResult result) {
    fActiveTestDeathCount= 0;
    super.run(result);
    waitUntilFinished();
  }
  
  @Override
  public void runTest(final Test test, final TestResult result) {
    Thread t= new Thread() {
      @Override
      public void run() {
        try {
          // inlined due to limitation in VA/Java 
          //ActiveTestSuite.super.runTest(test, result);
          test.run(result);
        finally {
          ActiveTestSuite.this.runFinished();
        }
      }
    };
    t.start();
  }

  synchronized void waitUntilFinished() {
    while (fActiveTestDeathCount < testCount()) {
      try {
        wait();
      catch (InterruptedException e) {
        return// ignore
      }
    }
  }
  
  synchronized public void runFinished() {
    fActiveTestDeathCount++;
    notifyAll();
  }
}