package org.geoserver.flow;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import junit.framework.TestCase;
import org.geoserver.ows.HttpErrorCodeException;
import org.geoserver.ows.Request;
public class ControlFlowCallbackTest extends TestCase {
public void testBasicFunctionality() {
ControlFlowCallback callback = new ControlFlowCallback();
TestingConfigurator tc = new TestingConfigurator();
CountingController controller = new CountingController(1, 0);
tc.controllers.add(controller);
callback.configurator = tc;
callback.operationDispatched(null, null);
assertEquals(1, controller.requestIncomingCalls);
assertEquals(0, controller.requestCompleteCalls);
callback.finished(null);
assertEquals(1, controller.requestIncomingCalls);
assertEquals(1, controller.requestCompleteCalls);
}
public void testTimeout() {
ControlFlowCallback callback = new ControlFlowCallback();
TestingConfigurator tc = new TestingConfigurator();
tc.timeout = 300;
CountingController c1 = new CountingController(2, 200);
CountingController c2 = new CountingController(1, 200);
tc.controllers.add(c1);
tc.controllers.add(c2);
callback.configurator = tc;
try {
callback.operationDispatched(null, null);
fail("A HTTP 503 should have been raised!");
} catch(HttpErrorCodeException e) {
assertEquals(503, e.getErrorCode());
}
assertEquals(1, c1.requestIncomingCalls);
assertEquals(0, c1.requestCompleteCalls);
assertEquals(1, c2.requestIncomingCalls);
assertEquals(0, c1.requestCompleteCalls);
callback.finished(null);
}
/**
* A wide open configurator to be used for testing
*/
static class TestingConfigurator implements ControlFlowConfigurator {
List<FlowController> controllers = new ArrayList<FlowController>();
long timeout;
boolean stale = true;
public Collection<FlowController> buildFlowControllers() throws Exception {
return controllers;
}
public long getTimeout() {
return timeout;
}
public boolean isStale() {
if(stale) {
stale = false;
return true;
}
return false;
}
}
/**
* A controller counting requests, can also be used to check for timeouts
*/
static class CountingController implements FlowController {
int priority;
long delay;
int requestCompleteCalls;
int requestIncomingCalls;
public CountingController(int priority, long delay) {
this.priority = priority;
this.delay = delay;
}
public int getPriority() {
return priority;
}
public void requestComplete(Request request) {
requestCompleteCalls++;
}
public boolean requestIncoming(Request request, long timeout) {
requestIncomingCalls++;
if(delay > 0)
if(timeout > delay) {
try {
Thread.sleep(delay);
} catch(InterruptedException e) {
throw new RuntimeException("This is unexpected");
}
} else {
return false;
}
return true;
}
}
}