package org.infinispan.notifications.cachelistener; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.context.Flag; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.notifications.Listener; import org.infinispan.notifications.cachelistener.annotation.CacheEntriesEvicted; import org.infinispan.notifications.cachelistener.annotation.CacheEntryActivated; import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated; import org.infinispan.notifications.cachelistener.annotation.CacheEntryInvalidated; import org.infinispan.notifications.cachelistener.annotation.CacheEntryLoaded; import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified; import org.infinispan.notifications.cachelistener.annotation.CacheEntryPassivated; import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved; import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited; import org.infinispan.notifications.cachelistener.annotation.TransactionCompleted; import org.infinispan.notifications.cachelistener.annotation.TransactionRegistered; import org.infinispan.notifications.cachelistener.event.Event; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; import org.testng.annotations.Test; /** * @author Pedro Ruivo * @since 6.0 */ @Test(groups = "functional", testName = "notifications.cachelistener.TransactionSuspendedCacheNotifierTest") @CleanupAfterMethod public class TransactionSuspendedCacheNotifierTest extends SingleCacheManagerTest { public void testTransactionSuspended() throws Exception { TestListener listener = new TestListener(); cache.getAdvancedCache().addListener(listener); assertTrue(cache.isEmpty()); //created cache.put("key", "value"); assertEquals("value", cache.get("key")); //modified cache.put("key", "new-value"); assertEquals("new-value", cache.get("key")); tm().begin(); assertEquals("new-value", cache.get("key")); tm().commit(); //removed cache.remove("key"); assertNull(cache.get("key")); cache.clear(); assertTrue(cache.isEmpty()); if (listener.list.size() > 0) { for (Throwable throwable : listener.list) { log.error("Error in listener...", throwable); } fail("Listener catch some errors"); } } @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder builder = getDefaultStandaloneCacheConfig(true); return TestCacheManagerFactory.createCacheManager(builder); } @Listener(sync = true) public static class TestListener { private final Log log = LogFactory.getLog(TestListener.class); private final List<Throwable> list = Collections.synchronizedList(new ArrayList<Throwable>(2)); @CacheEntryActivated @CacheEntryCreated @CacheEntriesEvicted @CacheEntryInvalidated @CacheEntryLoaded @CacheEntryModified @CacheEntryPassivated @CacheEntryRemoved @CacheEntryVisited @TransactionCompleted @TransactionRegistered public void handle(Event e) { try { Object value = e.getCache().getAdvancedCache().withFlags(Flag.SKIP_LISTENER_NOTIFICATION).get("key"); log.debugf("Event=%s, value=%s", e, value); } catch (Throwable throwable) { list.add(throwable); } } } }