package org.oddjob.persist;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.oddjob.FailedToStopException;
import org.oddjob.Oddjob;
import org.oddjob.OddjobSessionFactory;
import org.oddjob.Stateful;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.life.ComponentPersistException;
import org.oddjob.arooa.life.ComponentPersister;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.arooa.types.ArooaObject;
import org.oddjob.arooa.utils.DateHelper;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.images.IconHelper;
import org.oddjob.jobs.WaitJob;
import org.oddjob.scheduling.DefaultExecutors;
import org.oddjob.scheduling.Trigger;
import org.oddjob.state.FlagState;
import org.oddjob.state.JobState;
import org.oddjob.state.ParentState;
import org.oddjob.tools.IconSteps;
import org.oddjob.tools.OddjobTestHelper;
import org.oddjob.tools.OurDirs;
import org.oddjob.tools.StateSteps;
import org.oddjob.util.Clock;
public class ArchiveJobTest extends TestCase {
private static final Logger logger = Logger.getLogger(ArchiveJobTest.class);
@Override
protected void setUp() throws Exception {
super.setUp();
logger.info("---------------- " + getName() + " -----------------");
}
public void testWithSimpleJob() throws ComponentPersistException {
final MapPersister persister = new MapPersister();
FlagState job = new FlagState();
ArchiveJob test = new ArchiveJob();
test.setArooaSession(new StandardArooaSession());
test.setArchiver(persister);
test.setArchiveIdentifier("1");
test.setArchiveName("test");
test.setJob(job);
StateSteps states = new StateSteps(test);
states.startCheck(ParentState.READY, ParentState.EXECUTING,
ParentState.COMPLETE);
test.run();
states.checkNow();
ComponentPersister cp = persister.persisterFor("test");
Stateful stateful = (Stateful) cp.restore(
"1", getClass().getClassLoader(), null);
assertEquals(JobState.COMPLETE, stateful.lastStateEvent().getState());
test.destroy();
}
public void testState() throws FailedToStopException, ComponentPersistException, InterruptedException {
final MapPersister persister = new MapPersister();
WaitJob wait = new WaitJob();
StateSteps waitStates = new StateSteps(wait);
waitStates.startCheck(JobState.READY, JobState.EXECUTING);
Thread t = new Thread(wait);
t.start();
waitStates.checkWait();
ArchiveJob test = new ArchiveJob();
test.setArooaSession(new StandardArooaSession());
test.setArchiver(persister);
test.setArchiveIdentifier("1");
test.setArchiveName("test");
test.setJob(wait);
test.run();
assertEquals(ParentState.ACTIVE, test.lastStateEvent().getState());
wait.stop();
t.join();
ComponentPersister cp = persister.persisterFor("test");
Stateful stateful = (Stateful) cp.restore(
"1", getClass().getClassLoader(), null);
assertNotNull(stateful);
assertEquals(IconHelper.COMPLETE, OddjobTestHelper.getIconId(stateful));
assertEquals(ParentState.COMPLETE, test.lastStateEvent().getState());
assertEquals(JobState.COMPLETE, stateful.lastStateEvent().getState());
}
public void testReflectsChildState() throws FailedToStopException, ComponentPersistException, InterruptedException {
final MapPersister persister = new MapPersister();
FlagState job = new FlagState(JobState.INCOMPLETE);
ArchiveJob test = new ArchiveJob();
test.setArooaSession(new StandardArooaSession());
test.setArchiver(persister);
test.setArchiveIdentifier("1");
test.setArchiveName("test");
test.setJob(job);
StateSteps testStates = new StateSteps(test);
testStates.startCheck(ParentState.READY,
ParentState.EXECUTING, ParentState.INCOMPLETE);
test.run();
testStates.checkNow();
ComponentPersister cp = persister.persisterFor("test");
Stateful stateful = (Stateful) cp.restore("1", getClass().getClassLoader(), null);
assertNotNull(stateful);
assertEquals(IconHelper.NOT_COMPLETE, OddjobTestHelper.getIconId(stateful));
assertEquals(ParentState.INCOMPLETE, test.lastStateEvent().getState());
assertEquals(JobState.INCOMPLETE, stateful.lastStateEvent().getState());
}
public void testStop() throws InterruptedException, FailedToStopException {
DefaultExecutors executors = new DefaultExecutors();
final MapPersister persister = new MapPersister();
FlagState depends = new FlagState();
FlagState neverRuns = new FlagState();
Trigger trigger = new Trigger();
trigger.setExecutorService(executors.getPoolExecutor());
trigger.setOn(depends);
trigger.setJob(neverRuns);
ArchiveJob test = new ArchiveJob();
test.setArchiver(persister);
test.setArchiveIdentifier("1");
test.setArchiveName("test");
test.setJob(trigger);
StateSteps testStates = new StateSteps(test);
testStates.startCheck(ParentState.READY,
ParentState.EXECUTING, ParentState.STARTED);
test.run();
testStates.checkWait();
testStates.startCheck(ParentState.STARTED,
ParentState.READY);
test.stop();
testStates.checkNow();
}
private static class Always101MillisecondsLater implements Clock {
volatile long millis;
public Always101MillisecondsLater() throws ParseException {
millis = DateHelper.parseDateTime("2015-04-30 07:45").getTime();
}
@Override
public Date getDate() {
millis = millis + 101;
return new Date(millis);
}
}
public void testInOddjob()
throws ComponentPersistException, IOException, InterruptedException, ParseException {
OurDirs dirs = new OurDirs();
File baseDir = dirs.relative("work/archiver");
if (baseDir.exists()) {
FileUtils.forceDelete(baseDir);
}
FileUtils.forceMkdir(baseDir);
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/persist/ArchiveJobTest.xml",
getClass().getClassLoader()));
oddjob.setExport("clock", new ArooaObject(
new Always101MillisecondsLater()));
oddjob.setArgs(new String[] { baseDir.getPath() });
StateSteps state = new StateSteps(oddjob);
state.startCheck(ParentState.READY, ParentState.EXECUTING,
ParentState.ACTIVE,
ParentState.COMPLETE);
oddjob.run();
state.checkWait();
oddjob.destroy();
FilePersister persister = new FilePersister();
persister.setDir(baseDir);
ComponentPersister thePersister = persister.persisterFor("Batch_01");
String[] archives = thePersister.list();
assertEquals(3, archives.length);
}
public void testStateChangesForAsynchronousJobs() throws InterruptedException {
ArooaSession session = new OddjobSessionFactory().createSession();
DefaultExecutors executors = new DefaultExecutors();
FlagState depends = new FlagState();
FlagState toTrigger = new FlagState();
Trigger trigger = new Trigger();
trigger.setOn(depends);
trigger.setJob(toTrigger);
trigger.setExecutorService(executors.getPoolExecutor());
final MapPersister persister = new MapPersister();
ArchiveJob test = new ArchiveJob();
test.setArooaSession(session);
test.setJob(trigger);
test.setArchiver(persister);
test.setArchiveIdentifier("Client_Report");
StateSteps states = new StateSteps(test);
states.startCheck(ParentState.READY, ParentState.EXECUTING, ParentState.STARTED);
IconSteps icons = new IconSteps(test);
icons.startCheck(IconHelper.READY, IconHelper.EXECUTING, IconHelper.STARTED);
test.run();
states.checkNow();
icons.checkNow();
states.startCheck(ParentState.STARTED, ParentState.ACTIVE,
ParentState.COMPLETE);
icons.startCheck(IconHelper.STARTED, IconHelper.ACTIVE,
IconHelper.COMPLETE);
depends.run();
states.checkWait();
icons.checkWait();
executors.stop();
}
}