package org.infinispan.client.hotrod.impl.iteration;
import static org.testng.AssertJUnit.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.client.hotrod.test.MultiHotRodServersTest;
import org.infinispan.commons.util.CloseableIterator;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.query.dsl.embedded.testdomain.hsearch.AccountHS;
import org.testng.annotations.Test;
/**
* @author gustavonalle
* @since 8.0
*/
public abstract class BaseIterationFailOverTest extends MultiHotRodServersTest implements AbstractRemoteIteratorTest {
protected final int SERVERS = 3;
@Override
protected void createCacheManagers() throws Throwable {
createHotRodServers(SERVERS, getCacheConfiguration());
}
public abstract ConfigurationBuilder getCacheConfiguration();
@Test
public void testFailOver() throws InterruptedException {
int cacheSize = 10000;
int batch = 17;
RemoteCache<Integer, AccountHS> cache = clients.get(0).getCache();
populateCache(cacheSize, this::newAccount, cache);
List<Map.Entry<Object, Object>> entries = new ArrayList<>();
CloseableIterator<Map.Entry<Object, Object>> iterator = cache.retrieveEntries(null, null, batch);
for (int i = 0; i < cacheSize / 2; i++) {
Map.Entry<Object, Object> next = iterator.next();
entries.add(next);
}
killIterationServer();
while (iterator.hasNext()) {
Map.Entry<Object, Object> next = iterator.next();
entries.add(next);
}
assertEquals(cacheSize, entries.size());
Set<Integer> keys = extractKeys(entries);
assertEquals(rangeAsSet(0, cacheSize), keys);
}
protected void killIterationServer() {
servers.stream()
.filter(s -> s.getIterationManager().activeIterations() > 0)
.forEach(HotRodClientTestingUtil::killServers);
}
}