package org.multiverse.commitbarriers; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.multiverse.TestThread; import org.multiverse.api.Txn; import org.multiverse.api.callables.TxnVoidCallable; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnInteger; import static org.junit.Assert.assertEquals; import static org.multiverse.TestUtils.*; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; import static org.multiverse.api.TxnThreadLocal.getThreadLocalTxn; public class VetoCommitBarrier_integrationTest { private VetoCommitBarrier barrier; private GammaStm stm; @Before public void setUp() { clearThreadLocalTxn(); clearCurrentThreadInterruptedStatus(); stm = new GammaStm(); } @After public void tearDown() { clearCurrentThreadInterruptedStatus(); } @Test public void test() throws InterruptedException { barrier = new VetoCommitBarrier(); GammaTxnInteger ref1 = new GammaTxnInteger(stm); GammaTxnInteger ref2 = new GammaTxnInteger(stm); CommitThread t1 = new CommitThread(1, ref1); CommitThread t2 = new CommitThread(2, ref2); startAll(t1, t2); sleepMs(1000); barrier.atomicVetoCommit(); joinAll(t1, t2); assertEquals(1, ref1.atomicGet()); assertEquals(1, ref2.atomicGet()); } @Test public void testAbort() throws InterruptedException { barrier = new VetoCommitBarrier(); GammaTxnInteger ref1 = new GammaTxnInteger(stm); GammaTxnInteger ref2 = new GammaTxnInteger(stm); CommitThread t1 = new CommitThread(1, ref1); t1.setPrintStackTrace(false); CommitThread t2 = new CommitThread(2, ref2); t2.setPrintStackTrace(false); startAll(t1, t2); sleepMs(500); barrier.abort(); t1.join(); t2.join(); assertEquals(0, ref1.atomicGet()); assertEquals(0, ref2.atomicGet()); } public class CommitThread extends TestThread { private GammaTxnInteger ref; public CommitThread(int id, GammaTxnInteger ref) { super("CommitThread-" + id); this.ref = ref; } @Override public void doRun() throws Exception { stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { ref.getAndIncrement(tx, 1); barrier.joinCommit(getThreadLocalTxn()); } }); } } }