package org.geoserver.flow;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import junit.framework.TestCase;
public class NestedRequestSentinelTest extends TestCase {
public void testBasicNesting() {
NestedRequestSentinel sentinel = new NestedRequestSentinel();
// no nesting
assertTrue(sentinel.isOutermostRequest());
// one level, outermost
sentinel.start();
assertTrue(sentinel.isOutermostRequest());
// two levels
sentinel.start();
assertFalse(sentinel.isOutermostRequest());
// three levels
sentinel.start();
assertFalse(sentinel.isOutermostRequest());
// back to two levels
sentinel.stop();
assertFalse(sentinel.isOutermostRequest());
// back to two outermost
sentinel.stop();
assertTrue(sentinel.isOutermostRequest());
sentinel.stop();
}
public void testMTNesting() throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
List<Future<Throwable>> results = new ArrayList<Future<Throwable>>();
for (int i = 0; i < 200; i++) {
Future<Throwable> f = executor.submit(new Callable<Throwable>() {
public Throwable call() throws Exception {
try {
testBasicNesting();
} catch(Throwable t) {
t.printStackTrace();
return t;
}
return null;
}
});
results.add(f);
}
for (Future<Throwable> future : results) {
assertNull(future.get());
}
}
}