package org.infinispan.stream;
import static org.testng.Assert.assertEquals;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.context.Flag;
import org.infinispan.distribution.MagicKey;
import org.infinispan.marshall.TestObjectStreamMarshaller;
import org.infinispan.marshall.core.MarshalledEntryImpl;
import org.infinispan.persistence.dummy.DummyInMemoryStore;
import org.infinispan.persistence.dummy.DummyInMemoryStoreConfigurationBuilder;
import org.infinispan.persistence.manager.PersistenceManager;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.transaction.TransactionMode;
import org.testng.annotations.Test;
/**
* Base test to verify stream behavior when a loader is present
*
* @author afield
* @author wburns
* @since 8.0
*/
@Test(groups = "functional", testName = "stream.BaseStreamIteratorWithLoaderTest")
public abstract class BaseStreamIteratorWithLoaderTest extends MultipleCacheManagersTest {
protected String cacheName = "BaseStreamIteratorWithLoaderTest";
protected ConfigurationBuilder builderUsed;
protected final boolean tx;
protected final CacheMode cacheMode;
public BaseStreamIteratorWithLoaderTest(boolean tx, CacheMode cacheMode, String cacheName) {
this.tx = tx;
this.cacheMode = cacheMode;
this.cacheName = cacheName;
}
@Override
protected void createCacheManagers() throws Throwable {
builderUsed = new ConfigurationBuilder();
builderUsed.clustering().cacheMode(cacheMode);
builderUsed.clustering().hash().numOwners(1);
builderUsed.persistence().passivation(false).addStore(DummyInMemoryStoreConfigurationBuilder.class)
.storeName(cacheName);
if (tx) {
builderUsed.transaction().transactionMode(TransactionMode.TRANSACTIONAL);
}
if (cacheMode.isClustered()) {
createClusteredCaches(3, cacheName, builderUsed);
} else {
createClusteredCaches(1, cacheName, builderUsed);
}
}
private Map<Object, String> insertDefaultValues(boolean includeLoaderEntry) {
Cache<Object, String> cache0 = cache(0, cacheName);
Map<Object, String> originalValues = new HashMap<>();
Object loaderKey;
if (cacheMode.isDistributed() || cacheMode.isReplicated()) {
Cache<Object, String> cache1 = cache(1, cacheName);
Cache<Object, String> cache2 = cache(2, cacheName);
originalValues.put(new MagicKey(cache0), "cache0");
originalValues.put(new MagicKey(cache1), "cache1");
originalValues.put(new MagicKey(cache2), "cache2");
loaderKey = new MagicKey(cache2);
} else {
originalValues.put(1, "value0");
originalValues.put(2, "value1");
originalValues.put(3, "value2");
loaderKey = 4;
}
cache0.putAll(originalValues);
PersistenceManager persistenceManager = TestingUtil.extractComponent(cache0, PersistenceManager.class);
DummyInMemoryStore store = persistenceManager.getStores(DummyInMemoryStore.class).iterator().next();
TestObjectStreamMarshaller sm = new TestObjectStreamMarshaller();
try {
String loaderValue = "loader-value";
store.write(new MarshalledEntryImpl(loaderKey, loaderValue, null, sm));
if (includeLoaderEntry) {
originalValues.put(loaderKey, loaderValue);
}
} finally {
sm.stop();
}
return originalValues;
}
@Test
public void testCacheLoader() throws InterruptedException, ExecutionException, TimeoutException {
Map<Object, String> originalValues = insertDefaultValues(true);
Cache<Object, String> cache = cache(0, cacheName);
Iterator<Map.Entry<Object, String>> iterator = cache.entrySet().stream().iterator();
// we need this count since the map will replace same key'd value
int count = 0;
Map<Object, String> results = new HashMap<Object, String>();
while (iterator.hasNext()) {
Map.Entry<Object, String> entry = iterator.next();
results.put(entry.getKey(), entry.getValue());
count++;
}
assertEquals(count, 4);
assertEquals(originalValues, results);
}
@Test
public void testCacheLoaderIgnored() throws InterruptedException, ExecutionException, TimeoutException {
Map<Object, String> originalValues = insertDefaultValues(false);
Cache<Object, String> cache = cache(0, cacheName);
Iterator<Map.Entry<Object, String>> iterator = cache.getAdvancedCache().withFlags(Flag.SKIP_CACHE_LOAD).
entrySet().stream().iterator();
// we need this count since the map will replace same key'd value
int count = 0;
Map<Object, String> results = new HashMap<>();
while (iterator.hasNext()) {
Map.Entry<Object, String> entry = iterator.next();
results.put(entry.getKey(), entry.getValue());
count++;
}
assertEquals(count, 3);
assertEquals(originalValues, results);
}
}