package org.multiverse.stms.gamma.transactions.fat;
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 org.multiverse.stms.gamma.transactionalobjects.Tranlocal;
import org.multiverse.stms.gamma.transactions.GammaTxnConfig;
import static junit.framework.Assert.assertSame;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.multiverse.TestUtils.assertIsActive;
public class FatVariableLengthGammaTxn_openingManyItemsTest implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
@Test
public void whenReadonly() {
whenManyItems(true);
}
@Test
public void whenUpdate() {
whenManyItems(false);
}
public void whenManyItems(boolean reading) {
int refCount = 10000;
GammaTxnConfig config = new GammaTxnConfig(stm)
.setMaximumPoorMansConflictScanLength(refCount);
FatVariableLengthGammaTxn tx = new FatVariableLengthGammaTxn(config);
GammaTxnLong[] refs = new GammaTxnLong[refCount];
Tranlocal[] tranlocals = new Tranlocal[refCount];
for (int k = 0; k < refCount; k++) {
GammaTxnLong ref = new GammaTxnLong(stm);
refs[k] = ref;
tranlocals[k] = reading ? ref.openForRead(tx, LOCKMODE_NONE) : ref.openForWrite(tx, LOCKMODE_NONE);
}
assertEquals(refCount, tx.size());
System.out.println("everything inserted");
System.out.println("usage percentage: " + (100 * tx.getUsage()));
for (int k = 0; k < refCount; k++) {
GammaTxnLong ref = refs[k];
Tranlocal found = reading ? ref.openForRead(tx, LOCKMODE_NONE) : ref.openForWrite(tx, LOCKMODE_NONE);
assertNotNull(found);
assertSame(ref, found.owner);
assertSame("tranlocal is incorrect at " + k, tranlocals[k], found);
}
assertIsActive(tx);
}
}