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.Arrays; import java.util.Collection; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.metadata.Metadata; import org.infinispan.notifications.cachelistener.event.CacheEntryCreatedEvent; import org.infinispan.notifications.cachelistener.event.Event; import org.infinispan.notifications.cachelistener.filter.AbstractCacheEventFilterConverter; import org.infinispan.notifications.cachelistener.filter.CacheEventConverter; import org.infinispan.notifications.cachelistener.filter.EventType; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * This test is to make sure that when more than 1 listener is installed they don't affect each other * * @author wburns * @since 7.0 */ @Test(groups = "functional", testName = "notifications.cachelistener.MultipleListenerConverterTest") public class MultipleListenerConverterTest extends SingleCacheManagerTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { return TestCacheManagerFactory.createCacheManager(); } private static class StringConverter implements CacheEventConverter<Object, Object, String> { private final String append; public StringConverter(String append) { this.append = append; } @Override public String convert(Object key, Object oldValue, Metadata oldMetadata, Object newValue, Metadata newMetadata, EventType eventType) { return String.valueOf(newValue) + "-" + append; } } private static class StringFilterConverter extends AbstractCacheEventFilterConverter { private final String append; public StringFilterConverter(String append) { this.append = append; } @Override public Object filterAndConvert(Object key, Object oldValue, Metadata oldMetadata, Object newValue, Metadata newMetadata, EventType eventType) { return String.valueOf(newValue) + "-" + append; } } public void testMultipleListenersWithDifferentConverters() { CacheListener listener1 = new CacheListener(); CacheListener listener2 = new CacheListener(); CacheListener listener3 = new CacheListener(); cache.addListener(listener1, null, new StringConverter("listener-1")); cache.addListener(listener2, null, new StringConverter("listener-2")); cache.addListener(listener3, null, new StringConverter("listener-3")); insertKeyValueAndVerifyListenerNotifications(Arrays.asList(listener1, listener2, listener3)); } public void testMultipleListenersWithDifferentFilterConverters() { CacheListener listener1 = new CacheListener(); CacheListener listener2 = new CacheListener(); CacheListener listener3 = new CacheListener(); StringFilterConverter filterConverter1 = new StringFilterConverter("listener-1"); StringFilterConverter filterConverter2 = new StringFilterConverter("listener-2"); StringFilterConverter filterConverter3 = new StringFilterConverter("listener-3"); cache.addListener(listener1, filterConverter1, filterConverter1); cache.addListener(listener2, filterConverter2, filterConverter2); cache.addListener(listener3, filterConverter3, filterConverter3); insertKeyValueAndVerifyListenerNotifications(Arrays.asList(listener1, listener2, listener3)); } private void insertKeyValueAndVerifyListenerNotifications(Collection<CacheListener> listeners) { cache.put("key", "value"); int i = 1; for (CacheListener listener : listeners) { assertEquals("Listener" + i + "failed", 2, listener.getEvents().size()); Event event = listener.getEvents().get(0); assertEquals("Listener" + i + "failed", Event.Type.CACHE_ENTRY_CREATED, event.getType()); CacheEntryCreatedEvent createdEvent = (CacheEntryCreatedEvent) event; assertTrue("Listener" + i + "failed", createdEvent.isPre()); assertEquals("Listener" + i + "failed", "key", createdEvent.getKey()); assertEquals("Listener" + i + "failed", "null-listener-" + i, createdEvent.getValue()); event = listener.getEvents().get(1); assertEquals("Listener" + i + "failed", Event.Type.CACHE_ENTRY_CREATED, event.getType()); createdEvent = (CacheEntryCreatedEvent) event; assertFalse("Listener" + i + "failed", createdEvent.isPre()); assertEquals("Listener" + i + "failed", "key", createdEvent.getKey()); assertEquals("Listener" + i + "failed", "value-listener-" + i,createdEvent.getValue()); ++i; } } }