package org.infinispan.server.hotrod.event; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.assertSuccess; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.k; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.v; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.withClientListener; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Optional; import org.infinispan.notifications.cachelistener.event.Event; import org.infinispan.server.hotrod.HotRodSingleNodeTest; import org.infinispan.server.hotrod.test.TestGetWithVersionResponse; import org.testng.annotations.Test; /** * @author Galder ZamarreƱo */ @Test(groups = "functional", testName = "server.hotrod.event.HotRodEventsTest") public class HotRodEventsTest extends HotRodSingleNodeTest { public void testCreatedEvent(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); }); } public void testModifiedEvent(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().put(key, 0, 0, v(m, "v2-")); eventListener.expectOnlyModifiedEvent(cache, key); }); } public void testRemovedEvent(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().remove(key); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().remove(key); eventListener.expectOnlyRemovedEvent(cache, key); }); } public void testReplaceEvents(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().replace(key, 0, 0, v(m)); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().replace(key, 0, 0, v(m, "v2-")); eventListener.expectOnlyModifiedEvent(cache, key); }); } public void testPutIfAbsentEvents(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().putIfAbsent(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().putIfAbsent(key, 0, 0, v(m, "v2-")); eventListener.expectNoEvents(Optional.empty()); }); } public void testReplaceIfUnmodifiedEvents(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().replaceIfUnmodified(key, 0, 0, v(m), 0); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().replaceIfUnmodified(key, 0, 0, v(m), 0); eventListener.expectNoEvents(Optional.empty()); TestGetWithVersionResponse resp = client().getWithVersion(k(m), 0); assertSuccess(resp, v(m), 0); client().replaceIfUnmodified(k(m), 0, 0, v(m, "v1-"), resp.dataVersion); eventListener.expectOnlyModifiedEvent(cache, key); }); } public void testRemoveIfUnmodifiedEvents(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key = k(m); client().removeIfUnmodified(key, 0, 0, v(m), 0); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key); client().removeIfUnmodified(key, 0, 0, v(m), 0); eventListener.expectNoEvents(Optional.empty()); TestGetWithVersionResponse resp = client().getWithVersion(k(m), 0); assertSuccess(resp, v(m), 0); client().removeIfUnmodified(k(m), 0, 0, v(m, "v1-"), resp.dataVersion); eventListener.expectOnlyRemovedEvent(cache, key); }); } public void testClearEvents(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { eventListener.expectNoEvents(Optional.empty()); byte[] key1 = k(m, "k1"); byte[] key2 = k(m, "k2"); byte[] key3 = k(m, "k3"); client().put(key1, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key1); client().put(key2, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key2); client().put(key3, 0, 0, v(m)); eventListener.expectOnlyCreatedEvent(cache, key3); client().clear(); // Order in which clear operates cannot be guaranteed List<byte[]> keys = Arrays.asList(key1, key2, key3); eventListener.expectUnorderedEvents(cache, keys, Event.Type.CACHE_ENTRY_REMOVED); }); } public void testNoEventsBeforeAddingListener(Method m) { EventLogListener eventListener = new EventLogListener(); byte[] key = k(m); client().put(key, 0, 0, v(m)); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m, "v2-")); eventListener.expectNoEvents(Optional.empty()); client().remove(key); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { byte[] key2 = k(m, "k2-"); client().put(key2, 0, 0, v(m)); eventListener.expectSingleEvent(cache, key2, Event.Type.CACHE_ENTRY_CREATED); client().put(key2, 0, 0, v(m, "v2-")); eventListener.expectSingleEvent(cache, key2, Event.Type.CACHE_ENTRY_MODIFIED); client().remove(key2); eventListener.expectSingleEvent(cache, key2, Event.Type.CACHE_ENTRY_REMOVED); }); } public void testNoEventsAfterRemovingListener(Method m) { EventLogListener eventListener = new EventLogListener(); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), () -> { byte[] key = k(m); client().put(key, 0, 0, v(m)); eventListener.expectSingleEvent(cache, key, Event.Type.CACHE_ENTRY_CREATED); client().put(key, 0, 0, v(m, "v2-")); eventListener.expectSingleEvent(cache, key, Event.Type.CACHE_ENTRY_MODIFIED); client().remove(key); eventListener.expectSingleEvent(cache, key, Event.Type.CACHE_ENTRY_REMOVED); }); byte[] key = k(m, "k2-"); client().put(key, 0, 0, v(m)); eventListener.expectNoEvents(Optional.empty()); client().put(key, 0, 0, v(m, "v2-")); eventListener.expectNoEvents(Optional.empty()); client().remove(key); eventListener.expectNoEvents(Optional.empty()); } public void testEventReplayAfterAddingListener(Method m) { EventLogListener eventListener = new EventLogListener(); byte[] k1 = k(m, "k1-"); byte[] v1 = v(m, "v1-"); byte[] k2 = k(m, "k2-"); byte[] v2 = v(m, "v2-"); byte[] k3 = k(m, "k3-"); byte[] v3 = v(m, "v3-"); client().put(k1, 0, 0, v1); client().put(k2, 0, 0, v2); client().put(k3, 0, 0, v3); withClientListener(client(), eventListener, Optional.empty(), Optional.empty(), true, true, () -> { eventListener.expectUnorderedEvents(cache, Arrays.asList(k1, k2, k3), Event.Type.CACHE_ENTRY_CREATED); }); } }