package org.infinispan.notifications.cachelistener;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import java.util.LinkedList;
import java.util.List;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
import org.infinispan.notifications.cachelistener.event.CacheEntryCreatedEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryModifiedEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryRemovedEvent;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
/**
* ISPN-3354
*
* @author Pedro Ruivo
* @since 6.0
*/
@Test(groups = "functional", testName = "notifications.cachelistener.DuplicatedEventsTest")
public class DuplicatedEventsTest extends MultipleCacheManagersTest {
public void testNonDuplicate() {
final Cache<String, String> cacheA = cache(0);
final Cache<String, String> cacheB = cache(1);
final MyCacheListener listenerA = new MyCacheListener();
cacheA.addListener(listenerA);
final MyCacheListener listenerB = new MyCacheListener();
cacheB.addListener(listenerB);
cacheA.put("a", "a");
/*
* We expect 2 events on both nodes: pre-create, post-create
*/
assertEquals(2, listenerA.events.size());
assertEquals(2, listenerB.events.size());
checkEvents(listenerA, "a");
checkEvents(listenerB, "a");
/*
* So far so good, let's try another key, say "b"
*/
listenerA.events.clear();
listenerB.events.clear();
cacheA.put("b", "b");
/*
* We expect 2 events again
*/
assertEquals(2, listenerA.events.size());
assertEquals(2, listenerB.events.size());
checkEvents(listenerA, "b");
checkEvents(listenerB, "b");
/*
* Let's try another one, say "a0"
*/
listenerA.events.clear();
listenerB.events.clear();
cacheA.put("a0", "a0");
/*
* We expect another 2 events
*/
assertEquals(2, listenerA.events.size());
assertEquals(2, listenerB.events.size());
checkEvents(listenerA, "a0");
checkEvents(listenerB, "a0");
}
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false);
builder.clustering().hash().numSegments(60);
createClusteredCaches(2, builder);
}
private void checkEvents(MyCacheListener listener, String expectedKey) {
assertTrue(listener.events.get(0) instanceof CacheEntryCreatedEvent);
assertEquals(expectedKey, listener.events.get(0).getKey());
assertTrue(listener.events.get(0).isPre());
assertTrue(listener.events.get(1) instanceof CacheEntryCreatedEvent);
assertEquals(expectedKey, listener.events.get(1).getKey());
assertFalse(listener.events.get(1).isPre());
}
@Listener
public class MyCacheListener {
private List<CacheEntryEvent<String, String>> events = new LinkedList<CacheEntryEvent<String, String>>();
@CacheEntryCreated
public void created(CacheEntryCreatedEvent<String, String> event) {
events.add(event);
}
@CacheEntryModified
public void modified(CacheEntryModifiedEvent<String, String> event) {
events.add(event);
}
@CacheEntryRemoved
public void removed(CacheEntryRemovedEvent<String, String> event) {
events.add(event);
}
}
}