package org.geoserver.flow.controller;
import org.geoserver.flow.controller.GlobalFlowController;
import org.geoserver.flow.controller.FlowControllerTestingThread.ThreadState;
import org.geoserver.ows.Request;
public class GlobalFlowControllerTest extends AbstractFlowControllerTest {
private static final long MAX_WAIT = 1000;
public void testPriority() {
GlobalFlowController controller = new GlobalFlowController(1);
// priority == queue size
assertEquals(1, controller.getPriority());
}
public void testSingleDelay() throws Exception {
// create a single item flow controller
GlobalFlowController controller = new GlobalFlowController(1);
// make three testing threads that will "process" forever, until we interrupt them
FlowControllerTestingThread t1 = new FlowControllerTestingThread(controller, new Request(),
0, Long.MAX_VALUE);
FlowControllerTestingThread t2 = new FlowControllerTestingThread(controller, new Request(),
0, Long.MAX_VALUE);
FlowControllerTestingThread t3 = new FlowControllerTestingThread(controller, new Request(),
0, Long.MAX_VALUE);
try {
// start threads making sure every one of them managed to block somewhere before
// starting the next one
t1.start();
waitBlocked(t1, MAX_WAIT);
t2.start();
waitBlocked(t2, MAX_WAIT);
t3.start();
waitBlocked(t3, MAX_WAIT);
assertEquals(ThreadState.PROCESSING, t1.state);
assertEquals(ThreadState.STARTED, t2.state);
assertEquals(ThreadState.STARTED, t3.state);
// let t1 go and wait until its termination. This should allow t2 to go
t1.interrupt();
waitTerminated(t1, MAX_WAIT);
assertEquals(ThreadState.COMPLETE, t1.state);
assertEquals(ThreadState.PROCESSING, t2.state);
assertEquals(ThreadState.STARTED, t3.state);
// let t2 go and wait until its termination. This should allow t3 to go
t2.interrupt();
waitTerminated(t2, MAX_WAIT);
assertEquals(ThreadState.COMPLETE, t1.state);
assertEquals(ThreadState.COMPLETE, t2.state);
assertEquals(ThreadState.PROCESSING, t3.state);
// unlock t3 as well
t3.interrupt();
} finally {
waitAndKill(t1, MAX_WAIT);
waitAndKill(t2, MAX_WAIT);
waitAndKill(t3, MAX_WAIT);
}
}
public void testTimeout() {
// create a single item flow controller
GlobalFlowController controller = new GlobalFlowController(1);
// make two testing threads that will "process" for 400ms, but with a timeout of 200 on the
// flow controller
FlowControllerTestingThread t1 = new FlowControllerTestingThread(controller, new Request(),
100, 400);
FlowControllerTestingThread t2 = new FlowControllerTestingThread(controller, new Request(),
100, 400);
// start t1 first, let go t2 after
try {
t1.start();
waitBlocked(t1, MAX_WAIT);
t2.start();
// wait until both terminate
waitTerminated(t1, MAX_WAIT);
waitTerminated(t2, MAX_WAIT);
assertEquals(ThreadState.COMPLETE, t1.state);
assertEquals(ThreadState.TIMED_OUT, t2.state);
} finally {
waitAndKill(t1, MAX_WAIT);
waitAndKill(t2, MAX_WAIT);
}
}
}