package org.infinispan.cdi.embedded.test.event; import static org.infinispan.cdi.embedded.test.testutil.Deployments.baseDeployment; import static org.mockito.Mockito.mock; import java.util.Arrays; import javax.inject.Inject; import org.infinispan.AdvancedCache; import org.infinispan.cdi.embedded.test.DefaultTestEmbeddedCacheManagerProducer; import org.infinispan.cdi.embedded.test.assertions.ObserverAssertion; import org.infinispan.context.impl.NonTxInvocationContext; import org.infinispan.distribution.ch.ConsistentHash; import org.infinispan.notifications.cachelistener.CacheNotifier; import org.infinispan.notifications.cachemanagerlistener.CacheManagerNotifier; import org.infinispan.remoting.transport.Address; import org.infinispan.topology.CacheTopology; import org.infinispan.transaction.xa.GlobalTransaction; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Tests if event mechanism works correctly in Weld implementation (with Arquillian). * <p> * Note this class depends indirectly on configuration provided in {@link Config} * class. * </p> * * @author Pete Muir * @author Sebastian Laskawiec * @see Config */ @Test(groups = "functional", testName = "cdi.test.event.CacheEventTest") public class CacheEventTest extends Arquillian { private final NonTxInvocationContext invocationContext = new NonTxInvocationContext(null); @Inject @Cache1 private AdvancedCache<String, String> cache1; @Inject @Cache2 private AdvancedCache<String, String> cache2; @Inject private CacheObserver cacheObserver; private CacheNotifier<String, String> cache1Notifier; private CacheManagerNotifier cache1ManagerNotifier; @Deployment public static Archive<?> deployment() { return baseDeployment() .addPackage(CacheEventTest.class.getPackage()) .addClass(DefaultTestEmbeddedCacheManagerProducer.class); } @AfterMethod public void afterMethod() { cache1.clear(); cache2.clear(); cacheObserver.clear(); } @BeforeMethod public void beforeMethod() { cache1Notifier = cache1.getComponentRegistry().getComponent(CacheNotifier.class); cache1ManagerNotifier = cache1.getComponentRegistry().getComponent(CacheManagerNotifier.class); } public void testFiringStartedEventOnNewlyStartedCache() throws Exception { //when cache1.stop(); cache1.start(); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasProperName("cache1").hasStartedEvent(); } public void testFiringStoppedEventWhenStoppingCache() throws Exception { //when cache1.stop(); cache1.start(); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasProperName("cache1").hasStoppedEvent(); } public void testFiringEntryCreatedEventWhenPuttingDataIntoCache() throws Exception { //when cache1.put("pete", "Edinburgh"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryCreatedEvent("pete"); } public void testFiringEntryRemovedEventWhenRemovingDataFromCache() throws Exception { //given cache1.put("pete", "Edinburgh"); //when cache1.remove("pete"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryRemovedEvent("pete"); } public void testFiringEntryActivatedEventWhenUsingCacheNotifier() throws Exception { //when cache1Notifier.notifyCacheEntryActivated("pete", "Edinburgh", true, invocationContext, null); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryActivatedEvent("pete"); } public void testFiringEntriesEvictedWhenEvictingDataInCache() throws Exception { //given cache1.put("pete", "Edinburgh"); //when cache1.evict("pete"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntriesEvictedEvent("pete"); } public void testFiringEntryEvictedWhenEvictingDataInCache() throws Exception { //given cache1.put("pete", "Edinburgh"); //when cache1.evict("pete"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntriesEvictedEvent("pete"); } public void testFiringEntryModifiedEventWhenModifyingEntryInCache() throws Exception { //given cache1.put("pete", "Edinburgh"); //when cache1.put("pete", "Edinburgh2"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryModifiedEvent("pete"); } public void testFiringEntryInvalidatedWhenUsingCacheNotifier() throws Exception { //when cache1Notifier.notifyCacheEntryInvalidated("pete", "Edinburgh", null, true, invocationContext, null); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryInvalidatedEvent("pete"); } public void testFiringEntryLoadedWhenUsingCacheNotifier() throws Exception { //when cache1Notifier.notifyCacheEntryLoaded("pete", "Edinburgh", true, invocationContext, null); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryLoadedEvent("pete"); } public void testFiringEntryPassivatedWhenUsingCacheNotifier() throws Exception { //when cache1Notifier.notifyCacheEntryPassivated("pete", "Edinburgh", true, invocationContext, null); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryPassivatedEvent("pete"); } public void testFiringEntryVisitedWhenUsingCacheNotifier() throws Exception { //when cache1Notifier.notifyCacheEntryVisited("pete", "Edinburgh", true, invocationContext, null); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryVisitedEvent("pete"); } public void testFiringDataRehashedWhenUsingCacheNotifier() throws Exception { //given ConsistentHash mockOldHash = mock(ConsistentHash.class); ConsistentHash mockNewHash = mock(ConsistentHash.class); ConsistentHash mockUnionHash = mock(ConsistentHash.class); //when cache1Notifier.notifyDataRehashed(mockOldHash, mockNewHash, mockUnionHash, 0, true); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasDataRehashEvent(mockNewHash); } public void testFiringTransactionCompletedWhenUsingCacheNotifier() throws Exception { //given GlobalTransaction mockGlobalTransaction = mock(GlobalTransaction.class); //when cache1Notifier.notifyTransactionCompleted(mockGlobalTransaction, true, invocationContext); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasTransactionCompletedEvent(true); } public void testFiringTransactionRegisteredWhenUsingCacheNotifier() throws Exception { //given GlobalTransaction mockGlobalTransaction = mock(GlobalTransaction.class); //when cache1Notifier.notifyTransactionRegistered(mockGlobalTransaction, true); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasTransactionRegisteredEvent(true); } public void testFiringViewChangedWhenUsingCacheManagerNotifier() throws Exception { //given Address mockMyAddress = mock(Address.class); //when cache1ManagerNotifier.notifyViewChange(Arrays.asList(mockMyAddress), Arrays.asList(mockMyAddress), mockMyAddress, 0); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasViewChangedEvent(mockMyAddress); } public void testFiringTopologyChangedWhenUsingCacheManagerNotifier() throws Exception { //given CacheTopology mockCacheTopology = mock(CacheTopology.class); //when cache1Notifier.notifyTopologyChanged(mockCacheTopology, mockCacheTopology, 0, true); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasTopologyChangedEvent(0); } public void testSendingEventToProperEventObservers() throws Exception { //given cache1.put("cache1", "for cache1"); cache2.put("cache2", "for cache2"); //when cache1.remove("cache1"); //then ObserverAssertion.assertThat(cacheObserver, Cache1.class).hasEntryCreatedEvent("cache1").hasEntryRemovedEvent("cache1"); ObserverAssertion.assertThat(cacheObserver, Cache2.class).hasEntryCreatedEvent("cache2"); } }