package org.multiverse.commitbarriers;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.stms.gamma.GammaStm;
import static org.junit.Assert.assertTrue;
import static org.multiverse.TestUtils.*;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class CountDownCommitBarrier_countDownTest {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
clearThreadLocalTxn();
}
@Test
public void whenLastOne_thenBarrierOpened() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(3);
JoinCommitThread t1 = new JoinCommitThread(stm, barrier);
JoinCommitThread t2 = new JoinCommitThread(stm, barrier);
startAll(t1, t2);
sleepMs(500);
assertAlive(t1, t2);
assertTrue(barrier.isClosed());
barrier.countDown();
assertTrue(barrier.isCommitted());
joinAll(t1, t2);
assertNothingThrown(t1,t2);
}
@Test
public void whenNotLastOne() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(4);
JoinCommitThread t1 = new JoinCommitThread(stm, barrier);
JoinCommitThread t2 = new JoinCommitThread(stm, barrier);
startAll(t1, t2);
sleepMs(500);
assertAlive(t1, t2);
assertTrue(barrier.isClosed());
barrier.countDown();
assertTrue(barrier.isClosed());
sleepMs(500);
assertAlive(t1, t2);
}
@Test
public void whenAborted_thenIgnored() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(1);
barrier.abort();
barrier.countDown();
assertTrue(barrier.isAborted());
}
@Test
public void whenCommitted_thenIgnored() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(0);
barrier.countDown();
assertTrue(barrier.isCommitted());
}
}