package org.infinispan.client.hotrod.event;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.withClientListener;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import org.infinispan.client.hotrod.event.CustomEventLogListener.CustomEvent;
import org.infinispan.client.hotrod.event.CustomEventLogListener.FilterConverterFactory;
import org.infinispan.client.hotrod.event.CustomEventLogListener.FilterCustomEventLogListener;
import org.infinispan.client.hotrod.event.CustomEventLogListener.StaticConverterFactory;
import org.infinispan.client.hotrod.event.CustomEventLogListener.StaticCustomEventLogListener;
import org.infinispan.client.hotrod.event.EventLogListener.StaticCacheEventFilterFactory;
import org.infinispan.client.hotrod.event.EventLogListener.StaticFilteredEventLogListener;
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.manager.EmbeddedCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.server.hotrod.configuration.HotRodServerConfigurationBuilder;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "client.hotrod.event.ClientClusterEventsTest")
public class ClientClusterEventsTest extends MultiHotRodServersTest {
static final int NUM_SERVERS = 2;
@Override
protected void createCacheManagers() throws Throwable {
createHotRodServers(NUM_SERVERS, getCacheConfiguration());
}
private ConfigurationBuilder getCacheConfiguration() {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
builder.clustering().hash().numOwners(1);
return hotRodCacheConfiguration(builder);
}
protected HotRodServer addHotRodServer(ConfigurationBuilder builder) {
EmbeddedCacheManager cm = addClusterEnabledCacheManager(builder);
HotRodServerConfigurationBuilder serverBuilder = new HotRodServerConfigurationBuilder();
HotRodServer server = HotRodClientTestingUtil.startHotRodServer(cm, serverBuilder);
server.addCacheEventConverterFactory("static-converter-factory", new StaticConverterFactory());
server.addCacheEventFilterConverterFactory("filter-converter-factory", new FilterConverterFactory());
servers.add(server);
return server;
}
public void testEventForwarding() {
final Integer key0 = HotRodClientTestingUtil.getIntKeyForServer(server(0));
final Integer key1 = HotRodClientTestingUtil.getIntKeyForServer(server(1));
final EventLogListener<Integer> l = new EventLogListener<>(client(0).getCache());
withClientListener(l, remote -> {
l.expectNoEvents();
remote.put(key0, "one");
l.expectOnlyCreatedEvent(key0);
remote.put(key1, "two");
l.expectOnlyCreatedEvent(key1);
remote.replace(key0, "new-one");
l.expectOnlyModifiedEvent(key0);
remote.replace(key1, "new-two");
l.expectOnlyModifiedEvent(key1);
remote.remove(key0);
l.expectOnlyRemovedEvent(key0);
remote.remove(key1);
l.expectOnlyRemovedEvent(key1);
});
}
public void testFilteringInCluster() {
// Generate key and add static filter in all servers
final Integer key0 = HotRodClientTestingUtil.getIntKeyForServer(server(0));
final Integer key1 = HotRodClientTestingUtil.getIntKeyForServer(server(1));
for (HotRodServer server : servers)
server.addCacheEventFilterFactory("static-filter-factory", new StaticCacheEventFilterFactory(key1));
final StaticFilteredEventLogListener<Integer> l = new StaticFilteredEventLogListener<>(client(0).getCache());
withClientListener(l, remote -> {
l.expectNoEvents();
remote.put(key0, "one");
l.expectNoEvents();
remote.put(key1, "two");
l.expectOnlyCreatedEvent(key1);
remote.remove(key0);
l.expectNoEvents();
remote.remove(key1);
l.expectOnlyRemovedEvent(key1);
});
}
public void testConversionInCluster() {
final Integer key0 = HotRodClientTestingUtil.getIntKeyForServer(server(0));
final Integer key1 = HotRodClientTestingUtil.getIntKeyForServer(server(1));
final StaticCustomEventLogListener<Integer> l = new StaticCustomEventLogListener<>(client(0).getCache());
withClientListener(l, remote -> {
l.expectNoEvents();
remote.put(key0, "one");
l.expectCreatedEvent(new CustomEvent(key0, "one", 0));
remote.put(key1, "two");
l.expectCreatedEvent(new CustomEvent(key1, "two", 0));
remote.remove(key0);
l.expectRemovedEvent(new CustomEvent(key0, null, 0));
remote.remove(key1);
l.expectRemovedEvent(new CustomEvent(key1, null, 0));
});
}
public void testFilterCustomEventsInCluster() {
final Integer key0 = HotRodClientTestingUtil.getIntKeyForServer(server(0));
final Integer key1 = HotRodClientTestingUtil.getIntKeyForServer(server(1));
final FilterCustomEventLogListener<Integer> l = new FilterCustomEventLogListener<>(client(0).getCache());
withClientListener(l, new Object[]{key0}, null, remote -> {
remote.put(key0, "one");
l.expectCreatedEvent(new CustomEvent(key0, null, 1));
remote.put(key0, "newone");
l.expectModifiedEvent(new CustomEvent(key0, null, 2));
remote.put(key1, "two");
l.expectCreatedEvent(new CustomEvent(key1, "two", 1));
remote.put(key1, "dos");
l.expectModifiedEvent(new CustomEvent(key1, "dos", 2));
remote.remove(key0);
l.expectRemovedEvent(new CustomEvent(key0, null, 3));
remote.remove(key1);
l.expectRemovedEvent(new CustomEvent(key1, null, 3));
});
}
}