package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.util.CondVar; import org.jgroups.util.Condition; import org.jgroups.util.Util; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; /** * @author Bela Ban * @since 3.6 */ @Test(groups=Global.FUNCTIONAL,singleThreaded=true) public class CondVarTest { protected CondVar cond; protected volatile boolean done=false; // our condition protected Condition condition=() -> done; @BeforeMethod protected void setup() { cond=new CondVar(); done=false; } public void testWaitFor() { done=true; cond.waitFor(condition); // needs to return immediately } public void testInterruptedWaitFor() { Thread.currentThread().interrupt(); done=true; cond.waitFor(condition); // needs to return immediately assert Thread.currentThread().isInterrupted(); } public void testWaitForWithSignal() { signal(1000, true, true); cond.waitFor(condition); } public void testWaitForWithSignalAndInterrupt() { signal(2000, true, true); interrupt(Thread.currentThread(), 200); cond.waitFor(condition); } public void testTimedWaitForWithNegativeTimeout() { boolean result=cond.waitFor(() -> done, 0, TimeUnit.SECONDS); assert !done && !result; result=cond.waitFor(condition, -1, TimeUnit.SECONDS); assert !done && !result; } public void testTimedWaitFor() { boolean result=cond.waitFor(condition, 1, TimeUnit.SECONDS); assert !done && !result; interrupt(Thread.currentThread(), 100); result=cond.waitFor(condition, 1, TimeUnit.SECONDS); assert !done && !result; signal(1000, true, true); result=cond.waitFor(condition, 5, TimeUnit.SECONDS); assert done && result; done=false; interrupt(Thread.currentThread(), 1); signal(1000, true, false); result=cond.waitFor(condition, 5, TimeUnit.SECONDS); assert result && done && Thread.currentThread().isInterrupted(); } protected void signal(final long after_ms, final boolean flag, boolean signal_all) { new Thread() { public void run() { Util.sleep(after_ms); done=flag; System.out.println("signalling cond-var"); cond.signal(true); } }.start(); } protected void interrupt(final Thread target_thread, final long after_ms) { new Thread() { public void run() { Util.sleep(after_ms); System.out.println("interrupting " + target_thread); target_thread.interrupt(); } }.start(); } }