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.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.assertOrecValue;
import static org.multiverse.stms.gamma.GammaTestUtils.*;
public class Orec_departAfterUpdateAndUnlockTest {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
// ================ write biased ===============================
@Test
public void writeBiased_whenNotLockedAndNoSurplus_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_whenNotLockedAndSurplus_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arrive(1);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_whenLockedAndNoAdditionalSurplus() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
orec.departAfterUpdateAndUnlock();
assertLockMode(orec, LOCKMODE_NONE);
assertSurplus(orec, 0);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
}
@Test
public void writeBiased_whenLockedAndAdditionalSurplus() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arrive(1);
orec.arrive(1);
orec.arrive(1);
orec.lockAfterArrive(1, LOCKMODE_EXCLUSIVE);
orec.departAfterUpdateAndUnlock();
assertLockMode(orec, LOCKMODE_NONE);
assertSurplus(orec, 2);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
}
@Test
public void writeBiased_whenWriteLock_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void writeBiased_whenReadLockAcquired_thenPanicError() {
AbstractGammaObject orec = new GammaTxnLong(stm);
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
// ================ read biased ===============================
@Test
public void readBiased_whenNotLockedAndNoSurplus_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_whenNotLockedAndSurplus_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
orec.arrive(1);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_whenLockedAndNoAdditionalSurplus() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
orec.departAfterUpdateAndUnlock();
assertLockMode(orec, LOCKMODE_NONE);
assertSurplus(orec, 0);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
}
@Test
public void readBiased_whenLockedAndAdditionalSurplus() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_EXCLUSIVE);
orec.departAfterUpdateAndUnlock();
assertLockMode(orec, LOCKMODE_NONE);
assertSurplus(orec, 0);
assertWriteBiased(orec);
assertReadonlyCount(orec, 0);
}
@Test
public void readBiased_whenWriteLock_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_WRITE);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
@Test
public void readBiased_whenReadLockAcquired_thenPanicError() {
AbstractGammaObject orec = makeReadBiased(new GammaTxnLong(stm));
orec.arriveAndLock(1, LOCKMODE_READ);
long orecValue = orec.orec;
try {
orec.departAfterUpdateAndUnlock();
fail();
} catch (PanicError expected) {
}
assertOrecValue(orec, orecValue);
}
}