package org.infinispan.jmx; 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.Map; import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.ObjectName; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.eviction.EvictionStrategy; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.marshall.core.MarshalledEntryImpl; 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; /** * Tester class for ActivationInterceptor and PassivationInterceptor. * * @author Mircea.Markus@jboss.com * @author Galder ZamarreƱo */ @Test(groups = "functional", testName = "jmx.ActivationAndPassivationInterceptorMBeanTest") public class ActivationAndPassivationInterceptorMBeanTest extends SingleCacheManagerTest { private static final String JMX_DOMAIN = ActivationAndPassivationInterceptorMBeanTest.class.getSimpleName(); AdvancedLoadWriteStore loader; MBeanServer threadMBeanServer; final ObjectName activationInterceptorObjName = getCacheObjectName(JMX_DOMAIN, "___defaultcache(local)", "Activation"); final ObjectName passivationInterceptorObjName = getCacheObjectName(JMX_DOMAIN, "___defaultcache(local)", "Passivation"); protected EmbeddedCacheManager createCacheManager() throws Exception { GlobalConfigurationBuilder globalBuilder = new GlobalConfigurationBuilder(); globalBuilder.globalJmxStatistics() .mBeanServerLookup(new PerThreadMBeanServerLookup()) .jmxDomain(JMX_DOMAIN) .enable(); ConfigurationBuilder builder = new ConfigurationBuilder(); builder.eviction().strategy(EvictionStrategy.LRU).maxEntries(1) .jmxStatistics().enable() .persistence() .passivation(true) .addStore(DummyInMemoryStoreConfigurationBuilder.class); // Do not initiliaze this in instance declaration since a different // thread will be used when running from maven, breaking the thread local threadMBeanServer = PerThreadMBeanServerLookup.getThreadMBeanServer(); return TestCacheManagerFactory.createCacheManager(globalBuilder, builder, true); } @Override protected void setup() throws Exception { super.setup(); loader = (AdvancedLoadWriteStore) TestingUtil.getFirstLoader(cache); } @AfterMethod public void resetStats() throws Exception { threadMBeanServer.invoke(activationInterceptorObjName, "resetStatistics", new Object[0], new String[0]); } public void testDisableStatistics() throws Exception { threadMBeanServer.setAttribute(activationInterceptorObjName, new Attribute("StatisticsEnabled", Boolean.FALSE)); assert threadMBeanServer.getAttribute(activationInterceptorObjName, "Activations").toString().equals("N/A"); threadMBeanServer.setAttribute(activationInterceptorObjName, new Attribute("StatisticsEnabled", Boolean.TRUE)); } private StreamingMarshaller marshaller() { return cache.getAdvancedCache().getComponentRegistry().getCacheMarshaller(); } public void testActivationOnGet(Method m) throws Exception { assertActivationCount(0); assert cache.get(k(m)) == null; assertActivationCount(0); loader.write(new MarshalledEntryImpl(k(m), v(m), null, marshaller())); assert loader.contains(k(m)); assert cache.get(k(m)).equals(v(m)); assertActivationCount(1); assert !loader.contains(k(m)); } public void testActivationOnPut(Method m) throws Exception { assertActivationCount(0); assert cache.get(k(m)) == null; assertActivationCount(0); loader.write(new MarshalledEntryImpl(k(m), v(m), null, marshaller())); assert loader.contains(k(m)); cache.put(k(m), v(m, 2)); assert cache.get(k(m)).equals(v(m, 2)); assertActivationCount(1); assert !loader.contains(k(m)) : "this should only be persisted on evict"; } public void testActivationOnReplace(Method m) throws Exception { assertActivationCount(0); assert cache.get(k(m)) == null; assertActivationCount(0); loader.write(new MarshalledEntryImpl(k(m), v(m), null, marshaller())); assert loader.contains(k(m)); assert cache.replace(k(m), v(m, 2)).equals(v(m)); assertActivationCount(1); assert !loader.contains(k(m)); } public void testActivationOnPutMap(Method m) throws Exception { assertActivationCount(0); assert cache.get(k(m)) == null; assertActivationCount(0); loader.write(new MarshalledEntryImpl(k(m), v(m), null, marshaller())); assert loader.contains(k(m)); Map<String, String> toAdd = new HashMap<String, String>(); toAdd.put(k(m), v(m, 2)); cache.putAll(toAdd); assertActivationCount(1); assert cache.get(k(m)).equals(v(m, 2)); assert !loader.contains(k(m)); } public void testPassivationOnEvict(Method m) throws Exception { assertPassivationCount(0); cache.put(k(m), v(m)); cache.put(k(m, 2), v(m, 2)); cache.evict(k(m)); assertPassivationCount(1); cache.evict(k(m, 2)); assertPassivationCount(2); cache.evict("not_existing_key"); assertPassivationCount(2); } private void assertActivationCount(int activationCount) throws Exception { assert Integer.valueOf(threadMBeanServer.getAttribute( activationInterceptorObjName, "Activations").toString()) .equals(activationCount); } private void assertPassivationCount(int activationCount) throws Exception { Object passivations = threadMBeanServer.getAttribute( passivationInterceptorObjName, "Passivations"); assertEquals(activationCount, Integer.valueOf(passivations.toString()).intValue()); } }