package org.multiverse.stms.gamma.transactionalobjects.orec;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.exceptions.PanicError;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.transactionalobjects.AbstractGammaObject;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import static org.junit.Assert.fail;
import static org.multiverse.TestUtils.*;
import static org.multiverse.stms.gamma.GammaTestUtils.*;
public class Orec_lockAfterArriveTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
// ===================== write biased and acquire readlock =========================
@Test
public void writeBiased_acquireReadLock_whenNoSurplus_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_READ);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireReadLock_whenUnlocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 1);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertReadLockCount(orec, 1);
}
@Test
public void writeBiased_acquireReadLock_whenUnlockedAndConflictingReaders() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 2);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertReadLockCount(orec, 1);
}
@Test
public void writeBiased_acquireReadLock_whenWriteLocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireReadLock_whenExclusiveLocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireReadLock_whenReadLockAcquiredOnceByOther() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_READ);
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 2);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertReadLockCount(orec, 2);
}
@Test
public void writeBiased_acquireReadLock_whenReadLockAcquiredMoreThanOnceByOthers() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_READ);
orec.arriveAndLock(1, LOCKMODE_READ);
int result = orec.lockAfterArrive(1, LOCKMODE_READ);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 3);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertReadLockCount(orec, 3);
}
// ===================== write biased and acquire writelock =========================
@Test
public void writeBiased_acquireWriteLock_whenUnlocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_WRITE);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 1);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_WRITE);
}
@Test
public void writeBiased_acquireWriteLock_whenUnlockedButConflictingReaders() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_WRITE);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 2);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_WRITE);
}
@Test
public void writeBiased_acquireWriteLock_whenNoSurplus_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_WRITE);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireWriteLock_whenWriteLocked_thenFailure() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_WRITE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireWriteLock_whenExclusiveLocked_thenFailure() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_WRITE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireWriteLock_whenReadLocken_thenFailure() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_WRITE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
// ===================== write biased and acquire exclusivelock =========================
@Test
public void writeBiased_acquireExclusiveLock_whenUnlocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertSurplus(orec, 1);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void writeBiased_acquireExclusiveLock_whenUnlockedAndConflictingReaders() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arrive(1);
int result = orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
assertHasMasks(result, MASK_SUCCESS, MASK_CONFLICT);
assertNotHasMasks(result, MASK_UNREGISTERED);
assertSurplus(orec, 2);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void writeeBiased_acquireExclusiveLock_whenNoSurplus_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireExclusiveLock_whenReadLocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireExclusiveLock_whenWriteLocked_thenFailure() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_WRITE);
orec.arrive(1);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_acquireExclusiveLock_whenExclusiveLocked() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
long orecValue = orec.orec;
int result = orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
// ====================================================================
@Test
public void readBiased_acquireExclusiveLock_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_acquireWriteLock_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_WRITE);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_acquireReadLock_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
long orecValue = orec.orec;
try {
orec.lockAfterArrive(1, LOCKMODE_READ);
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
}