package org.oddjob.state; import java.util.concurrent.atomic.AtomicBoolean; import junit.framework.TestCase; import org.oddjob.MockStateful; import org.oddjob.util.OddjobLockedException; public class StateSupportLockTest extends TestCase { // private static final Logger logger = Logger.getLogger(StateSupportLockTest.class); class IsLocked implements Runnable { boolean locked; final JobStateHandler state; IsLocked(JobStateHandler state) { this.state = state; } public void run() { try { boolean condition = state.tryToWhen(new IsAnyState(), new Runnable() { public void run() { } }); assertTrue(condition); locked = false; } catch (OddjobLockedException e) { locked = true; } } } public void testAsIfExecuting() throws InterruptedException { final JobStateHandler test = new JobStateHandler(new MockStateful()); final IsLocked check = new IsLocked(test); boolean succeeded = test.waitToWhen(new IsExecutable(), new Runnable() { public void run() { Thread t; t = new Thread(check); t.start(); try { t.join(); } catch (InterruptedException e) { fail("Unexpected"); } assertTrue(check.locked); test.setState(JobState.COMPLETE); test.fireEvent(); } }); assertTrue(succeeded); Thread t = new Thread(check); t.start(); t.join(); assertFalse(check.locked); assertEquals(JobState.COMPLETE, test.getState()); } public void testWaitFor() throws InterruptedException { final JobStateHandler test = new JobStateHandler(new MockStateful()); final IsLocked check = new IsLocked(test); boolean succeeded = test.waitToWhen(new IsExecutable(), new Runnable() { public void run() { Thread t; t = new Thread(check); t.start(); try { t.join(); } catch (InterruptedException e) { fail("Unexpected"); } assertTrue(check.locked); test.setState(JobState.COMPLETE); test.fireEvent(); } }); assertTrue(succeeded); Thread t = new Thread(check); t.start(); t.join(); assertFalse(check.locked); assertEquals(JobState.COMPLETE, test.getState()); } public void testInturruptedFlag() { JobStateHandler test = new JobStateHandler(new MockStateful()); Thread.currentThread().interrupt(); final AtomicBoolean ran = new AtomicBoolean(); test.waitToWhen(new IsAnyState(), new Runnable() { @Override public void run() { ran.set(true); } }); assertTrue(ran.get()); assertTrue(Thread.interrupted()); } // public void testTimeout() throws InterruptedException, BrokenBarrierException { // // String timeout = System.getProperty( // StateHandler.LOCK_TIMEOUT_PROPERTY); // // System.setProperty(StateHandler.LOCK_TIMEOUT_PROPERTY, "100"); // // // final JobStateHandler test = new JobStateHandler(new MockStateful()); // // final CyclicBarrier barrier = new CyclicBarrier(2); // // Thread t = new Thread(new Runnable() { // // @Override // public void run() { // try { // test.tryToWhen(new IsAnyState(), new Runnable() { // // @Override // public void run() { // try { // barrier.await(); // // barrier.reset(); // // barrier.await(); // } catch (InterruptedException e) { // throw new RuntimeException(e); // } catch (BrokenBarrierException e) { // throw new RuntimeException(e); // } // } // }); // } catch (OddjobLockedException e) { // throw new RuntimeException(e); // } // // } // }); // // t.start(); // // barrier.await(); // // try { // test.waitToWhen(new IsAnyState(), new Runnable() { // @Override // public void run() { // fail("Unexpected."); // } // }); // // fail("Should timeout."); // } // catch (OddjobLockTimeoutException e) { // // expected. // logger.info(e.toString()); // } // // barrier.await(); // // t.join(); // // if (timeout != null) { // System.setProperty( // StateHandler.LOCK_TIMEOUT_PROPERTY, timeout); // } // } }