/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.manager;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.container.DataContainer;
import org.infinispan.eviction.EvictionStrategy;
import org.infinispan.lifecycle.ComponentStatus;
import org.infinispan.loaders.CacheLoaderManager;
import org.infinispan.loaders.dummy.DummyInMemoryCacheStore;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.CacheManagerCallable;
import org.infinispan.test.MultiCacheManagerCallable;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.util.concurrent.IsolationLevel;
import org.testng.annotations.Test;
import java.lang.reflect.Method;
import java.util.Set;
import static org.infinispan.test.TestingUtil.*;
import static org.infinispan.test.TestingUtil.withCacheManager;
/**
* @author Manik Surtani
* @since 4.0
*/
@Test(groups = "functional", testName = "manager.CacheManagerTest")
public class CacheManagerTest extends AbstractInfinispanTest {
public void testDefaultCache() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
assert cm.getCache().getStatus() == ComponentStatus.RUNNING;
assert cm.getCache().getName().equals(CacheContainer.DEFAULT_CACHE_NAME);
try {
cm.defineConfiguration(CacheContainer.DEFAULT_CACHE_NAME, new ConfigurationBuilder().build());
assert false : "Should fail";
}
catch (IllegalArgumentException e) {
assert true; // ok
}
} finally {
TestingUtil.killCacheManagers(cm);
}
}
public void testUnstartedCachemanager() throws Exception {
withCacheManager(new CacheManagerCallable(new DefaultCacheManager(false)){
@Override
public void call() throws Exception {
assert cm.getStatus().equals(ComponentStatus.INSTANTIATED);
assert !cm.getStatus().allowInvocations();
Cache<Object, Object> cache = cm.getCache();
cache.put("k","v");
assert cache.get("k").equals("v");
}
});
}
public void testClashingNames() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
ConfigurationBuilder c = new ConfigurationBuilder();
Configuration firstDef = cm.defineConfiguration("aCache", c.build());
Configuration secondDef = cm.defineConfiguration("aCache", c.build());
assert firstDef.equals(secondDef);
} finally {
TestingUtil.killCacheManagers(cm);
}
}
public void testStartAndStop() {
CacheContainer cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Cache c1 = cm.getCache("cache1");
Cache c2 = cm.getCache("cache2");
Cache c3 = cm.getCache("cache3");
assert c1.getStatus() == ComponentStatus.RUNNING;
assert c2.getStatus() == ComponentStatus.RUNNING;
assert c3.getStatus() == ComponentStatus.RUNNING;
cm.stop();
assert c1.getStatus() == ComponentStatus.TERMINATED;
assert c2.getStatus() == ComponentStatus.TERMINATED;
assert c3.getStatus() == ComponentStatus.TERMINATED;
} finally {
TestingUtil.killCacheManagers(cm);
}
}
public void testDefiningConfigurationValidation() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
cm.defineConfiguration("cache1", (Configuration) null);
assert false : "Should fail";
} catch(NullPointerException npe) {
assert npe.getMessage() != null;
}
try {
cm.defineConfiguration(null, (Configuration) null);
assert false : "Should fail";
} catch(NullPointerException npe) {
assert npe.getMessage() != null;
}
try {
cm.defineConfiguration(null, new org.infinispan.config.Configuration());
assert false : "Should fail";
} catch(NullPointerException npe) {
assert npe.getMessage() != null;
}
org.infinispan.config.Configuration c = cm.defineConfiguration("cache1", null, new org.infinispan.config.Configuration());
assert c.equalsIgnoreName(cm.getDefaultConfiguration()) ;
c = cm.defineConfiguration("cache1", "does-not-exist-cache", new org.infinispan.config.Configuration());
assert c.equalsIgnoreName(cm.getDefaultConfiguration());
}
public void testDefiningConfigurationWithTemplateName() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
org.infinispan.config.Configuration c = new org.infinispan.config.Configuration();
c.setIsolationLevel(IsolationLevel.NONE);
org.infinispan.config.Configuration oneCacheConfiguration = cm.defineConfiguration("oneCache", c);
assert oneCacheConfiguration.equalsIgnoreName(c) ;
assert oneCacheConfiguration.getIsolationLevel().equals(IsolationLevel.NONE);
c = new org.infinispan.config.Configuration();
org.infinispan.config.Configuration secondCacheConfiguration = cm.defineConfiguration("secondCache", "oneCache", c);
assert oneCacheConfiguration.equalsIgnoreName(secondCacheConfiguration) ;
assert secondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.NONE);
c = new org.infinispan.config.Configuration();
c.setIsolationLevel(IsolationLevel.SERIALIZABLE);
org.infinispan.config.Configuration anotherSecondCacheConfiguration = cm.defineConfiguration("secondCache", "oneCache", c);
assert !secondCacheConfiguration.equals(anotherSecondCacheConfiguration);
assert anotherSecondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.SERIALIZABLE);
assert secondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.NONE);
c = new org.infinispan.config.Configuration();
c.setExpirationMaxIdle(Long.MAX_VALUE);
org.infinispan.config.Configuration yetAnotherSecondCacheConfiguration = cm.defineConfiguration("secondCache", "oneCache", c);
assert yetAnotherSecondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.NONE);
assert yetAnotherSecondCacheConfiguration.getExpirationMaxIdle() == Long.MAX_VALUE;
assert secondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.NONE);
assert anotherSecondCacheConfiguration.getIsolationLevel().equals(IsolationLevel.SERIALIZABLE);
}
public void testDefiningConfigurationOverridingBooleans() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
org.infinispan.config.Configuration c = new org.infinispan.config.Configuration();
c.fluent().storeAsBinary();
org.infinispan.config.Configuration lazy = cm.defineConfiguration("storeAsBinary", c);
assert lazy.isStoreAsBinary();
c = new org.infinispan.config.Configuration();
c.fluent().eviction().strategy(EvictionStrategy.LRU).maxEntries(1);
org.infinispan.config.Configuration lazyLru = cm.defineConfiguration("lazyDeserializationWithLRU", "storeAsBinary", c);
assert lazy.isStoreAsBinary();
assert lazyLru.getEvictionStrategy() == EvictionStrategy.LRU;
}
public void testDefineConfigurationTwice() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Configuration override = new ConfigurationBuilder().invocationBatching().enable().build();
assert override.invocationBatching().enabled();
assert cm.defineConfiguration("test1", override).invocationBatching().enabled();
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.read(override);
Configuration config = cb.build();
assert config.invocationBatching().enabled();
assert cm.defineConfiguration("test2", config).invocationBatching().enabled();
} finally {
cm.stop();
}
}
public void testGetCacheNames() {
EmbeddedCacheManager cm = TestCacheManagerFactory.createLocalCacheManager(false);
try {
cm.defineConfiguration("one", new ConfigurationBuilder().build());
cm.defineConfiguration("two", new ConfigurationBuilder().build());
cm.getCache("three");
Set<String> cacheNames = cm.getCacheNames();
assert 3 == cacheNames.size();
assert cacheNames.contains("one");
assert cacheNames.contains("two");
assert cacheNames.contains("three");
} finally {
cm.stop();
}
}
public void testCacheStopTwice() {
EmbeddedCacheManager localCacheManager = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Cache cache = localCacheManager.getCache();
cache.put("k", "v");
cache.stop();
cache.stop();
} finally {
TestingUtil.killCacheManagers(localCacheManager);
}
}
public void testCacheManagerStopTwice() {
EmbeddedCacheManager localCacheManager = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Cache cache = localCacheManager.getCache();
cache.put("k", "v");
localCacheManager.stop();
localCacheManager.stop();
} finally {
TestingUtil.killCacheManagers(localCacheManager);
}
}
@Test(expectedExceptions = IllegalStateException.class)
public void testCacheStopManagerStopFollowedByGetCache() {
EmbeddedCacheManager localCacheManager = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Cache cache = localCacheManager.getCache();
cache.put("k", "v");
cache.stop();
localCacheManager.stop();
localCacheManager.getCache();
} finally {
TestingUtil.killCacheManagers(localCacheManager);
}
}
@Test(expectedExceptions = IllegalStateException.class)
public void testCacheStopManagerStopFollowedByCacheOp() {
EmbeddedCacheManager localCacheManager = TestCacheManagerFactory.createLocalCacheManager(false);
try {
Cache cache = localCacheManager.getCache();
cache.put("k", "v");
cache.stop();
localCacheManager.stop();
cache.put("k", "v2");
} finally {
TestingUtil.killCacheManagers(localCacheManager);
}
}
public void testRemoveNonExistentCache(Method m) {
EmbeddedCacheManager manager = getManagerWithStore(m, false, false);
try {
manager.getCache("cache");
// An attempt to remove a non-existing cache should be a no-op
manager.removeCache("does-not-exist");
} finally {
manager.stop();
}
}
public void testRemoveCacheLocal(Method m) {
EmbeddedCacheManager manager = getManagerWithStore(m, false, false);
try {
Cache cache = manager.getCache("cache");
cache.put(k(m, 1), v(m, 1));
cache.put(k(m, 2), v(m, 2));
cache.put(k(m, 3), v(m, 3));
DummyInMemoryCacheStore store = getDummyStore(cache);
DataContainer data = getDataContainer(cache);
assert !store.isEmpty();
assert 0 != data.size(null);
manager.removeCache("cache");
assert store.isEmpty();
assert 0 == data.size(null);
// Try removing the cache again, it should be a no-op
manager.removeCache("cache");
assert store.isEmpty();
assert 0 == data.size(null);
} finally {
manager.stop();
}
}
public void testRemoveCacheClusteredLocalStores(Method m) throws Exception {
doTestRemoveCacheClustered(m, false);
}
public void testRemoveCacheClusteredSharedStores(Method m) throws Exception {
doTestRemoveCacheClustered(m, true);
}
private EmbeddedCacheManager getManagerWithStore(Method m, boolean isClustered, boolean isStoreShared) {
return getManagerWithStore(m, isClustered, isStoreShared, "store-");
}
private EmbeddedCacheManager getManagerWithStore(Method m, boolean isClustered, boolean isStoreShared, String storePrefix) {
String storeName = storePrefix + m.getName();
ConfigurationBuilder c = new ConfigurationBuilder();
c
.loaders()
.shared(isStoreShared).addCacheLoader().cacheLoader(new DummyInMemoryCacheStore(storeName))
.clustering()
.cacheMode(isClustered ? CacheMode.REPL_SYNC : CacheMode.LOCAL);
return TestCacheManagerFactory.createClusteredCacheManager(c);
}
private void doTestRemoveCacheClustered(final Method m, final boolean isStoreShared) throws Exception {
withCacheManagers(new MultiCacheManagerCallable(
getManagerWithStore(m, true, isStoreShared, "store1-"),
getManagerWithStore(m, true, isStoreShared, "store2-")) {
@Override
public void call() throws Exception {
EmbeddedCacheManager manager1 = cms[0];
EmbeddedCacheManager manager2 = cms[0];
Cache cache1 = manager1.getCache("cache", true);
Cache cache2 = manager2.getCache("cache", true);
assert cache1 != null;
assert cache2 != null;
assert manager1.cacheExists("cache");
assert manager2.cacheExists("cache");
cache1.put(k(m, 1), v(m, 1));
cache1.put(k(m, 2), v(m, 2));
cache1.put(k(m, 3), v(m, 3));
cache2.put(k(m, 4), v(m, 4));
cache2.put(k(m, 5), v(m, 5));
DummyInMemoryCacheStore store1 = getDummyStore(cache1);
DataContainer data1 = getDataContainer(cache1);
DummyInMemoryCacheStore store2 = getDummyStore(cache2);
DataContainer data2 = getDataContainer(cache2);
assert !store1.isEmpty();
assert 5 == data1.size(null);
assert !store2.isEmpty();
assert 5 == data2.size(null);
manager1.removeCache("cache");
assert !manager1.cacheExists("cache");
assert !manager2.cacheExists("cache");
assert null == manager1.getCache("cache", false);
assert null == manager2.getCache("cache", false);
assert store1.isEmpty();
assert 0 == data1.size(null);
assert store2.isEmpty();
assert 0 == data2.size(null);
}
});
}
private DummyInMemoryCacheStore getDummyStore(Cache cache1) {
return (DummyInMemoryCacheStore)
TestingUtil.extractComponent(cache1, CacheLoaderManager.class).getCacheLoader();
}
private DataContainer getDataContainer(Cache cache) {
return TestingUtil.extractComponent(cache, DataContainer.class);
}
}