/* * Copyright (c) 2004, Rob Gordon. */ package org.oddjob.persist; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import java.util.Properties; import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.oddjob.Loadable; import org.oddjob.Oddjob; import org.oddjob.OddjobLookup; import org.oddjob.Resetable; import org.oddjob.arooa.MockArooaSession; import org.oddjob.arooa.convert.ArooaConversionException; import org.oddjob.arooa.life.ComponentPersistException; import org.oddjob.arooa.life.ComponentPersister; import org.oddjob.arooa.reflect.ArooaPropertyException; import org.oddjob.arooa.registry.ComponentPool; import org.oddjob.arooa.registry.MockComponentPool; import org.oddjob.arooa.registry.Path; import org.oddjob.arooa.standard.StandardArooaSession; import org.oddjob.framework.SerializableJob; import org.oddjob.state.JobState; import org.oddjob.state.ParentState; import org.oddjob.tools.OddjobTestHelper; import org.oddjob.tools.OurDirs; /** * * @author Rob Gordon. */ public class FilePersisterTest extends TestCase { File DIR; @Override protected void setUp() throws Exception { OurDirs ourDirs = new OurDirs(); DIR = ourDirs.relative("work/persist"); if (DIR.exists()) { FileUtils.forceDelete(DIR); } FileUtils.forceMkdir(DIR); } public static class OurJob extends SerializableJob { private static final long serialVersionUID = 2008110500; private String name; private String text; public void setName(String name) { this.name = name; } public void setText(String text) { this.text = text; } @Override protected int execute() throws Throwable { // TODO Auto-generated method stub return 0; } } /** * Simple test of persisting something * @throws ComponentPersistException * */ public void testPersistAndLoad() throws ComponentPersistException { OurJob job = new OurJob(); job.setName("Test"); job.setText("Hello World"); job.run(); StandardArooaSession session = new StandardArooaSession(); FilePersister test = new FilePersister(); test.setDir(DIR); ComponentPersister persister = test.persisterFor(null); persister.persist("test-persist", job, session); File check = new File(DIR, "test-persist.ser"); assertTrue(check.exists()); job = (OurJob) persister.restore("test-persist", getClass().getClassLoader(), session); assertEquals("Test", job.name); assertEquals("Hello World", job.text); assertEquals(JobState.COMPLETE, OddjobTestHelper.getJobState(job)); // check we can run it again. ((Resetable) job).hardReset(); assertEquals(JobState.READY, OddjobTestHelper.getJobState(job)); job.run(); assertEquals(JobState.COMPLETE, OddjobTestHelper.getJobState(job)); } class OurSession extends MockArooaSession { @Override public ComponentPool getComponentPool() { return new MockComponentPool() { }; } } public void testFailsOnNoDirectory() { FilePersister test = new FilePersister(); test.setDir(new File(DIR, "idontexist")); try { test.persist((Path) null, (String) null, (Object) null); fail(); } catch (ComponentPersistException e) { assertTrue(e.getMessage().startsWith("No directory")); } } public void testCreatesFullPath() throws ComponentPersistException { FilePersister test = new FilePersister(); test.setDir(DIR); test.persist(new Path("a/b/c"), "x", new OurJob()); File check = new File(DIR, "a/b/c/x.ser"); assertTrue(check.exists()); } public void testNullDirectory() throws ComponentPersistException { FilePersister persister = new FilePersister(); try { persister.directoryFor(new Path()); fail("No directory should fail."); } catch (NullPointerException e) { // expected } } public void testPersistExample() throws ArooaPropertyException, ArooaConversionException, URISyntaxException { URL url = getClass().getClassLoader().getResource("org/oddjob/persist/FilePersisterExample.xml"); File file = new File(url.toURI().getPath()); Properties props = new Properties(); props.setProperty("important.stuff", "Important Stuff!"); Oddjob oddjob1 = new Oddjob(); oddjob1.setFile(file); oddjob1.setArgs(new String[] { DIR.getAbsolutePath() }); oddjob1.setProperties(props); oddjob1.run(); assertEquals(ParentState.COMPLETE, oddjob1.lastStateEvent().getState()); oddjob1.destroy(); assertTrue(new File(DIR, "important-jobs/save-me.ser").exists()); Oddjob oddjob2 = new Oddjob(); oddjob2.setFile(file); oddjob2.setArgs(new String[] { DIR.getAbsolutePath() }); oddjob2.load(); OddjobLookup lookup = new OddjobLookup(oddjob2); Loadable loadable = lookup.lookup("important-jobs", Loadable.class); loadable.load(); String text = lookup.lookup("important-jobs/save-me.text", String.class); assertEquals("Important Stuff!", text); oddjob2.destroy(); } }