1 4 package org.oddjob.framework; 5 6 import java.io.ByteArrayInputStream ; 7 import java.util.HashMap ; 8 import java.util.Map ; 9 10 import junit.framework.TestCase; 11 12 import org.apache.commons.beanutils.PropertyUtils; 13 import org.apache.log4j.Level; 14 import org.apache.log4j.Logger; 15 import org.oddjob.Helper; 16 import org.oddjob.Oddjob; 17 import org.oddjob.Resetable; 18 import org.oddjob.Stateful; 19 import org.oddjob.arooa.ArooaConstants; 20 import org.oddjob.arooa.ArooaContext; 21 import org.oddjob.arooa.ArooaRuntime; 22 import org.oddjob.arooa.Lifecycle; 23 import org.oddjob.arooa.registry.ComponentRegistry; 24 import org.oddjob.arooa.registry.Path; 25 import org.oddjob.logging.Log4jArchiver; 26 import org.oddjob.logging.LogEnabled; 27 import org.oddjob.logging.LogEvent; 28 import org.oddjob.logging.LogLevel; 29 import org.oddjob.logging.LogListener; 30 import org.oddjob.monitor.model.Describer; 31 import org.oddjob.state.JobState; 32 import org.oddjob.state.JobStateEvent; 33 import org.oddjob.state.JobStateListener; 34 35 39 public class RunnableWrapperTest extends TestCase { 40 41 42 public static class R implements Runnable { 43 boolean ran; 44 public void run() { 45 ran = true; 46 } 47 public boolean isRan() { 48 return ran; 49 } 50 } 51 52 public void testGoodRunnable() { 53 R test = new R(); 54 Object wrapper = RunnableWrapper.wrapperFor(test); 55 56 MyListener l = new MyListener(); 57 ((Stateful) wrapper).addJobStateListener(l); 58 ((Runnable ) wrapper).run(); 59 assertTrue(test.ran); 60 assertEquals("JobState", JobState.COMPLETE, 61 l.lastEvent.getJobState()); 62 63 ((Resetable) wrapper).hardReset(); 64 assertEquals("JobState", JobState.READY, 65 l.lastEvent.getJobState()); 66 67 } 68 69 public void testBadRunnable() { 70 Object wrapper = RunnableWrapper.wrapperFor( 71 new Runnable () { 72 public void run() { 73 throw new RuntimeException ("How bad is this!"); 74 } 75 }); 76 MyListener l = new MyListener(); 77 ((Stateful) wrapper).addJobStateListener(l); 78 ((Runnable ) wrapper).run(); 79 assertEquals("JobState", JobState.EXCEPTION, 80 l.lastEvent.getJobState()); 81 ((Resetable) wrapper).softReset(); 82 assertEquals("JobState", JobState.READY, 83 l.lastEvent.getJobState()); 84 } 85 86 class MyListener implements JobStateListener { 87 JobStateEvent lastEvent; 88 public void jobStateChange(JobStateEvent event) { 89 lastEvent = event; 90 } 91 } 92 93 public void testHashCode() { 94 Object test = RunnableWrapper.wrapperFor(new Runnable () { 95 public void run() {} 96 }); 97 98 HashMap hashMap = new HashMap (); 99 hashMap.put(test, "Hello"); 100 101 String result = (String ) hashMap.get(test); 102 assertEquals("Hello", result); 103 } 104 105 public void testEquals() { 106 Object test = RunnableWrapper.wrapperFor(new Runnable () { 107 public void run() {} 108 }); 109 assertTrue(test.equals(test)); 110 assertEquals(test, test); 111 } 112 113 public static class D implements Runnable { 114 boolean destroyed; 115 public void run() {} 116 public void destroy() { destroyed = true;} 117 } 118 119 public void testDestroy() { 120 D d = new D(); 121 Object test = RunnableWrapper.wrapperFor(d); 122 123 Lifecycle.destroy(test); 124 assertTrue(d.destroyed); 125 } 126 127 public static class I implements Runnable { 128 boolean init; 129 public void run() {} 130 public void init() { init = true;} 131 } 132 133 public void testInit() { 134 I i = new I(); 135 Object test = RunnableWrapper.wrapperFor(i); 136 137 Lifecycle.init(test); 138 assertTrue(i.init); 139 } 140 141 public static class Bean { 142 String greeting; 143 public void setGreeting(String greeting) { 144 this.greeting = greeting; 145 } 146 public String getGreeting() { 147 return greeting; 148 } 149 } 150 151 public static class Job implements Runnable { 152 public String result; 153 public void run() { 154 } 155 public void setResult(String result) { 156 this.result = result; 157 } 158 public String getResult() { 159 return result; 160 } 161 } 162 163 public void testConfiguration() throws Exception { 164 ComponentRegistry cr = new ComponentRegistry(); 165 cr.register("b", new Bean()); 166 167 PropertyUtils.setProperty(cr.objectForPath(new Path("b")), 168 "greeting", "hello"); 169 170 ArooaContext ac = new ArooaContext(); 171 ac.set(ArooaConstants.COMPONENT_REGISTRY, cr); 172 173 Job job = new Job(); 174 ArooaRuntime runtime = new ArooaRuntime(job, "job", ac); 175 ac.set(ArooaConstants.CURRENTLY_CONFIGURING, runtime); 176 runtime.setAttribute("result", "${b.greeting}"); 177 178 Object wrapper = RunnableWrapper.wrapperFor(job); 179 ((ContextAware) wrapper).setContext(ac); 180 181 ((Runnable ) wrapper).run(); 182 183 assertEquals("hello", PropertyUtils.getProperty(wrapper, "result")); 184 185 PropertyUtils.setProperty(cr.objectForPath(new Path("b")), 186 "greeting", "goodbye"); 187 188 ((Resetable) wrapper).hardReset(); 189 ((Runnable ) wrapper).run(); 190 191 assertEquals("goodbye", PropertyUtils.getProperty(wrapper, "result")); 192 } 193 194 public void testInOddjob() throws Exception { 195 String xml = "<oddjob><r class='" + R.class.getName() + "' id='r' /></oddjob>"; 196 Oddjob oj = new Oddjob(); 197 oj.setInput(new ByteArrayInputStream (xml.getBytes())); 198 199 oj.run(); 200 201 Object r = oj.lookup("r"); 202 assertEquals(JobState.COMPLETE, Helper.getJobState(r)); 203 Object ran = PropertyUtils.getProperty(r, "ran"); 204 assertEquals(Boolean .class, ran.getClass()); 205 assertEquals(new Boolean (true), ran); 206 } 207 208 public static class AnyLogger implements Runnable { 209 public void run() { 210 Logger.getLogger("AnyLogger").error("FINDME"); 211 } 212 } 213 214 public void testDefaultLogger() throws Exception { 215 class MyL implements LogListener { 216 StringBuffer messages = new StringBuffer (); 217 public void logEvent(LogEvent logEvent) { 218 messages.append(logEvent.getMessage()); 219 } 220 } 221 222 AnyLogger l = new AnyLogger(); 223 224 Runnable wrapper = RunnableWrapper.wrapperFor(l); 225 226 Logger.getLogger("AnyLogger").setLevel(Level.DEBUG); 227 Logger.getLogger(((LogEnabled) wrapper).getLogger()).setLevel(Level.DEBUG); 228 229 Log4jArchiver archiver = new Log4jArchiver(wrapper, "%m%n"); 230 231 MyL ll = new MyL(); 232 archiver.addLogListener(ll, wrapper, LogLevel.DEBUG, 0, 1000); 233 234 wrapper.run(); 235 236 assertTrue(ll.messages.indexOf("FINDME") > 0); 237 } 238 239 public static class MyLogger implements Runnable { 240 public String getLogger() { 241 return "MyLogger"; 242 } 243 public void run() { 244 Logger.getLogger(getLogger()).error("FINDME"); 245 } 246 } 247 248 public void testSpecificLogger() throws Exception { 249 class MyL implements LogListener { 250 StringBuffer messages = new StringBuffer (); 251 public void logEvent(LogEvent logEvent) { 252 messages.append(logEvent.getMessage()); 253 } 254 } 255 256 MyLogger l = new MyLogger(); 257 258 Runnable wrapper = RunnableWrapper.wrapperFor(l); 259 assertEquals("MyLogger", ((LogEnabled) wrapper).getLogger()); 260 Logger.getLogger(((LogEnabled) wrapper).getLogger()).setLevel(Level.DEBUG); 261 262 Log4jArchiver archiver = new Log4jArchiver(wrapper, "%m%n"); 263 264 MyL ll = new MyL(); 265 archiver.addLogListener(ll, wrapper, LogLevel.DEBUG, 0, 1000); 266 267 wrapper.run(); 268 269 assertTrue(ll.messages.indexOf("FINDME") > 0); 270 } 271 272 public void testDescribe() { 273 Job j = new Job(); 274 j.setResult("Hello"); 275 276 Runnable wrapper = RunnableWrapper.wrapperFor(j); 277 Map m = Describer.describe(wrapper); 278 279 assertEquals("Hello", m.get("result")); 280 } 281 282 } 283 284 | Popular Tags |