package org.infinispan.manager;
import static org.infinispan.commons.api.BasicCacheContainer.DEFAULT_CACHE_NAME;
import static org.testng.AssertJUnit.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.lifecycle.ComponentStatus;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStopped;
import org.infinispan.notifications.cachemanagerlistener.event.CacheStoppedEvent;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.fwk.CleanupAfterMethod;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
/**
* @author gustavonalle
* @since 7.0
*/
@Test(groups = "functional", testName = "manager.CacheDependencyTest")
@CleanupAfterMethod
public class CacheDependencyTest extends SingleCacheManagerTest {
@Test
public void testExplicitStop() {
cacheManager.defineConfiguration("A", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("B", new ConfigurationBuilder().build());
Cache<?, ?> cacheA = cacheManager.getCache("A");
Cache<?, ?> cacheB = cacheManager.getCache("B");
cacheManager.addCacheDependency("A", "B");
cacheB.stop();
cacheA.stop();
assertAllTerminated(cacheA, cacheB);
}
@Test
public void testDependencyOnStoppedCaches() {
cacheManager.defineConfiguration("A", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("B", new ConfigurationBuilder().build());
Cache<?, ?> cacheA = cacheManager.getCache("A");
Cache<?, ?> cacheB = cacheManager.getCache("B");
cacheA.stop();
cacheManager.addCacheDependency("A", "B");
CacheEventListener listener = new CacheEventListener();
cacheManager.addListener(listener);
cacheManager.stop();
assertAllTerminated(cacheA, cacheB);
assertEquals(Arrays.asList("B", DEFAULT_CACHE_NAME), listener.stopOrder);
}
@Test
public void testCyclicDependencies() {
cacheManager.defineConfiguration("A", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("B", new ConfigurationBuilder().build());
Cache<?, ?> cacheA = cacheManager.getCache("A");
Cache<?, ?> cacheB = cacheManager.getCache("B");
cacheManager.addCacheDependency("A", "B");
cacheManager.addCacheDependency("B", "A");
// Order will not be enforced
cacheManager.stop();
assertAllTerminated(cacheA, cacheB);
}
@Test
public void testStopCacheManager() {
CacheEventListener listener = new CacheEventListener();
cacheManager.addListener(listener);
cacheManager.defineConfiguration("A", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("B", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("C", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("D", new ConfigurationBuilder().build());
Cache<?, ?> cacheA = cacheManager.getCache("A");
Cache<?, ?> cacheB = cacheManager.getCache("B");
Cache<?, ?> cacheC = cacheManager.getCache("C");
Cache<?, ?> cacheD = cacheManager.getCache("D");
cacheManager.addCacheDependency("A", "B");
cacheManager.addCacheDependency("A", "C");
cacheManager.addCacheDependency("A", "D");
cacheManager.addCacheDependency("B", "C");
cacheManager.addCacheDependency("B", "D");
cacheManager.addCacheDependency("D", "C");
cacheManager.stop();
assertAllTerminated(cacheA, cacheB, cacheC, cacheD);
assertEquals(Arrays.asList("A", "B", "D", "C", DEFAULT_CACHE_NAME), listener.stopOrder);
}
@Test
public void testRemoveCache() {
cacheManager.defineConfiguration("A", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("B", new ConfigurationBuilder().build());
cacheManager.defineConfiguration("C", new ConfigurationBuilder().build());
Cache<?, ?> cacheA = cacheManager.getCache("A");
Cache<?, ?> cacheB = cacheManager.getCache("B");
Cache<?, ?> cacheC = cacheManager.getCache("C");
cacheManager.addCacheDependency("A", "B");
cacheManager.addCacheDependency("A", "C");
cacheManager.addCacheDependency("B", "C");
cacheManager.removeCache("B");
CacheEventListener listener = new CacheEventListener();
cacheManager.addListener(listener);
cacheManager.stop();
assertAllTerminated(cacheA, cacheB, cacheC);
assertEquals(Arrays.asList("A", "C", DEFAULT_CACHE_NAME), listener.stopOrder);
}
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
return TestCacheManagerFactory.createCacheManager();
}
@Listener
private static final class CacheEventListener {
private final List<String> stopOrder = new ArrayList<>();
@CacheStopped
public void cacheStopped(CacheStoppedEvent cse) {
stopOrder.add(cse.getCacheName());
}
}
private void assertAllTerminated(Cache<?, ?>... caches) {
for (Cache<?, ?> cache : caches) {
assert cache.getStatus() == ComponentStatus.TERMINATED;
}
}
}