package org.infinispan.jmx;
import static org.infinispan.test.TestingUtil.checkMBeanOperationParameterNaming;
import static org.infinispan.test.TestingUtil.getCacheObjectName;
import static org.infinispan.test.TestingUtil.k;
import static org.infinispan.test.TestingUtil.v;
import static org.testng.AssertJUnit.assertEquals;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.infinispan.AdvancedCache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.eviction.EvictionStrategy;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.persistence.dummy.DummyInMemoryStoreConfigurationBuilder;
import org.infinispan.persistence.spi.AdvancedLoadWriteStore;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
/**
* Test functionality in {@link org.infinispan.interceptors.CacheMgmtInterceptor}.
*
* @author Mircea.Markus@jboss.com
* @author Galder ZamarreƱo
*/
@Test(groups = "functional", testName = "jmx.CacheMgmtInterceptorMBeanTest")
public class CacheMgmtInterceptorMBeanTest extends SingleCacheManagerTest {
private ObjectName mgmtInterceptor;
private MBeanServer server;
AdvancedCache<?, ?> advanced;
AdvancedLoadWriteStore loader;
private static final String JMX_DOMAIN = CacheMgmtInterceptorMBeanTest.class.getSimpleName();
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
cacheManager = TestCacheManagerFactory.createCacheManagerEnforceJmxDomain(JMX_DOMAIN);
ConfigurationBuilder configuration = getDefaultStandaloneCacheConfig(false);
configuration.eviction().strategy(EvictionStrategy.LRU).size(1)
.persistence()
.passivation(true)
.addStore(DummyInMemoryStoreConfigurationBuilder.class);
configuration.jmxStatistics().enable();
cacheManager.defineConfiguration("test", configuration.build());
cache = cacheManager.getCache("test");
advanced = cache.getAdvancedCache();
mgmtInterceptor = getCacheObjectName(JMX_DOMAIN, "test(local)", "Statistics");
loader = (AdvancedLoadWriteStore) TestingUtil.getFirstLoader(cache);
server = PerThreadMBeanServerLookup.getThreadMBeanServer();
return cacheManager;
}
@AfterMethod
public void resetStats() throws Exception {
server.invoke(mgmtInterceptor, "resetStatistics", new Object[0], new String[0]);
}
public void testJmxOperationMetadata() throws Exception {
checkMBeanOperationParameterNaming(mgmtInterceptor);
}
public void testEviction(Method m) throws Exception {
assertEvictions(0);
assert cache.get(k(m, "1")) == null;
cache.put(k(m, "1"), v(m, 1));
//test explicit evict command
cache.evict(k(m, "1"));
assert loader.contains(k(m, "1")) : "the entry should have been evicted";
assertEvictions(1);
assert cache.get(k(m, "1")).equals(v(m, 1));
//test implicit eviction
cache.put(k(m, "2"), v(m, 2));
assert loader.contains(k(m, "1")) : "the entry should have been evicted";
assertEvictions(2);
}
public void testGetKeyValue() throws Exception {
assertMisses(0);
assertHits(0);
assert 0 == advanced.getStats().getHits();
assertAttributeValue("HitRatio", 0);
cache.put("key", "value");
assertMisses(0);
assertHits(0);
assertAttributeValue("HitRatio", 0);
assert cache.get("key").equals("value");
assertMisses(0);
assertHits(1);
assertAttributeValue("HitRatio", 1);
assert cache.get("key_ne") == null;
assert cache.get("key_ne") == null;
assert cache.get("key_ne") == null;
assertMisses(3);
assertHits(1);
assertAttributeValue("HitRatio", 0.25f);
}
public void testStores() throws Exception {
assertEvictions(0);
assertStores(0);
cache.put("key", "value");
assertStores(1);
cache.put("key", "value");
assertStores(2);
assertCurrentNumberOfEntries(1);
cache.evict("key");
assertCurrentNumberOfEntriesInMemory(0);
assertCurrentNumberOfEntries(1);
Map<String, String> toAdd = new HashMap<>();
toAdd.put("key", "value");
toAdd.put("key2", "value2");
cache.putAll(toAdd);
assertStores(4);
assertCurrentNumberOfEntriesInMemory(1);
assertCurrentNumberOfEntries(2);
resetStats();
toAdd = new HashMap<>();
toAdd.put("key3", "value3");
toAdd.put("key4", "value4");
cache.putAll(toAdd);
assertStores(2);
assertCurrentNumberOfEntriesInMemory(1);
assertCurrentNumberOfEntries(4);
}
public void testStoresPutForExternalRead() throws Exception {
assertStores(0);
cache.putForExternalRead("key", "value");
assertStores(1);
cache.putForExternalRead("key", "value");
assertStores(1);
}
public void testStoresPutIfAbsent() throws Exception {
assertStores(0);
cache.putIfAbsent("voooo", "doooo");
assertStores(1);
cache.putIfAbsent("voooo", "no-doooo");
assertStores(1);
}
public void testRemoves() throws Exception {
assertStores(0);
assertRemoveHits(0);
assertRemoveMisses(0);
cache.put("key", "value");
cache.put("key2", "value2");
cache.put("key3", "value3");
assertStores(3);
assertRemoveHits(0);
assertRemoveMisses(0);
cache.remove("key");
cache.remove("key3");
cache.remove("key4");
assertRemoveHits(2);
assertRemoveMisses(1);
cache.remove("key2");
assertRemoveHits(3);
assertRemoveMisses(1);
}
public void testGetAll() throws Exception {
assertEquals(0, advanced.getStats().getMisses());
assertEquals(0, advanced.getStats().getHits());
String hitRatioString = server.getAttribute(mgmtInterceptor, "HitRatio").toString();
Float hitRatio = Float.parseFloat(hitRatioString);
assertEquals(0f, hitRatio);
cache.put("key", "value");
assertEquals(0, advanced.getStats().getMisses());
assertEquals(0, advanced.getStats().getHits());
hitRatioString = server.getAttribute(mgmtInterceptor, "HitRatio").toString();
hitRatio = Float.parseFloat(hitRatioString);
assertEquals(0f, hitRatio);
Set<String> keySet = new HashSet<>();
keySet.add("key");
keySet.add("key1");
advanced.getAll(keySet);
assertEquals(1, advanced.getStats().getMisses());
assertEquals(1, advanced.getStats().getHits());
hitRatioString = server.getAttribute(mgmtInterceptor, "HitRatio").toString();
hitRatio = Float.parseFloat(hitRatioString);
assertEquals(0.5f, hitRatio);
}
private void assertAttributeValue(String attrName, float expectedValue) throws Exception {
String receivedVal = server.getAttribute(mgmtInterceptor, attrName).toString();
assert Float.parseFloat(receivedVal) == expectedValue : "expecting " + expectedValue + " for " + attrName + ", but received " + receivedVal;
}
private void assertEvictions(float expectedValue) throws Exception {
assertAttributeValue("Evictions", expectedValue);
assert expectedValue == advanced.getStats().getEvictions();
}
private void assertMisses(float expectedValue) throws Exception {
assertAttributeValue("Misses", expectedValue);
assert expectedValue == advanced.getStats().getMisses();
}
private void assertHits(float expectedValue) throws Exception {
assertAttributeValue("Hits", expectedValue);
assert expectedValue == advanced.getStats().getHits();
}
private void assertStores(float expectedValue) throws Exception {
assertAttributeValue("Stores", expectedValue);
assert expectedValue == advanced.getStats().getStores();
}
private void assertRemoveHits(float expectedValue) throws Exception {
assertAttributeValue("RemoveHits", expectedValue);
assert expectedValue == advanced.getStats().getRemoveHits();
}
private void assertRemoveMisses(float expectedValue) throws Exception {
assertAttributeValue("RemoveMisses", expectedValue);
assert expectedValue == advanced.getStats().getRemoveMisses();
}
private void assertCurrentNumberOfEntries(float expectedValue) throws Exception {
assertAttributeValue("NumberOfEntries", expectedValue);
assert expectedValue == advanced.getStats().getCurrentNumberOfEntries();
}
private void assertCurrentNumberOfEntriesInMemory(float expectedValue) throws Exception {
assertAttributeValue("NumberOfEntriesInMemory", expectedValue);
assert expectedValue == advanced.getStats().getCurrentNumberOfEntriesInMemory();
}
}