package org.infinispan.tx; import static org.jgroups.util.Util.assertFalse; import static org.jgroups.util.Util.assertTrue; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.fail; import java.util.Collection; import java.util.Map; import java.util.Set; import javax.transaction.Transaction; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.annotations.Test; /** * This test is to ensure that values in the context are properly counted for various cache operations * * @author wburns * @since 6.0 */ @Test (groups = "functional", testName = "tx.ContextAffectsTransactionReadCommittedTest") public class ContextAffectsTransactionReadCommittedTest extends SingleCacheManagerTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder builder = getDefaultStandaloneCacheConfig(true); configure(builder); return TestCacheManagerFactory.createCacheManager(builder); } protected void configure(ConfigurationBuilder builder) { builder.locking().isolationLevel(IsolationLevel.READ_COMMITTED); } public void testSizeAfterClearInBranchedTransaction() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.get(1)); //clear is non transactional cache.clear(); assertEquals(1, cache.size()); assertEquals("v1", cache.get(1)); safeCommit(false); } public void testEntrySetAfterClearInBranchedTransaction() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.get(1)); //clear is non transactional cache.clear(); Set<Map.Entry<Object, Object>> entrySet = cache.entrySet(); assertEquals(1, entrySet.size()); Map.Entry<Object, Object> entry = entrySet.iterator().next(); assertEquals(1, entry.getKey()); assertEquals("v1", entry.getValue()); assertTrue(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(1, "v1"))); safeCommit(false); } public void testKeySetAfterClearInBranchedTransaction() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.get(1)); //clear is non transactional cache.clear(); Set<Object> keySet = cache.keySet(); assertEquals(1, keySet.size()); assertTrue(keySet.contains(1)); safeCommit(false); } public void testValuesAfterClearInBranchedTransaction() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.get(1)); //clear is non transactional cache.clear(); Collection<Object> values = cache.values(); assertEquals(1, values.size()); assertTrue(values.contains("v1")); safeCommit(false); } public void testSizeAfterClearInBranchedTransactionOnWrite() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.put(1, "v2")); //clear is non transactional cache.clear(); assertEquals(1, cache.size()); assertEquals("v2", cache.get(1)); safeCommit(true); } public void testEntrySetAfterClearInBranchedTransactionOnWrite() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.put(1, "v2")); //clear is non transactional cache.clear(); Set<Map.Entry<Object, Object>> entrySet = cache.entrySet(); assertEquals(1, entrySet.size()); Map.Entry<Object, Object> entry = entrySet.iterator().next(); assertEquals(1, entry.getKey()); assertEquals("v2", entry.getValue()); assertTrue(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(1, "v2"))); safeCommit(true); } public void testKeySetAfterClearInBranchedTransactionOnWrite() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.put(1, "v2")); //clear is non transactional cache.clear(); Set<Object> keySet = cache.keySet(); assertEquals(1, keySet.size()); assertTrue(keySet.contains(1)); safeCommit(true); } public void testValuesAfterClearInBranchedTransactionOnWrite() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.put(1, "v2")); //clear is non transactional cache.clear(); Collection<Object> values = cache.values(); assertEquals(1, values.size()); assertTrue(values.contains("v2")); safeCommit(true); } public void testSizeAfterRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.get(1)); Transaction suspended = tm().suspend(); cache.remove(1); tm().resume(suspended); assertEquals(2, cache.size()); assertEquals("v1", cache.get(1)); assertEquals("v2", cache.get(2)); safeCommit(false); } public void testEntrySetAfterRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.get(1)); Transaction suspended = tm().suspend(); cache.remove(1); tm().resume(suspended); Set<Map.Entry<Object, Object>> entrySet = cache.entrySet(); assertEquals(2, entrySet.size()); for (Map.Entry<Object, Object> entry : entrySet) { Object key = entry.getKey(); Object value = entry.getValue(); if (entry.getKey().equals(1)) { assertEquals("v1", value); } else if (key.equals(2)) { assertEquals("v2", value); } else { fail("Unexpected entry found: " + entry); } } assertTrue(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(1, "v1"))); assertTrue(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(2, "v2"))); safeCommit(false); } public void testKeySetAfterRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.get(1)); Transaction suspended = tm().suspend(); cache.remove(1); tm().resume(suspended); Set<Object> keySet = cache.keySet(); assertEquals(2, keySet.size()); assertTrue(keySet.contains(1)); assertTrue(keySet.contains(2)); safeCommit(false); } public void testValuesAfterRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.get(1)); Transaction suspended = tm().suspend(); cache.remove(1); tm().resume(suspended); Collection<Object> values = cache.values(); assertEquals(2, values.size()); assertTrue(values.contains("v1")); assertTrue(values.contains("v2")); safeCommit(false); } public void testSizeAfterDoubleRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.remove(1)); tm().resume(suspended); assertEquals(1, cache.size()); assertEquals("v2", cache.get(2)); safeCommit(true); } public void testEntrySetAfterDoubleRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.remove(1)); tm().resume(suspended); Set<Map.Entry<Object, Object>> entrySet = cache.entrySet(); assertEquals(1, entrySet.size()); Map.Entry<Object, Object> entry = entrySet.iterator().next(); assertEquals(2, entry.getKey()); assertEquals("v2", entry.getValue()); assertTrue(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(2, "v2"))); safeCommit(true); } public void testKeySetAfterDoubleRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.remove(1)); tm().resume(suspended); Set<Object> keySet = cache.keySet(); assertEquals(1, keySet.size()); assertTrue(keySet.contains(2)); safeCommit(true); } public void testValuesAfterDoubleRemoveInBranchedTransaction() throws Exception { cache.put(1, "v1"); cache.put(2, "v2"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.remove(1)); tm().resume(suspended); Collection<Object> values = cache.values(); assertEquals(1, values.size()); assertTrue(values.contains("v2")); safeCommit(true); } public void testSizeAfterPutInBranchedTransactionButRemove() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.put(1, "v2")); tm().resume(suspended); assertEquals(0, cache.size()); safeCommit(true); } public void testEntrySetAfterPutInBranchedTransactionButRemove() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.put(1, "v2")); tm().resume(suspended); Set<Map.Entry<Object, Object>> entrySet = cache.entrySet(); assertEquals(0, entrySet.size()); assertFalse(entrySet.iterator().hasNext()); assertFalse(entrySet.contains(TestingUtil.<Object, Object>createMapEntry(1, "v2"))); safeCommit(true); } public void testKeySetAfterPutInBranchedTransactionButRemove() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.put(1, "v2")); tm().resume(suspended); Set<Object> keySet = cache.keySet(); assertEquals(0, keySet.size()); assertFalse(keySet.iterator().hasNext()); assertFalse(keySet.contains(1)); safeCommit(true); } public void testValuesAfterPutInBranchedTransactionButRemove() throws Exception { cache.put(1, "v1"); tm().begin(); assertEquals("v1", cache.remove(1)); Transaction suspended = tm().suspend(); assertEquals("v1", cache.put(1, "v2")); tm().resume(suspended); Collection<Object> values = cache.values(); assertEquals(0, values.size()); assertFalse(values.iterator().hasNext()); assertFalse(values.contains("v2")); safeCommit(true); } protected void safeCommit(boolean throwWriteSkew) throws Exception { tm().commit(); } }