package org.oddjob;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.oddjob.arooa.ArooaException;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.deploy.annotations.ArooaHidden;
import org.oddjob.arooa.life.ArooaContextAware;
import org.oddjob.arooa.parsing.ArooaContext;
import org.oddjob.arooa.reflect.ArooaPropertyException;
import org.oddjob.arooa.runtime.RuntimeEvent;
import org.oddjob.arooa.runtime.RuntimeListenerAdapter;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.framework.JobDestroyedException;
import org.oddjob.framework.SimpleJob;
import org.oddjob.state.IsAnyState;
import org.oddjob.state.JobState;
import org.oddjob.state.ParentState;
import org.oddjob.state.ParentStateHandler;
import org.oddjob.state.StateEvent;
import org.oddjob.state.StateListener;
import org.oddjob.tools.StateSteps;
public class OddjobDestroyTest extends TestCase {
private static final Logger logger = Logger.getLogger(
OddjobDestroyTest.class);
@Override
protected void setUp() throws Exception {
super.setUp();
logger.info("----------------------" + getName() +
"--------------------");
}
public void testDestroyWhileChildRunning() throws ArooaPropertyException, ArooaConversionException, InterruptedException {
String xml =
"<oddjob>" +
" <job>" +
" <wait id='wait'/>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
StateSteps oddjobStates = new StateSteps(oddjob);
oddjobStates.startCheck(ParentState.READY, ParentState.EXECUTING,
ParentState.DESTROYED);
oddjob.load();
Stateful wait = new OddjobLookup(oddjob).lookup("wait", Stateful.class);
StateSteps waitStates = new StateSteps(wait);
waitStates.startCheck(JobState.READY, JobState.EXECUTING);
Thread t = new Thread(oddjob);
t.start();
waitStates.checkWait();
waitStates.startCheck(JobState.EXECUTING, JobState.COMPLETE,
JobState.DESTROYED);
oddjob.destroy();
waitStates.checkNow();
oddjobStates.checkNow();
}
public static class ReluctantToDie extends SimpleJob {
boolean die;
@Override
protected int execute() throws Throwable {
return 0;
}
@Override
public void onDestroy() {
super.onDestroy();
if (!die) {
die = true;
throw new IllegalStateException("I'm not ready to die.");
}
}
}
public void testFailedDestroy() {
String xml =
"<oddjob>" +
" <job>" +
" <bean class='" + ReluctantToDie.class.getName() + "'/>" +
" </job>" +
"</oddjob>";
Oddjob test = new Oddjob();
test.setConfiguration(new XMLConfiguration("XML", xml));
test.run();
try {
test.destroy();
fail("Exception expected.");
} catch (IllegalStateException e) {
// expected.
}
assertEquals(ParentState.COMPLETE,
test.lastStateEvent().getState());
test.destroy();
assertEquals(ParentState.DESTROYED,
test.lastStateEvent().getState());
}
public static class ActiveJob
implements Stateful, Runnable, ArooaContextAware {
ParentStateHandler stateHandler = new ParentStateHandler(this);
@Override
public void run() {
stateHandler.waitToWhen(new IsAnyState(), new Runnable() {
@Override
public void run() {
stateHandler.setState(ParentState.ACTIVE);
stateHandler.fireEvent();
}
});
}
@Override
public void addStateListener(StateListener listener)
throws JobDestroyedException {
stateHandler.addStateListener(listener);
}
@Override
public void removeStateListener(StateListener listener) {
stateHandler.removeStateListener(listener);
}
@Override
public StateEvent lastStateEvent() {
return stateHandler.lastStateEvent();
}
@Override
@ArooaHidden
public void setArooaContext(ArooaContext context) {
context.getRuntime().addRuntimeListener(new RuntimeListenerAdapter() {
@Override
public void beforeDestroy(RuntimeEvent event) throws ArooaException {
stateHandler.waitToWhen(new IsAnyState(), new Runnable() {
@Override
public void run() {
stateHandler.setState(ParentState.COMPLETE);
stateHandler.fireEvent();
}
});
}
@Override
public void afterDestroy(RuntimeEvent event) throws ArooaException {
stateHandler.waitToWhen(new IsAnyState(), new Runnable() {
@Override
public void run() {
stateHandler.setState(ParentState.DESTROYED);
stateHandler.fireEvent();
}
});
}
});
}
}
public void testDestroyWhileAsyncJobActive() throws ArooaPropertyException, ArooaConversionException, InterruptedException {
String xml =
"<oddjob>" +
" <job>" +
" <bean class='" + ActiveJob.class.getName() + "' id='active'/>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
StateSteps oddjobStates = new StateSteps(oddjob);
oddjobStates.startCheck(ParentState.READY, ParentState.EXECUTING,
ParentState.ACTIVE, ParentState.DESTROYED);
oddjob.load();
Stateful active = new OddjobLookup(oddjob).lookup("active", Stateful.class);
StateSteps activeStates = new StateSteps(active);
activeStates.startCheck(ParentState.READY, ParentState.ACTIVE);
oddjob.run();
activeStates.checkNow();
activeStates.startCheck(ParentState.ACTIVE, ParentState.COMPLETE,
ParentState.DESTROYED);
oddjob.destroy();
activeStates.checkNow();
oddjobStates.checkNow();
}
}