package org.infinispan.tx.locking;
import static org.testng.Assert.assertNull;
import java.util.Collections;
import java.util.Map;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.transaction.tm.EmbeddedTransactionManager;
import org.testng.annotations.Test;
/**
* @author Mircea Markus
* @since 5.1
*/
@Test(groups = "functional")
public abstract class AbstractClusteredTxTest extends MultipleCacheManagersTest {
Object k;
public void testPut() throws Exception {
tm(0).begin();
cache(0).put(k, "v");
assertLocking();
}
public void testRemove() throws Exception {
tm(0).begin();
cache(0).remove(k);
assertLocking();
}
public void testReplace() throws Exception {
tm(0).begin();
cache(0).replace(k, "v1");
assertLockingNoChanges();
// if the key doesn't exist, replace is a no-op, so it shouldn't acquire locks
cache(0).put(k, "v1");
tm(0).begin();
cache(0).replace(k, "v2");
assertLocking();
}
public void testPutAll() throws Exception {
Map m = Collections.singletonMap(k, "v");
tm(0).begin();
cache(0).putAll(m);
assertLocking();
}
public void testRollbackOnPrimaryOwner() throws Exception {
testRollback(0);
}
public void testRollbackOnBackupOwner() throws Exception {
testRollback(1);
}
private void testRollback(int executeOn) throws Exception {
tm(executeOn).begin();
cache(executeOn).put(k, "v");
assertLockingOnRollback();
assertNoTransactions();
assertNull(cache(0).get(k));
assertNull(cache(1).get(k));
}
protected void commit() {
EmbeddedTransactionManager dtm = (EmbeddedTransactionManager) tm(0);
try {
dtm.getTransaction().runCommit(false);
} catch (HeuristicMixedException | HeuristicRollbackException | RollbackException e) {
throw new RuntimeException(e);
}
}
protected void prepare() {
EmbeddedTransactionManager dtm = (EmbeddedTransactionManager) tm(0);
dtm.getTransaction().runPrepare();
}
protected void rollback() {
EmbeddedTransactionManager dtm = (EmbeddedTransactionManager) tm(0);
try {
dtm.getTransaction().rollback();
} catch (SystemException e) {
throw new RuntimeException(e);
}
}
protected abstract void assertLocking();
protected abstract void assertLockingNoChanges();
protected abstract void assertLockingOnRollback();
}