package org.oddjob.state; import java.util.Timer; import java.util.TimerTask; import org.oddjob.Stateful; import org.oddjob.jobs.structural.ParallelJob; import org.oddjob.scheduling.DefaultExecutors; import org.oddjob.tools.StateSteps; import org.oddjob.util.OddjobLockedException; import junit.framework.TestCase; public class AsynchJobWaitTest extends TestCase { public void testGivenSimpleJobWhenRunThenNoWait() { AsynchJobWait test = new AsynchJobWait(); FlagState job = new FlagState(); boolean asynchronous = test.runAndWaitWith(job); assertFalse(asynchronous); assertEquals(JobState.COMPLETE, job.lastStateEvent().getState()); } private class SlowToStartJob implements Stateful, Runnable { StateHandler<JobState> states = new StateHandler<JobState>( this, JobState.READY); void fireJobState(final JobState state) { try { states.tryToWhen(new IsAnyState(), new Runnable() { @Override public void run() { states.setState(state); states.fireEvent(); } }); } catch (OddjobLockedException e) { fail(e.getMessage()); } } @Override public void addStateListener(StateListener listener) { states.addStateListener(listener); } @Override public void removeStateListener(StateListener listener) { states.removeStateListener(listener); } @Override public StateEvent lastStateEvent() { throw new RuntimeException("Unexpected"); } @Override public void run() { } } public void testSlowToStartJobBlocks() { AsynchJobWait test = new AsynchJobWait(); final SlowToStartJob job = new SlowToStartJob(); Timer timer = new Timer(); long timeNow = System.currentTimeMillis(); timer.schedule(new TimerTask() { @Override public void run() { job.fireJobState(JobState.EXECUTING); } }, 100); boolean asynchronous = test.runAndWaitWith(job); timer.cancel(); assertEquals(true, System.currentTimeMillis() > timeNow + 99); assertTrue(asynchronous); } public void testGivenParallelJobThenAsync() throws InterruptedException { FlagState job = new FlagState(JobState.COMPLETE); DefaultExecutors defaultServices = new DefaultExecutors(); ParallelJob parallel = new ParallelJob(); StateSteps steps = new StateSteps(parallel); steps.startCheck(ParentState.READY, ParentState.EXECUTING, ParentState.ACTIVE, ParentState.COMPLETE); parallel.setExecutorService(defaultServices.getPoolExecutor()); parallel.setJobs(0, job); AsynchJobWait test = new AsynchJobWait(); boolean asynchronous = test.runAndWaitWith(parallel); assertTrue(asynchronous); steps.checkWait(); defaultServices.stop(); } public void testParallelChildWithJoin() { FlagState job = new FlagState(JobState.COMPLETE); DefaultExecutors defaultServices = new DefaultExecutors(); ParallelJob parallel = new ParallelJob(); StateSteps steps = new StateSteps(parallel); steps.startCheck(ParentState.READY, ParentState.EXECUTING, ParentState.ACTIVE, ParentState.COMPLETE); parallel.setExecutorService(defaultServices.getPoolExecutor()); parallel.setJobs(0, job); AsynchJobWait test = new AsynchJobWait(); test.setJoin(true); boolean asynchronous = test.runAndWaitWith(parallel); assertFalse(asynchronous); steps.checkNow(); defaultServices.stop(); } }