001package junit.extensions;
002
003import junit.framework.Test;
004import junit.framework.TestCase;
005import junit.framework.TestResult;
006import junit.framework.TestSuite;
007
008/**
009 * A TestSuite for active Tests. It runs each
010 * test in a separate thread and waits until all
011 * threads have terminated.
012 * -- Aarhus Radisson Scandinavian Center 11th floor
013 */
014public class ActiveTestSuite extends TestSuite {
015    private volatile int fActiveTestDeathCount;
016
017    public ActiveTestSuite() {
018    }
019
020    public ActiveTestSuite(Class<? extends TestCase> theClass) {
021        super(theClass);
022    }
023
024    public ActiveTestSuite(String name) {
025        super(name);
026    }
027
028    public ActiveTestSuite(Class<? extends TestCase> theClass, String name) {
029        super(theClass, name);
030    }
031
032    @Override
033    public void run(TestResult result) {
034        fActiveTestDeathCount = 0;
035        super.run(result);
036        waitUntilFinished();
037    }
038
039    @Override
040    public void runTest(final Test test, final TestResult result) {
041        Thread t = new Thread() {
042            @Override
043            public void run() {
044                try {
045                    // inlined due to limitation in VA/Java
046                    //ActiveTestSuite.super.runTest(test, result);
047                    test.run(result);
048                } finally {
049                    ActiveTestSuite.this.runFinished();
050                }
051            }
052        };
053        t.start();
054    }
055
056    synchronized void waitUntilFinished() {
057        while (fActiveTestDeathCount < testCount()) {
058            try {
059                wait();
060            } catch (InterruptedException e) {
061                return; // ignore
062            }
063        }
064    }
065
066    public synchronized void runFinished() {
067        fActiveTestDeathCount++;
068        notifyAll();
069    }
070}