package org.infinispan.atomic;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.AbstractCacheTest;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.fwk.CleanupAfterMethod;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.testng.annotations.Test;
/**
* @author Pierre Sutra
* @since 7.2
*/
@Test(groups = "functional", testName = "AtomicObjectFactoryTest")
@CleanupAfterMethod
public class AtomicObjectFactoryTest extends MultipleCacheManagersTest {
private static int NCALLS= 10000;
private static int NCACHES = 2;
private static Log log = LogFactory.getLog(AtomicObjectFactory.class);
@Test(enabled = true)
public void basicUsageTest() throws Exception {
Cache<?, ?> cache = cache(0);
AtomicObjectFactory factory = new AtomicObjectFactory(cache);
// 1 - Basic Usage
Set<String> set = factory.getInstanceOf(HashSet.class, "set");
set.add("smthing");
assertTrue(set.contains("smthing"));
assertEquals(1, set.size());
// 2 - Persistence
factory.disposeInstanceOf(HashSet.class, "set", true);
set = factory.getInstanceOf(HashSet.class, "set", false, null, false);
assertTrue(set.contains("smthing"));
// 3 - Optimistic execution
ArrayList<String> list = factory.getInstanceOf(ArrayList.class, "list", true);
assertTrue(!list.contains("foo"));
assertTrue(!cache.containsKey("list"));
}
@Test(enabled = true)
public void basicPerformanceTest() throws Exception {
Cache<?, ?> cache = cache(0);
AtomicObjectFactory factory = new AtomicObjectFactory(cache);
Map<String, ?> map = factory.getInstanceOf(HashMap.class, "map", true);
for(int i=0; i<NCALLS*10;i++){
map.containsKey("1");
}
long start = System.currentTimeMillis();
for(int i=0; i<NCALLS*10;i++){
map.containsKey("1");
}
log.debug(System.currentTimeMillis() - start);
}
@Test(enabled = false, description = "To be fixed by ISPN-5530")
public void distributedCacheTest() throws Exception {
List<HashSet<Integer>> sets = new ArrayList<>();
List<Future<Integer>> futures = new ArrayList<>();
for(EmbeddedCacheManager manager: cacheManagers){
Cache<?, ?> cache = manager.getCache();
AtomicObjectFactory factory = new AtomicObjectFactory(cache);
HashSet<Integer> set = factory.getInstanceOf(HashSet.class, "aset", false, null, false);
set.add(-1); // to synchronize the copies
sets.add(set);
}
for(Set<Integer> s : sets){
futures.add(fork(new ExerciseAtomicSetTask(s, NCALLS)));
}
Integer total = 0;
for(Future<Integer> future : futures){
total += future.get();
}
assertEquals(NCALLS, total.intValue());
}
@Test(enabled = true)
public void distributedPersistenceTest() throws Exception {
Iterator<EmbeddedCacheManager> it = cacheManagers.iterator();
EmbeddedCacheManager manager1 = it.next();
EmbeddedCacheManager manager2 = it.next();
AtomicObjectFactory factory1, factory2;
Cache<?, ?> cache1, cache2;
HashSet<String> set1, set2;
cache1 = manager1.getCache();
factory1 = new AtomicObjectFactory(cache1);
set1 = factory1.getInstanceOf(HashSet.class, "persist");
set1.add("smthing");
factory1.disposeInstanceOf(HashSet.class,"persist",true);
cache2 = manager2.getCache();
factory2 = new AtomicObjectFactory(cache2);
set2 = factory2.getInstanceOf(HashSet.class, "persist", true, null, false);
assertTrue(set2.contains("smthing"));
}
//
// HELPERS
//
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder
= AbstractCacheTest.getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
createClusteredCaches(NCACHES, builder);
}
//
// INNER CLASSES
//
private class ExerciseAtomicSetTask implements Callable<Integer> {
private int ncalls;
private Set<Integer> set;
private Set<Integer> added;
public ExerciseAtomicSetTask(Set<Integer> s, int n) {
ncalls = n;
set = s;
added = new HashSet<>();
}
@Override
public Integer call() throws Exception {
int ret = 0;
for (int i = 0; i < ncalls; i++) {
boolean r = set.add(i);
if (r) {
ret ++;
added.add(i);
}
}
log.debugf("Thread %d added %s\n", Thread.currentThread().getId(), added);
return ret;
}
}
}