package org.infinispan.client.hotrod;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killRemoteCacheManager;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killServers;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.testng.AssertJUnit.assertEquals;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
/**
* Tests functionality related to getting multiple entries from a HotRod server
* using getAll method.
*
* @author William Burns
* @since 7.2
*/
@Test(groups = "functional")
public abstract class BaseGetAllTest extends MultipleCacheManagersTest {
protected HotRodServer[] hotrodServers;
protected RemoteCacheManager remoteCacheManager;
protected RemoteCache<Object, Object> remoteCache;
abstract protected int numberOfHotRodServers();
abstract protected ConfigurationBuilder clusterConfig();
@Override
protected void createCacheManagers() throws Throwable {
final int numServers = numberOfHotRodServers();
hotrodServers = new HotRodServer[numServers];
createCluster(hotRodCacheConfiguration(clusterConfig()), numberOfHotRodServers());
for (int i = 0; i < numServers; i++) {
EmbeddedCacheManager cm = cacheManagers.get(i);
hotrodServers[i] = HotRodClientTestingUtil.startHotRodServer(cm);
}
String servers = HotRodClientTestingUtil.getServersString(hotrodServers);
org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder =
new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
clientBuilder.addServers(servers);
remoteCacheManager = new RemoteCacheManager(clientBuilder.build());
remoteCache = remoteCacheManager.getCache();
}
@AfterClass(alwaysRun = true)
public void release() {
killRemoteCacheManager(remoteCacheManager);
killServers(hotrodServers);
}
protected Set<Integer> populateCacheManager() {
Map<Integer, Integer> entries = new HashMap<Integer, Integer>();
for (int i = 0; i < 100; i++) {
entries.put(i, i);
}
remoteCache.putAll(entries);
return entries.keySet();
}
public void testBulkGetKeys() {
Set<Integer> keys = populateCacheManager();
Map<Object, Object> map = remoteCache.getAll(keys);
assertEquals(100, map.size());
for (int i = 0; i < 100; i++) {
assertEquals(i, map.get(i));
}
}
public void testBulkGetAfterLifespanExpire() throws InterruptedException {
Map<String, String> dataIn = new HashMap<String, String>();
dataIn.put("aKey", "aValue");
dataIn.put("bKey", "bValue");
final long startTime = System.currentTimeMillis();
final long lifespan = 10000;
remoteCache.putAll(dataIn, lifespan, TimeUnit.MILLISECONDS);
Map<Object, Object> dataOut = new HashMap<Object, Object>();
while (true) {
dataOut = remoteCache.getAll(dataIn.keySet());
if (System.currentTimeMillis() >= startTime + lifespan)
break;
assertEquals(dataOut.size(), dataIn.size());
for (Entry<Object, Object> outEntry : dataOut.entrySet()) {
assertEquals(dataIn.get(outEntry.getKey()), outEntry.getValue());
}
Thread.sleep(100);
}
int size = dataOut.size();
// Make sure that in the next 30 secs data is removed
while (System.currentTimeMillis() < startTime + lifespan + 30000) {
dataOut = remoteCache.getAll(dataIn.keySet());
if ((size = dataOut.size()) == 0) {
break;
}
}
assertEquals("There shouldn't be any values left!", 0, size);
}
}