package org.multiverse.stms.gamma.transactionalobjects.txnref; import org.junit.Before; import org.junit.Test; import org.multiverse.api.LockMode; import org.multiverse.api.exceptions.LockedException; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnRef; import org.multiverse.stms.gamma.transactions.GammaTxn; import static org.junit.Assert.*; import static org.multiverse.TestUtils.assertOrecValue; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; import static org.multiverse.api.TxnThreadLocal.setThreadLocalTxn; import static org.multiverse.stms.gamma.GammaTestUtils.assertGlobalConflictCount; import static org.multiverse.stms.gamma.GammaTestUtils.assertVersionAndValue; import static org.multiverse.stms.gamma.GammaTestUtils.makeReadBiased; public class GammaTxnRef_atomicIsNullTest { private GammaStm stm; @Before public void setUp() { stm = new GammaStm(); clearThreadLocalTxn(); } // ==================== write biased ======================================== @Test public void writeBiased_whenReadLocked_thenSuccess() { String initialValue = null; GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Read); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void writeBiased_whenWriteLocked_thenSuccess() { String initialValue = null; GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Write); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void writeBiased_whenExclusiveLocked_thenLockedException() { GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, null); long initialVersion = ref.version; GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Exclusive); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); try { ref.atomicIsNull(); fail(); } catch (LockedException expected) { } assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, null); assertGlobalConflictCount(stm, conflictCount); } @Test public void writeBiased_whenNull() { GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, null); long initialVersion = ref.getVersion(); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, null); assertGlobalConflictCount(stm, conflictCount); } @Test public void writeBiased_whenActiveTransactionAvailable_thenIgnored() { String initialValue = "foo"; GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); setThreadLocalTxn(tx); ref.set(tx, null); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertFalse(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void writeBiased_whenNotNull() { String initialValue = "foo"; GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue); long initialVersion = ref.getVersion(); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertFalse(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } // ==================== read biased ======================================== @Test public void readBiased_whenReadLocked_thenSuccess() { String initialValue = null; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Read); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void readBiased_whenWriteLocked_thenSuccess() { String initialValue = null; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Write); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void readBiased_whenExclusiveLocked_thenLockedException() { String initialValue = null; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.version; GammaTxn tx = stm.newDefaultTxn(); ref.getLock().acquire(tx, LockMode.Exclusive); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); try { ref.atomicIsNull(); fail(); } catch (LockedException expected) { } assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, null); assertGlobalConflictCount(stm, conflictCount); } @Test public void readBiased_whenNull() { String initialValue = null; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.getVersion(); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertTrue(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, null); assertGlobalConflictCount(stm, conflictCount); } @Test public void readBiased_whenActiveTransactionAvailable_thenIgnored() { String initialValue = "foo"; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.getVersion(); GammaTxn tx = stm.newDefaultTxn(); setThreadLocalTxn(tx); ref.set(tx, null); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertFalse(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } @Test public void readBiased_whenNotNull() { String initialValue = "foo"; GammaTxnRef<String> ref = makeReadBiased(new GammaTxnRef<String>(stm, initialValue)); long initialVersion = ref.getVersion(); long orecValue = ref.orec; long conflictCount = stm.globalConflictCounter.count(); boolean result = ref.atomicIsNull(); assertFalse(result); assertOrecValue(ref, orecValue); assertVersionAndValue(ref, initialVersion, initialValue); assertGlobalConflictCount(stm, conflictCount); } }