package org.infinispan.client.hotrod.impl.iteration;
import static org.testng.Assert.assertFalse;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.client.hotrod.test.SingleHotRodServerTest;
import org.infinispan.commons.util.CloseableIterator;
import org.infinispan.filter.AbstractKeyValueFilterConverter;
import org.infinispan.metadata.Metadata;
import org.infinispan.query.dsl.embedded.testdomain.hsearch.AccountHS;
import org.testng.annotations.Test;
/**
* @author gustavonalle
* @since 8.0
*/
@Test(groups = "functional", testName = "client.hotrod.iteration.SingleServerRemoteIteratorTest")
public class SingleServerRemoteIteratorTest extends SingleHotRodServerTest implements AbstractRemoteIteratorTest {
public static final String FILTER_CONVERTER_FACTORY_NAME = "even-accounts-descriptions";
@Test
public void testEmptyCache() {
try (CloseableIterator<Entry<Object, Object>> iterator = remoteCacheManager.getCache().retrieveEntries(null, null, 100)) {
assertFalse(iterator.hasNext());
assertFalse(iterator.hasNext());
}
}
@Test
public void testEmptySegments() {
populateCache(1, i -> "value " + i, remoteCacheManager.getCache());
try (CloseableIterator<Entry<Object, Object>> iterator = remoteCacheManager.getCache().retrieveEntries(null, Collections.emptySet(), 100)) {
assertFalse(iterator.hasNext());
}
}
@Test(expectedExceptions = HotRodClientException.class, expectedExceptionsMessageRegExp = ".*ISPN006016.*")
public void testEmptyFilter() {
try (CloseableIterator<Entry<Object, Object>> iterator = remoteCacheManager.getCache().retrieveEntries("", null, 100)) {
assertFalse(iterator.hasNext());
}
}
@Test(expectedExceptions = NoSuchElementException.class)
public void testException1() {
CloseableIterator<Entry<Object, Object>> iterator = null;
try {
iterator = remoteCacheManager.getCache().retrieveEntries(null, null, 100);
iterator.next();
} finally {
if (iterator != null) {
iterator.close();
}
}
}
@Test(expectedExceptions = NoSuchElementException.class)
public void testException2() {
populateCache(3, i -> "value " + i, remoteCacheManager.getCache());
CloseableIterator<Entry<Object, Object>> iterator = remoteCacheManager.getCache().retrieveEntries(null, null, 100);
iterator.close();
iterator.next();
}
public void testResultsSingleFetch() {
RemoteCache<Integer, String> cache = remoteCacheManager.getCache();
populateCache(3, i -> "value " + i, cache);
Set<Entry<Object, Object>> entries = new HashSet<>();
try (CloseableIterator<Entry<Object, Object>> iterator = cache.retrieveEntries(null, null, 5)) {
entries.add(iterator.next());
entries.add(iterator.next());
entries.add(iterator.next());
}
Set<Integer> keys = extractKeys(entries);
Set<String> values = extractValues(entries);
assertEquals(keys, setOf(0, 1, 2));
assertEquals(values, setOf("value 0", "value 1", "value 2"));
}
public void testResultsMultipleFetches() {
RemoteCache<Integer, String> cache = remoteCacheManager.getCache();
int cacheSize = 100;
populateCache(cacheSize, i -> "value " + i, cache);
Set<Map.Entry<Object, Object>> entries = new HashSet<>();
try (CloseableIterator<Map.Entry<Object, Object>> iterator = cache.retrieveEntries(null, null, 5)) {
while (iterator.hasNext()) {
entries.add(iterator.next());
}
}
Set<Integer> keys = extractKeys(entries);
assertEquals(rangeAsSet(0, cacheSize), keys);
}
public void testEntities() {
RemoteCache<Integer, AccountHS> cache = remoteCacheManager.getCache();
int cacheSize = 50;
populateCache(cacheSize, this::newAccount, cache);
Set<Entry<Object, Object>> entries = new HashSet<>();
try (CloseableIterator<Entry<Object, Object>> iterator = cache.retrieveEntries(null, null, 5)) {
while (iterator.hasNext()) {
entries.add(iterator.next());
}
}
assertEquals(cacheSize, entries.size());
Set<AccountHS> values = extractValues(entries);
assertForAll(values, v -> v != null);
assertForAll(values, v -> v.getId() < cacheSize);
}
public void testFilterConverter() {
hotrodServer.addKeyValueFilterConverterFactory(FILTER_CONVERTER_FACTORY_NAME, () ->
new AbstractKeyValueFilterConverter<Integer, AccountHS, String>() {
@Override
public String filterAndConvert(Integer key, AccountHS value, Metadata metadata) {
if (!(key % 2 == 0)) {
return null;
}
return value.getDescription();
}
});
RemoteCache<Integer, AccountHS> cache = remoteCacheManager.getCache();
int cacheSize = 50;
populateCache(cacheSize, this::newAccount, cache);
Set<Entry<Object, Object>> entries = new HashSet<>();
try (CloseableIterator<Entry<Object, Object>> iterator = cache.retrieveEntries(FILTER_CONVERTER_FACTORY_NAME, null, 5)) {
while (iterator.hasNext()) {
entries.add(iterator.next());
}
}
assertEquals(cacheSize / 2, entries.size());
Set<Integer> keys = extractKeys(entries);
assertForAll(keys, v -> v % 2 == 0);
}
}