package org.multiverse.stms.gamma.integration.blocking; import org.junit.Before; import org.junit.Test; import org.multiverse.TestThread; import org.multiverse.api.TxnExecutor; import org.multiverse.api.Txn; import org.multiverse.api.callables.TxnVoidCallable; import org.multiverse.api.exceptions.RetryTimeoutException; import org.multiverse.api.references.TxnInteger; import java.util.concurrent.TimeUnit; import static org.multiverse.TestUtils.assertNothingThrown; import static org.multiverse.TestUtils.sleepMs; import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance; import static org.multiverse.api.StmUtils.newTxnInteger; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; public class TimeoutTestLongTest { @Before public void setUp() { clearThreadLocalTxn(); } @Test public void whenNoRetryNeeded() throws InterruptedException { TxnInteger ref = newTxnInteger(1); WaitAndTimeoutThread thread = new WaitAndTimeoutThread(ref); thread.start(); thread.join(); assertNothingThrown(thread); } @Test public void whenTimeout() throws InterruptedException { TxnInteger ref = newTxnInteger(); WaitAndTimeoutThread thread = new WaitAndTimeoutThread(ref); thread.setPrintStackTrace(false); thread.start(); sleepMs(1000); thread.join(); thread.assertFailedWithException(RetryTimeoutException.class); } @Test public void whenValueUpdatedInTime() throws InterruptedException { TxnInteger ref = newTxnInteger(); WaitAndTimeoutThread thread = new WaitAndTimeoutThread(ref); thread.start(); sleepMs(1000); ref.atomicSet(1); thread.join(); thread.assertNothingThrown(); } class WaitAndTimeoutThread extends TestThread { private final TxnInteger ref; WaitAndTimeoutThread(TxnInteger ref) { super("WaitAndTimeoutThread"); this.ref = ref; } @Override public void doRun() throws Exception { TxnExecutor executor = getGlobalStmInstance() .newTxnFactoryBuilder() .setTimeoutNs(TimeUnit.SECONDS.toNanos(5)) .newTxnExecutor(); executor.execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { ref.await(1); } }); } } }