/*
* (c) Rob Gordon 2006
*/
package org.oddjob.values.properties;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.oddjob.Describeable;
import org.oddjob.Oddjob;
import org.oddjob.OddjobLookup;
import org.oddjob.Resetable;
import org.oddjob.Stateful;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.reflect.ArooaPropertyException;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.framework.SimpleJob;
import org.oddjob.persist.MapPersister;
import org.oddjob.state.JobState;
import org.oddjob.state.ParentState;
import org.oddjob.tools.OurDirs;
/**
* Test for PropertiesType.
*
* @author rob
*
*/
public class PropertiesJobTest extends TestCase {
private static final Logger logger = Logger.getLogger(PropertiesJobTest.class);
@Override
protected void setUp() throws Exception {
logger.info("--------------------- " + getName() + " ------------------");
}
/**
* Test a simple set and a get.
*
* @throws Exception
*/
public void testSimpleSetGet() throws Exception {
String xml =
"<oddjob>" +
" <job>" +
" <properties id='test'>" +
" <values>" +
" <value key='snack.favourite' value='apple'/>" +
" </values>" +
" </properties>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("apple", lookup.lookup("test.properties(snack.favourite)", String.class));
// assertEquals("apple", lookup.lookup("snack.favourite"));
Resetable properties = lookup.lookup("test", Resetable.class);
properties.hardReset();
assertEquals("apple", lookup.lookup("test.properties(snack.favourite)", String.class));
assertEquals(null, lookup.lookup("snack.favourite"));
oddjob.destroy();
}
/**
*/
public void testPropertiesFromValues() throws Exception {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/values/properties/PropertiesJobFromValues.xml",
getClass().getClassLoader()));
oddjob.run();
assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState());
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("${snack.favourite} is apple", lookup.lookup("echo.text", String.class));
oddjob.destroy();
}
/**
*/
public void testPropertiesWithSubstitution() throws Exception {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/values/properties/PropertiesJobWithSubstitution.xml",
getClass().getClassLoader()));
oddjob.run();
assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState());
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("${snack.favourite} is apple", lookup.lookup("echo.text", String.class));
oddjob.destroy();
}
/**
* Test setting properties from an input stream.
*/
public void testSetFromInput() throws Exception {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/values/properties/PropertiesJobFromInput.xml",
getClass().getClassLoader()));
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("John Smith",
lookup.lookup("echo.text", String.class));
oddjob.destroy();
}
public static class MyComp extends SimpleJob {
Properties props;
public void setProps(Properties props) {
this.props = props;
}
@Override
protected int execute() throws Throwable {
return 0;
}
}
public void testSetPropertiesFromFile() {
OurDirs dirs = new OurDirs();
String xml =
"<oddjob id='oj'>" +
" <job>" +
" <sequential>" +
" <jobs>" +
" <properties id='props'>" +
" <input>" +
" <file file='" + dirs.base() + "/test/types/PropertyTypeTest.props'/>" +
" </input>" +
" </properties>" +
" <bean id='mycomp' class='" + MyComp.class.getName() + "'>" +
" <props>" +
" <value value='${props.properties}'/>" +
" </props>" +
" </bean>" +
" </jobs>" +
" </sequential>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
MyComp myComp = (MyComp) new OddjobLookup(oddjob).lookup("mycomp");
assertNotNull(myComp);
assertEquals("test", myComp.props.get("a.b.c"));
}
public void testSetFromPrevious() {
String xml =
"<oddjob id='oj'>" +
" <job>" +
" <sequential>" +
" <jobs>" +
" <properties>" +
" <values>" +
" <value key='favourite.fruit' value='apple'/>" +
" <value key='snack.fruit' value='${favourite.fruit}'/>" +
" </values>" +
" </properties>" +
" <bean id='mycomp' class='" + MyComp.class.getName() + "'>" +
" <props>" +
" <properties>" +
" <values>" +
" <value key='snack.fruit' value='${snack.fruit}'/>" +
" </values>" +
" </properties>" +
" </props>" +
" </bean>" +
" </jobs>" +
" </sequential>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
MyComp myComp = (MyComp) new OddjobLookup(oddjob).lookup("mycomp");
assertNotNull(myComp);
assertEquals("apple", myComp.props.get("snack.fruit"));
}
public void testSettingSelfFromPrevious() throws ArooaConversionException {
String xml =
"<oddjob id='oj'>" +
" <job>" +
" <properties id='test'>" +
" <values>" +
" <value key='dist.dir' value='ojdist'/>" +
" <value key='dist.name' value='oddjob-0.27.0'/>" +
" <value key='dist.dir.src' value='${dist.dir}/src/${dist.name}'/>" +
" <value key='dist.dir.bin' value='${dist.dir}/bin/${dist.name}'/>" +
" </values>" +
" </properties>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("ojdist/src/oddjob-0.27.0",
lookup.lookup("test.properties(dist.dir.src)", String.class));
assertEquals("ojdist/bin/oddjob-0.27.0",
lookup.lookup("test.properties(dist.dir.bin)", String.class));
Properties properties = lookup.lookup("test.properties", Properties.class);
assertEquals(4, properties.size());
assertEquals("ojdist", properties.getProperty("dist.dir"));
assertEquals("oddjob-0.27.0", properties.getProperty("dist.name"));
assertEquals("ojdist/src/oddjob-0.27.0", properties.getProperty("dist.dir.src"));
assertEquals("ojdist/bin/oddjob-0.27.0", properties.getProperty("dist.dir.bin"));
oddjob.destroy();
}
public void testMergeFiles() throws ArooaPropertyException, ArooaConversionException {
String xml =
"<oddjob>" +
" <job>" +
" <sequential>" +
" <jobs>" +
" <properties substitute='true'>" +
" <sets>" +
" <properties>" +
" <input>" +
" <resource resource='org/oddjob/values/properties/PropertiesTypeTest1.properties'/>" +
" </input>" +
" </properties>" +
" <properties>" +
" <input>" +
" <resource resource='org/oddjob/values/properties/PropertiesTypeTest2.properties'/>" +
" </input>" +
" </properties>" +
" </sets>" +
" </properties>" +
" <echo id='echo'>${snack.favourite}</echo>" +
" </jobs>" +
" </sequential>" +
" </job>" +
"</oddjob>";
Oddjob oj = new Oddjob();
oj.setConfiguration(new XMLConfiguration("XML", xml));
oj.run();
String result = new OddjobLookup(oj).lookup("echo.text",
String.class);
assertEquals("apples", result);
oj.destroy();
}
public void testSerialzation() throws IOException, ClassNotFoundException, ArooaPropertyException, ArooaConversionException {
String xml =
"<oddjob>" +
" <job>" +
" <sequential>" +
" <jobs>" +
" <properties id='test'>" +
" <values>" +
" <value key='snack.favourite' value='apple'/>" +
" </values>" +
" </properties>" +
" <variables id='vars'>" +
" <result>" +
" <value value='${snack.favourite}'/>" +
" </result>" +
" </variables>" +
" </jobs>" +
" </sequential>" +
" </job>" +
"</oddjob>";
MapPersister persister = new MapPersister();
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.setPersister(persister);
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
Stateful test1 = lookup.lookup("test", Stateful.class);
assertEquals(JobState.COMPLETE,
test1.lastStateEvent().getState());
String r1 = lookup.lookup("vars.result", String.class);
assertEquals("apple", r1);
Oddjob second = new Oddjob();
second.setConfiguration(new XMLConfiguration("XML", xml));
second.setPersister(persister);
second.load();
lookup = new OddjobLookup(second);
Stateful test2 = lookup.lookup("test", Stateful.class);
assertEquals(JobState.COMPLETE,
test2.lastStateEvent().getState());
String r2 = lookup.lookup("vars.result", String.class);
assertNull("apple", r2);
Runnable vars = lookup.lookup("vars", Runnable.class);
vars.run();
String r3 = lookup.lookup("vars.result", String.class);
assertEquals("apple", r3);
oddjob.destroy();
}
public void testOverridingProperties() throws ArooaPropertyException, ArooaConversionException {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/values/properties/PropertiesJobOverriding.xml",
getClass().getClassLoader()));
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
assertEquals("${fruit.favourite} is apple",
lookup.lookup("echo1.text", String.class));
assertEquals("${fruit.favourite} is apple",
lookup.lookup("echo2.text", String.class));
assertEquals("${fruit.favourite} is banana",
lookup.lookup("echo3.text", String.class));
oddjob.destroy();
}
public void testDescribeable() throws ArooaPropertyException, ArooaConversionException {
String xml =
"<oddjob>" +
"<job>" +
"<sequential>" +
"<jobs>" +
"<properties id='props1' name='Properties 1'>" +
"<values>" +
"<value key='fruit.favourite' value='apple'/>" +
"</values>" +
"</properties>" +
"<properties id='props2' name='Properties 2'>" +
"<values>" +
"<value key='fruit.favourite' value='pear'/>" +
"</values>" +
"</properties>" +
"<properties id='props3' name='Properties 3' override='true'>" +
"<values>" +
"<value key='fruit.favourite' value='banana'/>" +
"</values>" +
"</properties>" +
"</jobs>" +
"</sequential>" +
"</job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("TEST", xml));
oddjob.load();
OddjobLookup lookup = new OddjobLookup(oddjob);
PropertiesJob props1 = lookup.lookup("props1", PropertiesJob.class);
PropertiesJob props2 = lookup.lookup("props2", PropertiesJob.class);
PropertiesJob props3 = lookup.lookup("props3", PropertiesJob.class);
Map<String, String> description1;
Map<String, String> description2;
Map<String, String> description3;
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(0, description1.size());
assertEquals(0, description2.size());
assertEquals(0, description3.size());
props1.run();
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(1, description1.size());
assertEquals(0, description2.size());
assertEquals(0, description3.size());
assertEquals("apple",
description1.get("fruit.favourite"));
props2.run();
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(1, description1.size());
assertEquals(1, description2.size());
assertEquals(0, description3.size());
assertEquals("apple",
description1.get("fruit.favourite"));
assertEquals("pear *(apple) [Properties 1]",
description2.get("fruit.favourite"));
props1.hardReset();
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(0, description1.size());
assertEquals(1, description2.size());
assertEquals(0, description3.size());
assertEquals("pear",
description2.get("fruit.favourite"));
props3.run();
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(0, description1.size());
assertEquals(1, description2.size());
assertEquals(1, description3.size());
assertEquals("pear *(banana) [Properties 3]",
description2.get("fruit.favourite"));
assertEquals("banana",
description3.get("fruit.favourite"));
props1.run();
props3.hardReset();
description1 = props1.describe();
description2 = props2.describe();
description3 = props3.describe();
assertEquals(1, description1.size());
assertEquals(1, description2.size());
assertEquals(0, description3.size());
assertEquals("apple *(pear) [Properties 2]",
description1.get("fruit.favourite"));
assertEquals("pear",
description2.get("fruit.favourite"));
oddjob.destroy();
}
public void testDescribeAll() throws ArooaPropertyException, ArooaConversionException {
String xml =
"<oddjob>" +
"<job>" +
"<sequential>" +
"<jobs>" +
"<properties id='props1' name='Properties 1'>" +
"<values>" +
"<value key='fruit.favourite' value='apple'/>" +
"</values>" +
"</properties>" +
"<properties id='props2' name='Properties 2'/>" +
"</jobs>" +
"</sequential>" +
"</job>" +
"</oddjob>";
System.setProperty("props.job.test.only", "test");
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("TEST", xml));
oddjob.run();
OddjobLookup lookup = new OddjobLookup(oddjob);
PropertiesJob props1 = lookup.lookup("props1", PropertiesJob.class);
PropertiesJob props2 = lookup.lookup("props2", PropertiesJob.class);
Map<String, String> description1;
Map<String, String> description2;
description1 = props1.describe();
description2 = props2.describe();
assertEquals(1, description1.size());
assertTrue(description2.size() > 1);
assertEquals("apple [Properties 1]",
description2.get("fruit.favourite"));
assertEquals("test [SYSTEM]",
description2.get("props.job.test.only"));
oddjob.destroy();
}
public void testSettingSystemProperties() throws Exception {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration(
"org/oddjob/values/properties/PropertiesSystem.xml",
getClass().getClassLoader()));
oddjob.run();
assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState());
OddjobLookup lookup = new OddjobLookup(oddjob);
Describeable test= lookup.lookup("set-system-properties", Describeable.class);
Map<String, String> testDescription = test.describe();
assertEquals("apple", testDescription.get("oddjob.test.favourite.snack"));
Describeable allProps = lookup.lookup("all-properties", Describeable.class);
Map<String, String> description = allProps.describe();
assertEquals("apple [SYSTEM]", description.get("oddjob.test.favourite.snack"));
assertEquals("apple", System.getProperty("oddjob.test.favourite.snack"));
oddjob.destroy();
assertEquals(null, System.getProperty("oddjob.test.favourite.snack"));
}
}