package dmg.util; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.fail; /** * * @author jans */ public class GateTest { private boolean waitedForOpen; private boolean enteredAndSlept; private boolean leftGate; private boolean openedGate; private boolean closedGate; @Before public void setUp() { waitedForOpen = false; enteredAndSlept = false; leftGate = false; openedGate = false; closedGate = false; } @Test public void testGatePassing() { int timesWaited = 0; GateTestHelper gateTester = new GateTestHelper(); gateTester.start(); while (!allStatesReached()) { try { timesWaited++; Thread.sleep(100); } catch (InterruptedException ex) { } if (timesWaited >= 100) { gateTester.stopThreads(); fail("timed out"); } } } private boolean allStatesReached() { return waitedForOpen && enteredAndSlept && leftGate && openedGate && closedGate; } private class GateTestHelper implements Runnable { Thread _ticker1, _ticker2; Gate _gate = new Gate(false); public GateTestHelper() { _ticker1 = new Thread(this); _ticker2 = new Thread(this); } public void start() { _ticker1.start(); _ticker2.start(); } public void stopThreads() { _ticker1.interrupt(); _ticker2.interrupt(); } @Override public void run() { try { if (Thread.currentThread() == _ticker1) { while (true) { Thread.sleep(250); waitedForOpen = true; synchronized (_gate.check()) { enteredAndSlept = true; Thread.sleep(250); leftGate = true; } } } else if (Thread.currentThread() == _ticker2) { while (true) { Thread.sleep(500); _gate.open(); openedGate = true; Thread.sleep(500); _gate.close(); closedGate = true; } } } catch (InterruptedException e) { } } } }