package edu.brown.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.voltdb.utils.Pair;
import junit.framework.TestCase;
public class TestThreadUtil extends TestCase {
/**
* testExceptionHandler
*/
public void testExceptionHandler() throws Exception {
final CountDownLatch latch = new CountDownLatch(5);
EventObservableExceptionHandler handler = new EventObservableExceptionHandler();
EventObserver<Pair<Thread, Throwable>> observer = new EventObserver<Pair<Thread, Throwable>>() {
@Override
public void update(EventObservable<Pair<Thread, Throwable>> o, Pair<Thread, Throwable> arg) {
Thread thread = arg.getFirst();
assertNotNull(thread);
Throwable error = arg.getSecond();
assertNotNull(error);
System.err.printf("[%02d] Got Error: %s / %s\n",
latch.getCount(), thread.getName(), error);
latch.countDown();
}
};
handler.addObserver(observer);
Runnable r = new ExceptionHandlingRunnable() {
@Override
public void runImpl() {
System.err.println("Executing failing thread!");
throw new RuntimeException("Old and busted!");
}
};
int poolSize = 1;
int stackSize = 1024*128;
ScheduledThreadPoolExecutor executor = ThreadUtil.getScheduledThreadPoolExecutor("TEST", handler, poolSize, stackSize);
executor.scheduleWithFixedDelay(r, 1, 1, TimeUnit.SECONDS);
boolean ret = latch.await(10, TimeUnit.SECONDS);
assertTrue(ret);
}
/**
* testRun
*/
public void testRun() {
final int num_threads = 100;
final AtomicInteger ctr = new AtomicInteger(0);
List<Runnable> threads = new ArrayList<Runnable>();
for (int i = 0; i < num_threads; i++) {
threads.add(new Runnable() {
public void run() {
ctr.incrementAndGet();
};
});
} // FOR
ThreadUtil.runNewPool(threads);
assertEquals(num_threads, ctr.get());
}
}