package org.multiverse.stms.gamma.integration.blocking;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.TxnExecutor;
import org.multiverse.api.Txn;
import org.multiverse.api.callables.TxnVoidCallable;
import org.multiverse.api.exceptions.RetryNotAllowedException;
import org.multiverse.api.exceptions.RetryNotPossibleException;
import org.multiverse.api.functions.Functions;
import org.multiverse.api.references.TxnLong;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import org.multiverse.stms.gamma.transactions.GammaTxn;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance;
import static org.multiverse.api.StmUtils.*;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class NoBlockingTest {
@Before
public void setUp() {
clearThreadLocalTxn();
}
@Test
public void whenNothingRead_thenNoRetryPossibleException() {
try {
atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
retry();
}
});
fail();
} catch (RetryNotPossibleException expected) {
}
}
@Test
public void whenContainsCommute_thenNoRetryPossibleException() {
final TxnLong ref = newTxnLong();
try {
atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
ref.commute(Functions.incLongFunction());
retry();
}
});
fail();
} catch (RetryNotPossibleException expected) {
}
}
@Test
public void whenContainsConstructing_thenNoRetryPossibleException() {
try {
atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
GammaTxnLong ref = new GammaTxnLong(btx);
retry();
}
});
fail();
} catch (RetryNotPossibleException expected) {
}
}
@Test
public void whenBlockingNotAllowed_thenNoBlockingRetryAllowedException() {
final TxnLong ref = newTxnLong();
TxnExecutor executor = getGlobalStmInstance()
.newTxnFactoryBuilder()
.setBlockingAllowed(false)
.newTxnExecutor();
try {
executor.execute(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
ref.set(1);
retry();
}
});
fail();
} catch (RetryNotAllowedException expected) {
}
assertEquals(0, ref.atomicGet());
}
}