package org.multiverse.commitbarriers;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.stms.gamma.GammaStm;
import static org.junit.Assert.*;
import static org.multiverse.TestUtils.*;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class CountDownCommitBarrier_atomicIncPartiesTest {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
clearThreadLocalTxn();
}
@Test
public void whenNegativeNumber_thenIllegalArgumentException() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(10);
try {
barrier.atomicIncParties(-1);
fail();
} catch (IllegalArgumentException expected) {
}
assertEquals(0, barrier.getNumberWaiting());
assertEquals(10, barrier.getParties());
assertTrue(barrier.isClosed());
}
@Test
public void whenZeroExtraParties() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(5);
barrier.atomicIncParties(0);
assertEquals(5, barrier.getParties());
assertEquals(0, barrier.getNumberWaiting());
assertTrue(barrier.isClosed());
}
@Test
public void whenPositiveNumber() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(10);
barrier.atomicIncParties(5);
assertEquals(0, barrier.getNumberWaiting());
assertEquals(15, barrier.getParties());
assertTrue(barrier.isClosed());
}
@Test
public void whenPartiesAdded_commitTakesLonger() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(2);
barrier.atomicIncParties(1);
barrier.countDown();
barrier.countDown();
assertTrue(barrier.isClosed());
barrier.countDown();
assertTrue(barrier.isCommitted());
assertEquals(0, barrier.getNumberWaiting());
}
@Test
public void whenPendingTransactions() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(3);
JoinCommitThread t1 = new JoinCommitThread(stm, barrier);
JoinCommitThread t2 = new JoinCommitThread(stm, barrier);
startAll(t1, t2);
sleepMs(500);
assertTrue(barrier.isClosed());
barrier.atomicIncParties(1);
sleepMs(500);
assertAlive(t1, t2);
assertTrue(barrier.isClosed());
assertEquals(2, barrier.getNumberWaiting());
assertEquals(4, barrier.getParties());
}
@Test
public void whenAborted_thenCommitBarrierOpenException() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(1);
barrier.abort();
try {
barrier.atomicIncParties(10);
fail();
} catch (CommitBarrierOpenException expected) {
}
assertEquals(1, barrier.getParties());
assertEquals(0, barrier.getNumberWaiting());
assertTrue(barrier.isAborted());
}
@Test
public void whenCommitted_thenCommitBarrierOpenException() {
CountDownCommitBarrier barrier = new CountDownCommitBarrier(0);
try {
barrier.atomicIncParties();
fail();
} catch (CommitBarrierOpenException expected) {
}
assertEquals(0, barrier.getParties());
assertEquals(0, barrier.getNumberWaiting());
assertTrue(barrier.isCommitted());
}
}