package org.oddjob.framework;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import junit.framework.TestCase;
import org.oddjob.FailedToStopException;
import org.oddjob.Oddjob;
import org.oddjob.OddjobLookup;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.reflect.ArooaPropertyException;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.images.IconHelper;
import org.oddjob.state.JobState;
import org.oddjob.tools.IconSteps;
import org.oddjob.tools.StateSteps;
public class SimpleJobTest extends TestCase {
public static class OurJob extends SimpleJob {
List<String> results = new ArrayList<String>();
public void setConstantAttribute(String value) {
results.add("Set constant attribute: " + value);
}
public void setRuntimeAttribute(String value) {
results.add("Set runtime attribute: " + value);
}
public void setElementProperty(Object value) {
results.add("Set element property: " + value);
}
@Inject
public void setClassLoader(ClassLoader classLoader) {
results.add("Set auto property: " +
(classLoader == null ? "null" : "ClassLoader"));
}
@Override
protected int execute() throws Throwable {
results.add("Executing.");
return 0;
}
@Override
protected void onInitialised() {
super.onInitialised();
results.add("In onInitialised.");
}
@Override
protected void onDestroy() {
results.add("In onDestroy.");
}
@Override
protected void onConfigured() {
super.onConfigured();
results.add("In onConfigured.");
}
public String getSomeValue() {
return "Orange";
}
public List<String> getResults() {
return results;
}
}
public void testFullLifeCycleInOddjob() throws ArooaPropertyException, ArooaConversionException {
String xml =
"<oddjob>" +
" <job>" +
" <bean id='ours'" +
" class='" + OurJob.class.getName() + "'" +
" constantAttribute='Apple'" +
" runtimeAttribute='${ours.someValue}'>" +
" <elementProperty>" +
" <value value='Banana'/>" +
" </elementProperty>" +
" </bean>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
@SuppressWarnings("unchecked")
List<String> results = (List<String>) new OddjobLookup(oddjob).lookup("ours.results",
List.class);
assertEquals("Set constant attribute: Apple", results.get(0));
assertEquals("In onInitialised.", results.get(1));
assertEquals("Set element property: Banana", results.get(2));
assertEquals("Set runtime attribute: Orange", results.get(3));
assertEquals("Set auto property: ClassLoader", results.get(4));
assertEquals("In onConfigured.", results.get(5));
assertEquals("Executing.", results.get(6));
assertEquals(7, results.size());
oddjob.destroy();
assertEquals("In onDestroy.", results.get(7));
assertEquals("Set element property: null", results.get(8));
assertEquals(9, results.size());
}
private class SleepyJob extends SimpleJob {
long sleep;
@Override
protected int execute() throws Throwable {
sleep(sleep);
return 0;
}
}
public void testSleepAndComplete() throws InterruptedException, FailedToStopException {
SleepyJob test = new SleepyJob();
test.sleep = 1;
IconSteps icons = new IconSteps(test);
icons.startCheck(IconHelper.READY, IconHelper.EXECUTING,
IconHelper.SLEEPING, IconHelper.EXECUTING,
IconHelper.COMPLETE);
StateSteps state = new StateSteps(test);
state.startCheck(JobState.READY, JobState.EXECUTING,
JobState.COMPLETE);
test.run();
state.checkNow();
icons.checkNow();
}
public void testSleepAndStop() throws InterruptedException, FailedToStopException {
SleepyJob test = new SleepyJob();
IconSteps icons = new IconSteps(test);
icons.startCheck(IconHelper.READY, IconHelper.EXECUTING,
IconHelper.SLEEPING);
StateSteps state = new StateSteps(test);
state.startCheck(JobState.READY, JobState.EXECUTING);
new Thread(test).start();
state.checkWait();
icons.checkWait();
icons.startCheck(IconHelper.SLEEPING,
IconHelper.STOPPING,
IconHelper.COMPLETE);
test.stop();
assertEquals(JobState.COMPLETE, test.lastStateEvent().getState());
icons.checkNow();
}
public void testForceable() {
SimpleJob test = new SimpleJob() {
@Override
protected int execute() throws Throwable {
return 0;
}
};
assertEquals(JobState.READY, test.lastStateEvent().getState());
test.force();
assertEquals(JobState.COMPLETE, test.lastStateEvent().getState());
}
}