package org.multiverse.stms.gamma.transactionalobjects.refs;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.multiverse.api.LockMode;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import org.multiverse.stms.gamma.transactionalobjects.Tranlocal;
import org.multiverse.stms.gamma.transactions.GammaTxn;
import static org.junit.Assert.*;
public class PrepareTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
@Test
@Ignore
public void whenNormalReadButLockedByOther() {
}
@Test
public void whenNormalRead() {
whenNormalRead(LockMode.None);
whenNormalRead(LockMode.Read);
whenNormalRead(LockMode.Write);
whenNormalRead(LockMode.Exclusive);
}
public void whenNormalRead(LockMode lockMode) {
GammaTxnLong ref = new GammaTxnLong(stm);
GammaTxn tx = stm.newTxnFactoryBuilder()
.setFat()
.newTransactionFactory()
.newTxn();
Tranlocal tranlocal = ref.openForRead(tx, lockMode.asInt());
boolean success = ref.prepare(tx, tranlocal);
assertTrue(success);
assertSame(ref, tranlocal.owner);
assertEquals(lockMode.asInt(), tranlocal.getLockMode());
assertEquals(TRANLOCAL_READ, tranlocal.mode);
assertFalse(tranlocal.isDirty);
assertFalse(tranlocal.writeSkewCheck);
assertNull(tranlocal.headCallable);
}
@Test
public void whenNonDirtyWriteAndDirtyCheckEnabled() {
whenNonDirtyWriteAndDirtyCheckEnabled(LockMode.None);
whenNonDirtyWriteAndDirtyCheckEnabled(LockMode.Read);
whenNonDirtyWriteAndDirtyCheckEnabled(LockMode.Write);
whenNonDirtyWriteAndDirtyCheckEnabled(LockMode.Exclusive);
}
public void whenNonDirtyWriteAndDirtyCheckEnabled(LockMode lockMode) {
GammaTxnLong ref = new GammaTxnLong(stm);
GammaTxn tx = stm.newTxnFactoryBuilder()
.setFat()
.setDirtyCheckEnabled(true)
.newTransactionFactory()
.newTxn();
Tranlocal tranlocal = ref.openForWrite(tx, lockMode.asInt());
boolean success = ref.prepare(tx, tranlocal);
assertTrue(success);
assertSame(ref, tranlocal.owner);
assertEquals(lockMode.asInt(), tranlocal.getLockMode());
assertEquals(TRANLOCAL_WRITE, tranlocal.mode);
assertFalse(tranlocal.isDirty);
assertFalse(tranlocal.writeSkewCheck);
assertNull(tranlocal.headCallable);
}
@Test
public void whenNormalDirtyWriteAndDirtyCheckEnabled() {
whenNormalDirtyWrite(LockMode.None, true);
whenNormalDirtyWrite(LockMode.Read, true);
whenNormalDirtyWrite(LockMode.Write, true);
whenNormalDirtyWrite(LockMode.Exclusive, true);
}
@Test
public void whenNormalDirtyWriteAndDirtyCheckDisabled() {
whenNormalDirtyWrite(LockMode.None, false);
whenNormalDirtyWrite(LockMode.Read, false);
whenNormalDirtyWrite(LockMode.Write, false);
whenNormalDirtyWrite(LockMode.Exclusive, false);
}
public void whenNormalDirtyWrite(LockMode lockMode, boolean dirtyCheck) {
GammaTxnLong ref = new GammaTxnLong(stm);
GammaTxn tx = stm.newTxnFactoryBuilder()
.setFat()
.setDirtyCheckEnabled(dirtyCheck)
.newTransactionFactory()
.newTxn();
Tranlocal tranlocal = ref.openForWrite(tx, lockMode.asInt());
tranlocal.long_value++;
boolean success = ref.prepare(tx, tranlocal);
assertTrue(success);
assertSame(ref, tranlocal.owner);
assertEquals(LOCKMODE_EXCLUSIVE, tranlocal.getLockMode());
assertEquals(TRANLOCAL_WRITE, tranlocal.mode);
assertTrue(tranlocal.isDirty);
assertFalse(tranlocal.writeSkewCheck);
assertNull(tranlocal.headCallable);
}
@Test
public void whenNonDirtyWriteAndDirtyCheckDisabled() {
whenNonDirtyWrite(LockMode.None);
whenNonDirtyWrite(LockMode.Read);
whenNonDirtyWrite(LockMode.Write);
whenNonDirtyWrite(LockMode.Exclusive);
}
public void whenNonDirtyWrite(LockMode lockMode) {
GammaTxnLong ref = new GammaTxnLong(stm);
GammaTxn tx = stm.newTxnFactoryBuilder()
.setFat()
.setDirtyCheckEnabled(false)
.newTransactionFactory()
.newTxn();
Tranlocal tranlocal = ref.openForWrite(tx, lockMode.asInt());
boolean success = ref.prepare(tx, tranlocal);
assertTrue(success);
assertSame(ref, tranlocal.owner);
assertEquals(LOCKMODE_EXCLUSIVE, tranlocal.getLockMode());
assertEquals(TRANLOCAL_WRITE, tranlocal.mode);
assertTrue(tranlocal.isDirty);
assertFalse(tranlocal.writeSkewCheck);
assertNull(tranlocal.headCallable);
}
@Test
@Ignore
public void whenConstructed() {
}
@Test
@Ignore
public void whenCommuting() {
}
}