package org.infinispan.api.batch;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import javax.transaction.TransactionManager;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.transaction.TransactionMode;
import org.infinispan.transaction.lookup.EmbeddedTransactionManagerLookup;
import org.infinispan.transaction.tm.EmbeddedBaseTransactionManager;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test(groups = {"functional", "transaction"}, testName = "api.batch.BatchWithCustomTMTest")
public class BatchWithCustomTMTest extends AbstractBatchTest {
private EmbeddedCacheManager cm;
@BeforeClass
public void createCacheManager() {
cm = TestCacheManagerFactory.createCacheManager(false);
}
@AfterClass
public void destroyCacheManager() {
TestingUtil.killCacheManagers(cm);
cm = null;
}
public void testBatchWithOngoingTM() throws Exception {
Cache<String, String> cache =createCache("testBatchWithOngoingTM");
TransactionManager tm = TestingUtil.getTransactionManager(cache);
assertEquals(MyDummyTransactionManager.class, tm.getClass());
tm.begin();
cache.put("k", "v");
cache.startBatch();
cache.put("k2", "v2");
tm.commit();
assertEquals("v", cache.get("k"));
assertEquals("v2", cache.get("k2"));
cache.endBatch(false); // should be a no op
assertEquals("v", cache.get("k"));
assertEquals("v2", cache.get("k2"));
}
public void testBatchWithoutOngoingTMSuspension() throws Exception {
Cache<String, String> cache = createCache("testBatchWithoutOngoingTMSuspension");
TransactionManager tm = TestingUtil.getTransactionManager(cache);
assertEquals(MyDummyTransactionManager.class, tm.getClass());
assertNull("Should have no ongoing txs", tm.getTransaction());
cache.startBatch();
cache.put("k", "v");
assertNull("Should have no ongoing txs", tm.getTransaction());
cache.put("k2", "v2");
assertNull(getOnDifferentThread(cache, "k"));
assertNull(getOnDifferentThread(cache, "k2"));
try {
tm.commit(); // should have no effect
}
catch (Exception e) {
// the TM may barf here ... this is OK.
}
assertNull("Should have no ongoing txs", tm.getTransaction());
assertNull(getOnDifferentThread(cache, "k"));
assertNull(getOnDifferentThread(cache, "k2"));
cache.endBatch(true); // should be a no op
assertEquals("v", getOnDifferentThread(cache, "k"));
assertEquals("v2", getOnDifferentThread(cache, "k2"));
}
public void testBatchRollback() throws Exception {
Cache<String, String> cache = createCache("testBatchRollback");
cache.startBatch();
cache.put("k", "v");
cache.put("k2", "v2");
assertNull(getOnDifferentThread(cache, "k"));
assertNull(getOnDifferentThread(cache, "k2"));
cache.endBatch(false);
assertNull(getOnDifferentThread(cache, "k"));
assertNull(getOnDifferentThread(cache, "k2"));
}
private Cache<String, String> createCache(String name) {
ConfigurationBuilder c = new ConfigurationBuilder();
c.transaction().transactionManagerLookup(new MyDummyTransactionManagerLookup());
c.invocationBatching().enable();
c.transaction().transactionMode(TransactionMode.TRANSACTIONAL);
cm.defineConfiguration(name, c.build());
return cm.getCache(name);
}
static class MyDummyTransactionManagerLookup extends EmbeddedTransactionManagerLookup {
MyDummyTransactionManager tm = new MyDummyTransactionManager();
@Override
public TransactionManager getTransactionManager() throws Exception {
return tm;
}
}
static class MyDummyTransactionManager extends EmbeddedBaseTransactionManager {
}
}