/*
* Copyright (c) 2004, Rob Gordon.
*/
package org.oddjob.persist;
import java.io.File;
import java.io.Serializable;
import junit.framework.TestCase;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.oddjob.Oddjob;
import org.oddjob.OddjobLookup;
import org.oddjob.Resetable;
import org.oddjob.Stateful;
import org.oddjob.arooa.life.ComponentPersister;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.state.JobState;
import org.oddjob.state.ParentState;
import org.oddjob.structural.ChildHelper;
import org.oddjob.tools.OddjobTestHelper;
import org.oddjob.tools.OurDirs;
/**
*
* @author Rob Gordon.
*/
public class OddjobPersistTest extends TestCase {
private static final Logger logger = Logger.getLogger(OddjobPersistTest.class);
private File config;
private File persistIn;
@Override
protected void setUp() throws Exception {
logger.debug("------------- " + getName() + " -------------------");
OurDirs dirs = new OurDirs();
config = new File(dirs.base(), "test/conf/oddjob-persist-test1.xml");
persistIn = new File(dirs.base(), "work/persist");
if (persistIn.mkdir()) {
logger.debug("Created " + persistIn);
}
}
/*
* Test saving a job.
*/
public void test1Save() throws Exception {
// delete existing file.
FilePersister persister = new FilePersister();
persister.setDir(persistIn);
persister.setPath("oj2");
ComponentPersister componentPersister = persister.persisterFor(null);
componentPersister.clear();
Oddjob oj = new Oddjob();
oj.setName("Oddjob");
oj.setFile(config);
oj.run();
assertEquals("State should be complete",
ParentState.COMPLETE, OddjobTestHelper.getJobState(oj));
Object seqJob = new OddjobLookup(oj).lookup("oj2/sequence");
assertTrue(seqJob instanceof Serializable);
assertEquals(JobState.COMPLETE,
OddjobTestHelper.getJobState((Stateful) seqJob));
Integer current = new OddjobLookup(oj).lookup(
"oj2/sequence.current", Integer.class);
assertEquals(new Integer(1), current);
sanityLoad();
}
/**
* Quickly load with persister only.
*
* @throws Exception
*/
public void sanityLoad() throws Exception {
StandardArooaSession session = new StandardArooaSession();
FilePersister test = new FilePersister();
test.setDir(persistIn);
test.setPath("oj2");
ComponentPersister persister = test.persisterFor(null);
Object seqJob = persister.restore("sequence",
getClass().getClassLoader(), session);
assertEquals("Persisted state should be complete", JobState.COMPLETE,
OddjobTestHelper.getJobState(seqJob));
}
/**
* Test loading the job we've just saved.
*/
public void test2Load() throws Exception {
test1Save();
Oddjob oj = new Oddjob();
oj.setName("OJ again");
oj.setFile(config);
oj.load();
Oddjob oj2 = (Oddjob) new OddjobLookup(oj).lookup("oj2");
oj2.load();
Object seqJob = new OddjobLookup(oj).lookup("oj2/sequence");
assertNotNull(seqJob);
assertEquals("Persisted state should be complete", JobState.COMPLETE,
OddjobTestHelper.getJobState(seqJob));
assertEquals("Just loaded sequence wrong.", new Integer(1),
((DynaBean) seqJob).get("current"));
Object[] children = ChildHelper.getChildren(oj);
assertEquals(1, children.length);
// otherwise it wouldn't run.
((Resetable) seqJob).hardReset();
assertEquals(JobState.READY, OddjobTestHelper.getJobState(seqJob));
assertEquals(ParentState.READY, oj.lastStateEvent().getState());
((Runnable) seqJob).run();
assertEquals("Second execute sequence wrong.", new Integer(2),
PropertyUtils.getProperty(seqJob, "current"));
assertEquals("State should be complete", JobState.COMPLETE,
OddjobTestHelper.getJobState(seqJob));
}
}