package org.multiverse.stms.gamma;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.Txn;
import org.multiverse.api.TxnExecutor;
import org.multiverse.api.callables.TxnVoidCallable;
import org.multiverse.api.exceptions.InvisibleCheckedException;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import org.multiverse.stms.gamma.transactions.GammaTxn;
import static org.junit.Assert.*;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class GammaTxnExecutor_exceptionsTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
clearThreadLocalTxn();
}
@Test
public void executeChecked_whenCheckedExceptionThrown() {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final Exception ex = new Exception();
try {
executor.executeChecked(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (Exception expected) {
assertSame(ex, expected);
}
assertEquals(10, ref.atomicGet());
}
@Test
public void executeChecked_whenRuntimeExceptionThrown() throws Exception {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final RuntimeException ex = new RuntimeException();
try {
executor.executeChecked(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (RuntimeException expected) {
assertSame(ex, expected);
}
assertEquals(10, ref.atomicGet());
}
@Test
public void executeChecked_whenErrorThrown() throws Exception {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final Error ex = new Error();
try {
executor.executeChecked(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (Error expected) {
assertSame(ex, expected);
}
assertEquals(10, ref.atomicGet());
}
@Test
public void execute_whenCheckedExceptionThrown() {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final Exception ex = new Exception();
try {
executor.execute(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (InvisibleCheckedException expected) {
assertSame(ex, expected.getCause());
}
assertEquals(10, ref.atomicGet());
}
@Test
public void execute_whenRuntimeExceptionThrown() {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final RuntimeException ex = new RuntimeException();
try {
executor.execute(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (RuntimeException expected) {
assertSame(ex, expected);
}
assertEquals(10, ref.atomicGet());
}
@Test
public void execute_whenErrorThrown() {
TxnExecutor executor = stm.newTxnFactoryBuilder().newTxnExecutor();
final GammaTxnLong ref = new GammaTxnLong(stm, 10);
final Error ex = new Error();
try {
executor.execute(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
GammaTxn btx = (GammaTxn) tx;
ref.openForWrite(btx, LOCKMODE_NONE).long_value++;
throw ex;
}
});
fail();
} catch (Error expected) {
assertSame(ex, expected);
}
assertEquals(10, ref.atomicGet());
}
}