package org.multiverse.stms.gamma.transactionalobjects.refs;
import org.junit.Before;
import org.junit.Test;
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.GammaTxnRef;
import org.multiverse.stms.gamma.transactionalobjects.Tranlocal;
import org.multiverse.stms.gamma.transactions.GammaTxn;
import static org.junit.Assert.*;
import static org.multiverse.stms.gamma.GammaTestUtils.assertRefHasNoLocks;
import static org.multiverse.stms.gamma.GammaTestUtils.makeReadBiased;
import static org.multiverse.stms.gamma.GammaTestUtils.newArrivingTransaction;
public class ReleaseAfterUpdateTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
@Test
public void writeBiased_whenNormalRef() {
String initialValue = "initialValue";
GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue);
GammaTxn tx = newArrivingTransaction(stm);
Tranlocal tranlocal = ref.openForWrite(tx, LOCKMODE_EXCLUSIVE);
tranlocal.isDirty = true;
ref.releaseAfterUpdate(tranlocal, tx.pool);
assertNull(tranlocal.owner);
assertEquals(LOCKMODE_NONE, tranlocal.getLockMode());
assertNull(tranlocal.ref_value);
assertNull(tranlocal.ref_oldValue);
assertFalse(tranlocal.hasDepartObligation());
assertRefHasNoLocks(ref);
}
@Test
public void writeBiased_whenLongRef() {
GammaTxnLong ref = new GammaTxnLong(stm, 0);
GammaTxn tx = newArrivingTransaction(stm);
Tranlocal tranlocal = ref.openForWrite(tx, LOCKMODE_EXCLUSIVE);
tranlocal.isDirty = true;
ref.releaseAfterUpdate(tranlocal, tx.pool);
assertNull(tranlocal.owner);
assertEquals(LOCKMODE_NONE, tranlocal.getLockMode());
assertFalse(tranlocal.hasDepartObligation());
assertRefHasNoLocks(ref);
}
@Test
public void readBiased_whenNormalRef() {
String initialValue = "initialValue";
GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue));
GammaTxn tx = newArrivingTransaction(stm);
Tranlocal tranlocal = ref.openForWrite(tx, LOCKMODE_EXCLUSIVE);
tranlocal.isDirty = true;
ref.releaseAfterUpdate(tranlocal, tx.pool);
assertNull(tranlocal.owner);
assertEquals(LOCKMODE_NONE, tranlocal.getLockMode());
assertNull(tranlocal.ref_value);
assertNull(tranlocal.ref_oldValue);
assertFalse(tranlocal.hasDepartObligation());
assertRefHasNoLocks(ref);
}
@Test
public void readBiased_whenLongRef() {
GammaTxnLong ref = makeReadBiased(new GammaTxnLong(stm, 0));
GammaTxn tx = newArrivingTransaction(stm);
Tranlocal tranlocal = ref.openForWrite(tx, LOCKMODE_EXCLUSIVE);
tranlocal.isDirty = true;
ref.releaseAfterUpdate(tranlocal, tx.pool);
assertNull(tranlocal.owner);
assertEquals(LOCKMODE_NONE, tranlocal.getLockMode());
assertFalse(tranlocal.hasDepartObligation());
assertRefHasNoLocks(ref);
}
}