/*
* (c) Rob Gordon 2005
*/
package org.oddjob.webapp.model;
import java.util.List;
import junit.framework.TestCase;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.oddjob.Iconic;
import org.oddjob.Oddjob;
import org.oddjob.OurDirs;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.images.IconEvent;
import org.oddjob.images.IconHelper;
import org.oddjob.images.IconListener;
import org.oddjob.images.IconTip;
import org.oddjob.jobs.structural.JobFolder;
import org.oddjob.logging.LogEnabled;
import org.oddjob.logging.LogEvent;
import org.oddjob.logging.LogHelper;
import org.oddjob.logging.log4j.Log4jArchiver;
import org.oddjob.monitor.context.ExplorerContext;
import org.oddjob.monitor.model.LogContextInialiser;
import org.oddjob.monitor.model.MockExplorerContext;
import org.oddjob.state.ParentState;
import org.oddjob.util.SimpleThreadManager;
import org.oddjob.util.ThreadManager;
public class JobInfoLookupTest extends TestCase {
private static final Logger logger = Logger.getLogger(JobInfoLookupTest.class);
public IconRegistry ir = new IconRegistry();
public void testGetRootRefId() {
Object root = new Object();
JobInfoLookup test = new JobInfoLookup(ir);
test.setRoot(root, null);
// note: we can't test for zero here because when running tests
// in a shared jvm other test will have already incremented the
// refid.
assertNotNull(test.getRootRefId());
}
public void testIcon() {
Iconic root = new Iconic() {
public void addIconListener(IconListener listener) {
IconEvent e = new IconEvent(this, "foo");
listener.iconEvent(e);
}
public IconTip iconForId(String id) {
return IconHelper.completeIcon;
}
public void removeIconListener(IconListener listener) {
}
};
JobInfoLookup lookup = new JobInfoLookup(ir);
lookup.setRoot(root, null);
NodeInfo ni = lookup.nodeInfoFor(lookup.getRootRefId());
assertEquals("foo", ni.getIconId());
assertNotNull(ir.retrieve("foo"));
}
public void testNoChildren() {
String xml = "<oddjob/>";
Oddjob oj = new Oddjob();
oj.setConfiguration(new XMLConfiguration("XML", xml));
oj.run();
JobInfoLookup lookup = new JobInfoLookup(ir);
lookup.setRoot(oj, null);
NodeInfo ni = lookup.nodeInfoFor(lookup.getRootRefId());
assertFalse(ni.getHasChildren());
assertEquals(0, ni.getChildRefIds().length);
}
class OurExplorerContext extends MockExplorerContext {
Object component;
ThreadManager threadManager;
@Override
public ThreadManager getThreadManager() {
return threadManager;
}
@Override
public Object getThisComponent() {
return component;
}
@Override
public ExplorerContext addChild(Object child) {
return this;
}
}
/**
* Test that children are added and removed correctly in the
* lookup.
*
*/
public void testChildren() {
String xml =
"<oddjob>" +
" <job>" +
" <echo>Hello World</echo>" +
" </job>" +
"</oddjob>";
Oddjob oj = new Oddjob();
oj.setConfiguration(new XMLConfiguration("XML", xml));
oj.run();
JobInfoLookup lookup = new JobInfoLookup(ir);
OurExplorerContext explorerContext = new OurExplorerContext();
explorerContext.component = oj;
lookup.setRoot(oj, explorerContext);
NodeInfo ni = lookup.nodeInfoFor(lookup.getRootRefId());
assertTrue(ni.getHasChildren());
assertEquals(1, ni.getChildRefIds().length);
String childRef = ni.getChildRefIds()[0];
oj.hardReset();
ni = lookup.nodeInfoFor(lookup.getRootRefId());
assertEquals(0, ni.getChildRefIds().length);
try {
lookup.nodeInfoFor(childRef);
fail("childRef should not exist.");
} catch (IllegalStateException e) {
// past
}
}
/**
* Test several children - trying to track down a bug where
* the first child is repeated.
*
*/
public void testManyChildren() {
JobFolder f1 = new JobFolder();
f1.setName("F1");
JobFolder f2 = new JobFolder();
f2.setName("F2");
JobFolder f3 = new JobFolder();
f3.setName("F3");
f1.setJobs(0, f2);
f2.setJobs(0, f3);
JobInfoLookup lookup = new JobInfoLookup(ir);
OurExplorerContext explorerContext = new OurExplorerContext();
explorerContext.component = f1;
lookup.setRoot(f1, explorerContext);
String r1 = lookup.getRootRefId();
String r2 = lookup.nodeInfoFor(r1).getChildRefIds()[0];
String r3 = lookup.nodeInfoFor(r2).getChildRefIds()[0];
NodeInfo ni = lookup.nodeInfoFor(r3);
assertEquals("F3", ni.getNodeName());
}
public static class Loggable implements LogEnabled {
private Logger logger = Logger.getLogger("foo");
public String loggerName() {
return "foo";
}
void logSomething() {
logger.setLevel(Level.DEBUG);
logger.debug("Test");
}
}
public void testLogging() {
Loggable l = new Loggable();
assertEquals("foo", LogHelper.getLogger(l));
JobInfoLookup lookup = new JobInfoLookup(ir);
// lookup.setLogFormat("%m");
final Log4jArchiver archiver = new Log4jArchiver(l,"%m");
OurExplorerContext explorerContext = new OurExplorerContext() {
@Override
public Object getValue(String key) {
assertEquals(LogContextInialiser.LOG_ARCHIVER, key);
return archiver;
};
};
explorerContext.component = l;
lookup.setRoot(l, explorerContext);
l.logSomething();
List<LogEvent> events =
lookup.logEventsFor(lookup.getRootRefId());
assertEquals(1, events.size());
LogEvent event = events.get(0);
assertEquals("Test", event.getMessage());
archiver.onDestroy();
}
public void testCommands() throws Exception {
SimpleThreadManager tm = new SimpleThreadManager();
JobInfoLookup test = new JobInfoLookup(ir);
Oddjob oj = new Oddjob();
oj.setFile(new OurDirs().relative("test/config/oddjob-test.xml"));
OurExplorerContext explorerContext = new OurExplorerContext();
explorerContext.component = oj;
explorerContext.threadManager = tm;
test.setRoot(oj, explorerContext);
WebJobActions actions = test.actionsFor(test.getRootRefId());
assertTrue(actions.commands().contains("Run"));
assertTrue(actions.isEnabled("Run"));
actions.action("Run");
while (tm.activeDescriptions().length > 0) {
logger.debug("Waiting for ThreadManager.");
Thread.sleep(500);
}
assertEquals(ParentState.COMPLETE, oj.lastStateEvent().getState());
assertTrue(actions.commands().contains("Hard Reset"));
assertTrue(actions.isEnabled("Hard Reset"));
actions.action("Hard Reset");
while (tm.activeDescriptions().length > 0) {
logger.debug("Waiting for ThreadManager.");
Thread.sleep(500);
}
assertEquals(ParentState.READY, oj.lastStateEvent().getState());
actions.action("Run");
while (tm.activeDescriptions().length > 0) {
logger.debug("Waiting for ThreadManager.");
Thread.sleep(500);
}
assertEquals(ParentState.COMPLETE, oj.lastStateEvent().getState());
}
}