package org.infinispan.client.hotrod.event; import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.withClientListener; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.io.Serializable; import java.util.Set; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.VersionedValue; import org.infinispan.client.hotrod.annotation.ClientListener; import org.infinispan.client.hotrod.test.SingleHotRodServerTest; import org.testng.annotations.Test; /** * @author Galder ZamarreƱo */ @Test(groups = "functional", testName = "client.hotrod.event.ClientEventsTest") public class ClientEventsTest extends SingleHotRodServerTest { public void testCreatedEvent() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.put(2, "two"); l.expectOnlyCreatedEvent(2); }); } public void testModifiedEvent() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.put(1, "newone"); l.expectOnlyModifiedEvent(1); }); } public void testRemovedEvent() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.remove(1); l.expectNoEvents(); remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.remove(1); l.expectOnlyRemovedEvent(1); }); } public void testReplaceEvents() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.replace(1, "one"); l.expectNoEvents(); remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.replace(1, "newone"); l.expectOnlyModifiedEvent(1); }); } public void testPutIfAbsentEvents() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.putIfAbsent(1, "one"); l.expectOnlyCreatedEvent(1); remote.putIfAbsent(1, "newone"); l.expectNoEvents(); }); } public void testReplaceIfUnmodifiedEvents() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.replaceWithVersion(1, "one", 0); l.expectNoEvents(); remote.putIfAbsent(1, "one"); l.expectOnlyCreatedEvent(1); remote.replaceWithVersion(1, "one", 0); l.expectNoEvents(); VersionedValue<?> versioned = remote.getVersioned(1); remote.replaceWithVersion(1, "one", versioned.getVersion()); l.expectOnlyModifiedEvent(1); }); } public void testRemoveIfUnmodifiedEvents() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.removeWithVersion(1, 0); l.expectNoEvents(); remote.putIfAbsent(1, "one"); l.expectOnlyCreatedEvent(1); remote.removeWithVersion(1, 0); l.expectNoEvents(); VersionedValue<?> versioned = remote.getVersioned(1); remote.removeWithVersion(1, versioned.getVersion()); l.expectOnlyRemovedEvent(1); }); } public void testClearEvents() { final EventLogListener<Integer> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.put(2, "two"); l.expectOnlyCreatedEvent(2); remote.put(3, "three"); l.expectOnlyCreatedEvent(3); remote.clear(); l.expectUnorderedEvents(ClientEvent.Type.CLIENT_CACHE_ENTRY_REMOVED, 1, 2, 3); }); } public void testNoEventsBeforeAddingListener() { RemoteCache<Integer, String> rcache = remoteCacheManager.getCache(); final EventLogListener<Integer> l = new EventLogListener<>(rcache); rcache.put(1, "one"); l.expectNoEvents(); rcache.put(1, "newone"); l.expectNoEvents(); rcache.remove(1); l.expectNoEvents(); createUpdateRemove(l); } private void createUpdateRemove(EventLogListener<Integer> l) { withClientListener(l, remote -> { remote.put(1, "one"); l.expectOnlyCreatedEvent(1); remote.put(1, "newone"); l.expectOnlyModifiedEvent(1); remote.remove(1); l.expectOnlyRemovedEvent(1); }); } public void testNoEventsAfterRemovingListener() { final RemoteCache<Integer, String> rcache = remoteCacheManager.getCache(); final EventLogListener<Integer> l = new EventLogListener<>(rcache); createUpdateRemove(l); rcache.put(1, "one"); l.expectNoEvents(); rcache.put(1, "newone"); l.expectNoEvents(); rcache.remove(1); l.expectNoEvents(); } public void testSetListeners() { final RemoteCache<Integer, String> rcache = remoteCacheManager.getCache(); final EventLogListener l1 = new EventLogListener<>(rcache); withClientListener(l1, remote1 -> { Set<?> listeners1 = remote1.getListeners(); assertEquals(1, listeners1.size()); assertEquals(l1, listeners1.iterator().next()); final EventLogListener l2 = new EventLogListener<>(rcache); withClientListener(l2, remote2 -> { Set<?> listeners2 = remote2.getListeners(); assertEquals(2, listeners2.size()); assertTrue(listeners2.contains(l1)); assertTrue(listeners2.contains(l2)); }); }); Set<Object> listeners = rcache.getListeners(); assertEquals(0, listeners.size()); } public void testCustomTypeEvents() { final EventLogListener<CustomKey> l = new EventLogListener<>(remoteCacheManager.getCache()); withClientListener(l, remote -> { l.expectNoEvents(); CustomKey key = new CustomKey(1); remote.put(key, "one"); l.expectOnlyCreatedEvent(key); remote.replace(key, "newone"); l.expectOnlyModifiedEvent(key); remote.remove(key); l.expectOnlyRemovedEvent(key); }); } public void testEventReplayAfterAddingListener() { RemoteCache<Integer, String> cache = remoteCacheManager.getCache(); final WithStateEventLogListener<Integer> l = new WithStateEventLogListener<>(cache); cache.put(1, "one"); cache.put(2, "two"); l.expectNoEvents(); withClientListener(l, remote -> l.expectUnorderedEvents(ClientEvent.Type.CLIENT_CACHE_ENTRY_CREATED, 1, 2)); } public void testNoEventReplayAfterAddingListener() { RemoteCache<Integer, String> cache = remoteCacheManager.getCache(); final EventLogListener<Integer> l = new EventLogListener<>(cache); cache.put(1, "one"); cache.put(2, "two"); l.expectNoEvents(); withClientListener(l, remote -> l.expectNoEvents()); } @ClientListener(includeCurrentState = true) public static class WithStateEventLogListener<K> extends EventLogListener<K> { public WithStateEventLogListener(RemoteCache<K, ?> remote) { super(remote); } } static final class CustomKey implements Serializable { final int id; CustomKey(int id) { this.id = id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CustomKey customKey = (CustomKey) o; return id == customKey.id; } @Override public int hashCode() { return id; } } }