package org.multiverse.stms.gamma.transactionalobjects.txnref; import org.junit.Before; import org.junit.Test; import org.multiverse.api.exceptions.SpeculativeConfigurationError; import org.multiverse.stms.gamma.GammaConstants; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.GammaTestUtils; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnRef; import org.multiverse.stms.gamma.transactions.fat.FatFixedLengthGammaTxn; import org.multiverse.stms.gamma.transactions.fat.FatMonoGammaTxn; import org.multiverse.stms.gamma.transactions.lean.LeanFixedLengthGammaTxn; import org.multiverse.stms.gamma.transactions.lean.LeanMonoGammaTxn; import static org.junit.Assert.*; import static org.multiverse.TestUtils.assertIsAborted; import static org.multiverse.TestUtils.assertIsActive; import static org.multiverse.stms.gamma.GammaTestUtils.*; public class GammaTxnRef_constructionTest { private GammaStm stm; @Before public void setUp() { stm = new GammaStm(); } @Test public void whenInitialValueUsed() { String initialValue = "foo"; GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, initialValue); GammaTestUtils.assertVersionAndValue(ref, GammaConstants.VERSION_UNCOMMITTED + 1, initialValue); assertRefHasNoLocks(ref); assertReadonlyCount(ref, 0); assertSurplus(ref, 0); } @Test public void whenDefaultValueUsed() { GammaTxnRef<String> ref = new GammaTxnRef<String>(stm); assertVersionAndValue(ref, GammaConstants.VERSION_UNCOMMITTED + 1, null); assertRefHasNoLocks(ref); assertReadonlyCount(ref, 0); assertSurplus(ref, 0); } @Test public void withTransaction_whenFatMonoGammaTxnUsed() { FatMonoGammaTxn tx = new FatMonoGammaTxn(stm); GammaTxnRef ref = new GammaTxnRef(tx, 10); assertIsActive(tx); assertRefHasExclusiveLock(ref, tx); assertTrue(tx.hasWrites); assertFalse(tx.config.speculativeConfiguration.get().constructedObjectsDetected); } @Test public void withTransaction_whenFatFixedLengthGammaTxnUsed() { FatFixedLengthGammaTxn tx = new FatFixedLengthGammaTxn(stm); GammaTxnRef ref = new GammaTxnRef(tx, 10); assertIsActive(tx); assertRefHasExclusiveLock(ref, tx); assertTrue(tx.hasWrites); assertFalse(tx.config.speculativeConfiguration.get().constructedObjectsDetected); } @Test public void withTransaction_whenFatVariableLengthGammaTxnUsed() { FatFixedLengthGammaTxn tx = new FatFixedLengthGammaTxn(stm); GammaTxnRef ref = new GammaTxnRef(tx, 10); assertIsActive(tx); assertRefHasExclusiveLock(ref, tx); assertTrue(tx.hasWrites); assertFalse(tx.config.speculativeConfiguration.get().constructedObjectsDetected); } @Test public void withTransaction_whenLeanFixedLengthGammaTxnUsed() { LeanFixedLengthGammaTxn tx = new LeanFixedLengthGammaTxn(stm); try { new GammaTxnRef(tx, 10); fail(); } catch (SpeculativeConfigurationError expected) { } assertIsAborted(tx); assertTrue(tx.config.speculativeConfiguration.get().constructedObjectsDetected); } @Test public void withTransaction_whenLeanMonoGammaTxnUsed() { LeanMonoGammaTxn tx = new LeanMonoGammaTxn(stm); try { new GammaTxnRef(tx, 10); fail(); } catch (SpeculativeConfigurationError expected) { } assertIsAborted(tx); assertTrue(tx.config.speculativeConfiguration.get().constructedObjectsDetected); } }