package org.multiverse.commitbarriers; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.multiverse.api.Txn; import org.multiverse.api.exceptions.DeadTxnException; import org.multiverse.stms.gamma.GammaStm; import static org.junit.Assert.*; import static org.multiverse.TestUtils.assertIsAborted; import static org.multiverse.TestUtils.clearCurrentThreadInterruptedStatus; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; public class CountDownCommitBarrier_tryJoinCommitTest { private GammaStm stm; @Before public void setUp() { stm = new GammaStm(); clearThreadLocalTxn(); clearCurrentThreadInterruptedStatus(); } @After public void tearDown() { clearCurrentThreadInterruptedStatus(); } @Test public void whenOpenAndNullTransaction_thenNullPointerException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); try { barrier.tryJoinCommit(null); fail("Expecting NullPointerException"); } catch (NullPointerException expected) { } assertTrue(barrier.isClosed()); assertEquals(0, barrier.getNumberWaiting()); } @Test public void whenOpenAndTransactionCommitted_thenDeadTxnException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); Txn tx = stm.newDefaultTxn(); tx.commit(); try { barrier.tryJoinCommit(tx); fail(); } catch (DeadTxnException ex) { } assertTrue(barrier.isClosed()); assertEquals(0, barrier.getNumberWaiting()); } @Test public void whenOpenAndTransactionAborted_DeadTxnException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); Txn tx = stm.newDefaultTxn(); tx.abort(); try { barrier.tryJoinCommit(tx); fail(); } catch (DeadTxnException ex) { } assertTrue(barrier.isClosed()); assertEquals(0, barrier.getNumberWaiting()); } @Test public void whenAborted_thenCommitBarrierOpenException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); barrier.abort(); Txn tx = stm.newDefaultTxn(); try { barrier.tryJoinCommit(tx); fail("Expecting CommitBarrierOpenException"); } catch (CommitBarrierOpenException expected) { } assertTrue(barrier.isAborted()); assertEquals(0, barrier.getNumberWaiting()); assertIsAborted(tx); } @Test public void whenCommitted_thenCommitBarrierOpenException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(0); Txn tx = stm.newDefaultTxn(); try { barrier.tryJoinCommit(tx); fail("Expected CommitBarrierOpenException"); } catch (CommitBarrierOpenException expected) { } assertTrue(barrier.isCommitted()); assertEquals(0, barrier.getNumberWaiting()); assertIsAborted(tx); } }