package org.infinispan.client.hotrod.near;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import java.util.ArrayList;
import java.util.List;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.NearCacheMode;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.client.hotrod.test.MultiHotRodServersTest;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.server.hotrod.HotRodServer;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "client.hotrod.near.ClusterInvalidatedNearCacheTest")
public class ClusterInvalidatedNearCacheTest extends MultiHotRodServersTest {
List<AssertsNearCache<Integer, String>> assertClients = new ArrayList<>(2);
@Override
protected void createCacheManagers() throws Throwable {
createHotRodServers(2, getCacheConfiguration());
}
private ConfigurationBuilder getCacheConfiguration() {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
builder.clustering().hash().numOwners(1);
return hotRodCacheConfiguration(builder);
}
@Override
protected RemoteCacheManager createClient(int i) {
AssertsNearCache<Integer, String> asserts = createAssertClient();
assertClients.add(asserts);
return asserts.manager;
}
private <K, V> AssertsNearCache<K, V> createAssertClient() {
org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder =
new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
for (HotRodServer server : servers)
clientBuilder.addServer().host("127.0.0.1").port(server.getPort());
clientBuilder.nearCache().mode(getNearCacheMode()).maxEntries(-1);
return AssertsNearCache.create(this.<byte[], Object>cache(0), clientBuilder);
}
public void testNearCacheUpdatesSeenByAllClients() {
Integer key0 = HotRodClientTestingUtil.getIntKeyForServer(server(0));
Integer key1 = HotRodClientTestingUtil.getIntKeyForServer(server(1));
expectNearCacheUpdates(headClient(), key0, tailClient());
expectNearCacheUpdates(tailClient(), key1, headClient());
}
private AssertsNearCache<Integer, String> tailClient() {
return assertClients.get(1);
}
private AssertsNearCache<Integer, String> headClient() {
return assertClients.get(0);
}
protected NearCacheMode getNearCacheMode() {
return NearCacheMode.INVALIDATED;
}
protected void expectNearCacheUpdates(AssertsNearCache<Integer, String> producer,
Integer key, AssertsNearCache<Integer, String> consumer) {
producer.get(key, null).expectNearGetNull(key);
producer.put(key, "v1").expectNearRemove(key, consumer);
producer.get(key, "v1").expectNearGetNull(key).expectNearPutIfAbsent(key, "v1");
producer.put(key, "v2").expectNearRemove(key, consumer);
producer.get(key, "v2").expectNearGetNull(key).expectNearPutIfAbsent(key, "v2");
producer.remove(key).expectNearRemove(key, consumer);
producer.get(key, null).expectNearGetNull(key);
}
}