package org.infinispan.it.compatibility; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.infinispan.Cache; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.VersionedValue; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.test.AbstractInfinispanTest; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Test cache listeners bound to embedded cache and operation over HotRod cache. * * @author Jiri Holusa [jholusa@redhat.com] */ @Test(groups = "functional", testName = "it.compatibility.EmbeddedHotRodCacheListenerTest") public class EmbeddedHotRodCacheListenerTest extends AbstractInfinispanTest { CompatibilityCacheFactory<String, String> cacheFactory; @BeforeMethod protected void setup() throws Exception { cacheFactory = new CompatibilityCacheFactory<String, String>(CacheMode.LOCAL).setup(); } @AfterMethod protected void teardown() { CompatibilityCacheFactory.killCacheFactories(cacheFactory); } public void testLoadingAndStoringEventsHotRod1() { Cache<String, String> embedded = cacheFactory.getEmbeddedCache(); RemoteCache<String, String> remote = cacheFactory.getHotRodCache(); TestCacheListener l = new TestCacheListener(); embedded.addListener(l); assertTrue(l.created.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.visited.isEmpty()); remote.put("k", "v"); assertEquals(1, l.createdCounter); assertEquals("v", l.created.get("k")); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.visited.isEmpty()); remote.put("key", "value"); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.visited.isEmpty()); remote.put("key", "modifiedValue"); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertEquals(1, l.modifiedCounter); assertEquals("modifiedValue", l.modified.get("key")); assertTrue(l.visited.isEmpty()); remote.replace("k", "replacedValue"); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertEquals(2, l.modifiedCounter); assertEquals("replacedValue", l.modified.get("k")); assertTrue(l.visited.isEmpty()); //resetting so don't have to type "== 2" etc. all over again l.reset(); Set<String> keys = new HashSet<>(); keys.add("k"); keys.add("key"); Map<String, String> results = remote.getAll(keys); assertTrue(l.created.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertEquals(2, l.visitedCounter); assertEquals("replacedValue", l.visited.get("k")); assertEquals("modifiedValue", l.visited.get("key")); l.reset(); remote.remove("key"); assertTrue(l.created.isEmpty()); assertEquals(1, l.removedCounter); assertEquals("modifiedValue", l.removed.get("key")); assertTrue(l.modified.isEmpty()); l.reset(); String value = remote.get("k"); assertTrue(l.created.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertEquals(1, l.visitedCounter); assertEquals("replacedValue", l.visited.get("k")); l.reset(); } public void testLoadingAndStoringEventsHotRod2() { Cache<String, String> embedded = cacheFactory.getEmbeddedCache(); RemoteCache<String, String> remote = cacheFactory.getHotRodCache(); TestCacheListener l = new TestCacheListener(); embedded.addListener(l); Map<String, String> tmp = new HashMap<String, String>(); tmp.put("key", "value"); tmp.put("key2", "value2"); remote.putAll(tmp); assertEquals(2, l.createdCounter); //one event for every put assertEquals("value", l.created.get("key")); assertEquals("value2", l.created.get("key2")); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.visited.isEmpty()); l.reset(); remote.putIfAbsent("newKey", "newValue"); assertEquals(1, l.createdCounter); assertEquals("newValue", l.created.get("newKey")); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.visited.isEmpty()); l.reset(); remote.putIfAbsent("newKey", "shouldNotBeAdded"); assertTrue(l.created.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertEquals(1, l.visitedCounter); l.reset(); } public void testLoadingAndStoringWithVersionEventsHotRod() { Cache<String, String> embedded = cacheFactory.getEmbeddedCache(); RemoteCache<String, String> remote = cacheFactory.getHotRodCache(); TestCacheListener l = new TestCacheListener(); embedded.addListener(l); remote.put("key", "value"); VersionedValue oldVersionedValue = remote.getVersioned("key"); assertEquals("value", oldVersionedValue.getValue()); assertEquals(1, l.createdCounter); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertEquals(1, l.visitedCounter); assertEquals("value", l.visited.get("key")); remote.put("key2", "value2"); remote.put("key", "outOfVersionValue"); VersionedValue newVersionedValue = remote.getVersioned("key2"); l.reset(); remote.removeWithVersion("key", oldVersionedValue.getVersion()); assertTrue(l.created.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertEquals(1, l.visitedCounter); l.reset(); remote.removeWithVersion("key2", newVersionedValue.getVersion()); assertTrue(l.created.isEmpty()); assertTrue(l.modified.isEmpty()); assertEquals(1, l.removedCounter); assertEquals("value2", l.removed.get("key2")); assertEquals(1, l.visitedCounter); remote.put("newKey", "willBeOutOfDate"); VersionedValue oldVersionedValueToBeReplaced = remote.getVersioned("newKey"); remote.put("newKey", "changedValue"); l.reset(); remote.replaceWithVersion("newKey", "tryingToChangeButShouldNotSucceed", oldVersionedValueToBeReplaced.getVersion()); assertTrue(l.created.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.visited.isEmpty()); remote.put("newKey2", "willBeSuccessfullyChanged"); VersionedValue newVersionedValueToBeReplaced = remote.getVersioned("newKey2"); l.reset(); remote.replaceWithVersion("newKey2", "successfulChange", newVersionedValueToBeReplaced.getVersion()); assertTrue(l.created.isEmpty()); assertEquals(1, l.modifiedCounter); assertEquals("successfulChange", l.modified.get("newKey2")); assertTrue(l.removed.isEmpty()); assertTrue(l.visited.isEmpty()); l.reset(); } public void testLoadingAndStoringAsyncEventsHotRod() throws InterruptedException, ExecutionException, TimeoutException { Cache<String, String> embedded = cacheFactory.getEmbeddedCache(); RemoteCache<String, String> remote = cacheFactory.getHotRodCache(); TestCacheListener l = new TestCacheListener(); embedded.addListener(l); CompletableFuture future = remote.putAsync("k", "v"); future.get(60, TimeUnit.SECONDS); assertEquals(1, l.createdCounter); assertEquals("v", l.created.get("k")); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.visited.isEmpty()); CompletableFuture future2 = remote.putAsync("key", "value"); future2.get(60, TimeUnit.SECONDS); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertTrue(l.visited.isEmpty()); CompletableFuture future3 = remote.putAsync("key", "modifiedValue"); future3.get(60, TimeUnit.SECONDS); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertEquals(1, l.modifiedCounter); assertEquals("modifiedValue", l.modified.get("key")); assertTrue(l.visited.isEmpty()); CompletableFuture future4 = remote.replaceAsync("k", "replacedValue"); future4.get(60, TimeUnit.SECONDS); assertEquals(2, l.createdCounter); assertTrue(l.removed.isEmpty()); assertEquals(2, l.modifiedCounter); assertEquals("replacedValue", l.modified.get("k")); assertTrue(l.visited.isEmpty()); //resetting so don't have to type "== 2" etc. all over again l.reset(); CompletableFuture future5 = remote.removeAsync("key"); future5.get(60, TimeUnit.SECONDS); assertTrue(l.created.isEmpty()); assertEquals(1, l.removedCounter); assertEquals("modifiedValue", l.removed.get("key")); assertTrue(l.modified.isEmpty()); l.reset(); CompletableFuture future6 = remote.getAsync("k"); future6.get(60, TimeUnit.SECONDS); assertTrue(l.created.isEmpty()); assertTrue(l.removed.isEmpty()); assertTrue(l.modified.isEmpty()); assertEquals(1, l.visitedCounter); assertEquals("replacedValue", l.visited.get("k")); l.reset(); } }