package org.multiverse.stms.gamma.transactionalobjects.orec;
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 static org.multiverse.TestUtils.*;
import static org.multiverse.stms.gamma.GammaTestUtils.*;
public class Orec_arriveAndExclusiveLockTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
// ==================== write biased ===============================
@Test
public void writeBiased_whenNoLockAcquired() {
GammaTxnLong orec = new GammaTxnLong(stm);
int result = orec.arriveAndExclusiveLock(1);
assertHasMasks(result, MASK_SUCCESS);
assertNotHasMasks(result, MASK_CONFLICT, MASK_UNREGISTERED);
assertWriteBiased(orec);
assertSurplus(orec, 1);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void writeBiased_whenSurplusOfReaders() {
GammaTxnLong orec = new GammaTxnLong(stm);
orec.arrive(1);
int result = orec.arriveAndExclusiveLock(1);
assertHasMasks(result, MASK_SUCCESS, MASK_CONFLICT);
assertNotHasMasks(result, MASK_UNREGISTERED);
assertWriteBiased(orec);
assertSurplus(orec, 2);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void writeBiased_whenReadLockAcquiredByOther() {
GammaTxnLong orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_whenWriteLockAcquiredByOther() {
GammaTxnLong orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_whenExclusiveLockAcquiredByOther() {
GammaTxnLong orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
// ==================== read biased ===============================
@Test
public void readBiased_whenNoLockAcquired() {
GammaTxnLong orec = makeReadBiased(new GammaTxnLong(stm));
int result = orec.arriveAndExclusiveLock(1);
assertHasMasks(result, MASK_SUCCESS, MASK_UNREGISTERED);
assertNotHasMasks(result, MASK_CONFLICT);
assertReadBiased(orec);
assertSurplus(orec, 1);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void readBiased_whenSurplusOfReaders() {
GammaTxnLong orec = makeReadBiased(new GammaTxnLong(stm));
orec.arrive(1);
int result = orec.arriveAndExclusiveLock(1);
assertHasMasks(result, MASK_SUCCESS, MASK_CONFLICT, MASK_UNREGISTERED);
assertReadBiased(orec);
assertSurplus(orec, 1);
assertReadonlyCount(orec, 0);
assertLockMode(orec, LOCKMODE_EXCLUSIVE);
}
@Test
public void readBiased_whenReadLockAcquiredByOther() {
GammaTxnLong orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_whenWriteLockAcquiredByOther() {
GammaTxnLong orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_whenExclusiveLockAcquiredByOther() {
GammaTxnLong orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
long orecValue = orec.orec;
int result = orec.arriveAndExclusiveLock(1);
assertFailure(result);
assertOrecValue(orec, orecValue);
}
}