package org.infinispan.api; import static org.infinispan.test.TestingUtil.v; import static org.testng.AssertJUnit.assertEquals; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.transaction.NotSupportedException; import javax.transaction.SystemException; import javax.transaction.TransactionManager; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.Configuration; 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.util.concurrent.IsolationLevel; import org.testng.annotations.Test; /** * Tests the {@link org.infinispan.Cache} public API at a high level * * @author <a href="mailto:manik@jboss.org">Manik Surtani</a> */ @Test(groups = "functional") public abstract class CacheAPITest extends APINonTxTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { // start a single cache instance ConfigurationBuilder cb = getDefaultStandaloneCacheConfig(true); cb.locking().isolationLevel(getIsolationLevel()); addEviction(cb); amend(cb); EmbeddedCacheManager cm = TestCacheManagerFactory.createCacheManager(false); cm.defineConfiguration("test", cb.build()); cache = cm.getCache("test"); return cm; } protected void amend(ConfigurationBuilder cb) { } protected abstract IsolationLevel getIsolationLevel(); protected ConfigurationBuilder addEviction(ConfigurationBuilder cb) { return cb; } /** * Tests that the configuration contains the values expected, as well as immutability of certain elements */ public void testConfiguration() { Configuration c = cache.getCacheConfiguration(); assert CacheMode.LOCAL.equals(c.clustering().cacheMode()); assert null != c.transaction().transactionManagerLookup(); } public void testGetMembersInLocalMode() { assert manager(cache).getAddress() == null : "Cache members should be null if running in LOCAL mode"; } public void testRollbackAfterOverwrite() throws Exception { String key = "key", value = "value", value2 = "value2"; int size; cache.put(key, value); assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); TestingUtil.getTransactionManager(cache).begin(); try { cache.put(key, value2); assert cache.get(key).equals(value2); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value2); } finally { TestingUtil.getTransactionManager(cache).rollback(); } assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); } public void testRollbackAfterRemove() throws Exception { String key = "key", value = "value"; int size; cache.put(key, value); assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); TestingUtil.getTransactionManager(cache).begin(); try { cache.remove(key); assert cache.get(key) == null; size = 0; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); } finally { TestingUtil.getTransactionManager(cache).rollback(); } assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); } public void testEntrySetEqualityInTx(Method m) throws Exception { Map<Object, Object> dataIn = new HashMap<>(); dataIn.put(1, v(m, 1)); dataIn.put(2, v(m, 2)); cache.putAll(dataIn); TransactionManager tm = cache.getAdvancedCache().getTransactionManager(); tm.begin(); try { Map<Integer, String> txDataIn = new HashMap<>(); txDataIn.put(3, v(m, 3)); Map<Object, Object> allEntriesIn = new HashMap<>(dataIn); // Modify expectations to include data to be included allEntriesIn.putAll(txDataIn); // Add an entry within tx cache.putAll(txDataIn); Set<Map.Entry<Object, Object>> entries = cache.entrySet(); assertEquals(allEntriesIn.entrySet(), entries); } finally { tm.rollback(); } } public void testEntrySetIterationBeforeInTx(Method m) throws Exception { Map<Integer, String> dataIn = new HashMap<>(); dataIn.put(1, v(m, 1)); dataIn.put(2, v(m, 2)); cache.putAll(dataIn); Map<Object, Object> foundValues = new HashMap<>(); TransactionManager tm = cache.getAdvancedCache().getTransactionManager(); tm.begin(); try { Set<Entry<Object, Object>> entries = cache.entrySet(); // Add an entry within tx cache.put(3, v(m, 3)); cache.put(4, v(m, 4)); for (Entry<Object, Object> entry : entries) { foundValues.put(entry.getKey(), entry.getValue()); } } finally { tm.rollback(); } assertEquals(4, foundValues.size()); assertEquals(v(m, 1), foundValues.get(1)); assertEquals(v(m, 2), foundValues.get(2)); assertEquals(v(m, 3), foundValues.get(3)); assertEquals(v(m, 4), foundValues.get(4)); } public void testEntrySetIterationAfterInTx(Method m) throws Exception { Map<Integer, String> dataIn = new HashMap<>(); dataIn.put(1, v(m, 1)); dataIn.put(2, v(m, 2)); cache.putAll(dataIn); Map<Object, Object> foundValues = new HashMap<>(); TransactionManager tm = cache.getAdvancedCache().getTransactionManager(); tm.begin(); try { Set<Entry<Object, Object>> entries = cache.entrySet(); Iterator<Entry<Object, Object>> itr = entries.iterator(); // Add an entry within tx cache.put(3, v(m, 3)); cache.put(4, v(m, 4)); while (itr.hasNext()) { Entry<Object, Object> entry = itr.next(); foundValues.put(entry.getKey(), entry.getValue()); } } finally { tm.rollback(); } assertEquals(4, foundValues.size()); assertEquals(v(m, 1), foundValues.get(1)); assertEquals(v(m, 2), foundValues.get(2)); assertEquals(v(m, 3), foundValues.get(3)); assertEquals(v(m, 4), foundValues.get(4)); } public void testRollbackAfterPut() throws Exception { String key = "key", value = "value", key2 = "keyTwo", value2 = "value2"; int size; cache.put(key, value); assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); TestingUtil.getTransactionManager(cache).begin(); try { cache.put(key2, value2); assert cache.get(key2).equals(value2); assert cache.keySet().contains(key2); size = 2; log.trace(cache.size()); assert size == cache.size(); assert size == cache.keySet().size(); assert size == cache.values().size(); assert size == cache.entrySet().size(); assert cache.values().contains(value2); } finally { TestingUtil.getTransactionManager(cache).rollback(); } assert cache.get(key).equals(value); size = 1; assert size == cache.size() && size == cache.keySet().size() && size == cache.values().size() && size == cache.entrySet().size(); assert cache.keySet().contains(key); assert cache.values().contains(value); } public void testSizeAfterClear() { for (int i = 0; i < 10; i++) { cache.put(i, "value" + i); } cache.clear(); assert cache.isEmpty(); } public void testPutIfAbsentAfterRemoveInTx() throws SystemException, NotSupportedException { String key = "key_1", old_value = "old_value"; cache.put(key, old_value); assert cache.get(key).equals(old_value); TestingUtil.getTransactionManager(cache).begin(); try { assert cache.remove(key).equals(old_value); assert cache.get(key) == null; // assertEquals(cache.putIfAbsent(key, new_value), null); } finally { TestingUtil.getTransactionManager(cache).rollback(); } assertEquals(old_value, cache.get(key)); } }