package org.multiverse.stms.gamma;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.IsolationLevel;
import org.multiverse.api.LockMode;
import org.multiverse.stms.gamma.transactions.GammaTxnFactoryBuilder;
import static org.junit.Assert.fail;
public class GammaStm_txnFactoryValidationTest {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
@Test
public void whenBlockingEnabled_thenAutomaticReadTrackingShouldBeEnabled() {
GammaTxnFactoryBuilder builder = stm.newTxnFactoryBuilder()
.setReadTrackingEnabled(false)
.setBlockingAllowed(true);
try {
builder.newTransactionFactory();
fail();
} catch (IllegalStateException expected) {
}
}
@Test
public void whenWriteSkewAllowed_thenAutomaticReadTrackingShouldBeEnabled() {
GammaTxnFactoryBuilder builder = stm.newTxnFactoryBuilder()
.setReadonly(false)
.setReadTrackingEnabled(false)
.setIsolationLevel(IsolationLevel.Serializable);
try {
builder.newTransactionFactory();
fail();
} catch (IllegalStateException expected) {
}
}
@Test
public void whenWriteSkewAllowedAndReadonly_thenThenAutomaticReadTrackingDoesntMatter() {
whenWriteSkewAllowedAndReadonly(true);
whenWriteSkewAllowedAndReadonly(false);
}
private void whenWriteSkewAllowedAndReadonly(boolean readTrackingEnabled) {
GammaTxnFactoryBuilder builder = stm.newTxnFactoryBuilder()
.setBlockingAllowed(false)
.setReadonly(true)
.setReadTrackingEnabled(readTrackingEnabled)
.setIsolationLevel(IsolationLevel.Serializable);
builder.newTransactionFactory();
}
@Test
public void whenLockLevelIsRead_thenAutomaticReadTrackingShouldBeEnabled() {
GammaTxnFactoryBuilder builder = stm.newTxnFactoryBuilder()
.setReadTrackingEnabled(false)
.setReadLockMode(LockMode.Read);
try {
builder.newTransactionFactory();
fail();
} catch (IllegalStateException expected) {
}
}
}