/* * JBoss, Home of Professional Open Source * Copyright 2010 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.client.hotrod; import org.infinispan.Cache; import org.infinispan.commands.VisitableCommand; import org.infinispan.context.InvocationContext; import org.infinispan.interceptors.base.CommandInterceptor; import org.infinispan.manager.CacheContainer; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.server.hotrod.HotRodServer; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.BeforeMethod; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Mircea.Markus@jboss.com * @since 4.1 */ public abstract class HitsAwareCacheManagersTest extends MultipleCacheManagersTest { protected Map<InetSocketAddress, CacheContainer> hrServ2CacheManager = new HashMap<InetSocketAddress, CacheContainer>(); protected Map<InetSocketAddress, HotRodServer> addr2hrServer = new HashMap<InetSocketAddress, HotRodServer>(); @Override @BeforeMethod(alwaysRun=true) public void createBeforeMethod() throws Throwable { if (cleanupAfterMethod()) { hrServ2CacheManager.clear(); addr2hrServer.clear(); } super.createBeforeMethod(); } protected HitCountInterceptor getHitCountInterceptor(Cache<Object, Object> cache) { HitCountInterceptor hitCountInterceptor = null; List<CommandInterceptor> interceptorChain = cache.getAdvancedCache().getInterceptorChain(); for (CommandInterceptor interceptor : interceptorChain) { boolean isHitCountInterceptor = interceptor instanceof HitCountInterceptor; if (hitCountInterceptor != null && isHitCountInterceptor) { throw new IllegalStateException("Two HitCountInterceptors! " + interceptorChain); } if (isHitCountInterceptor) { hitCountInterceptor = (HitCountInterceptor) interceptor; } } return hitCountInterceptor; } protected void assertOnlyServerHit(SocketAddress serverAddress) { CacheContainer cacheContainer = hrServ2CacheManager.get(serverAddress); HitCountInterceptor interceptor = getHitCountInterceptor(cacheContainer.getCache()); assert interceptor.getHits() == 1 : "Expected one hit but received " + interceptor.getHits(); for (CacheContainer cm : hrServ2CacheManager.values()) { if (cm != cacheContainer) { interceptor = getHitCountInterceptor(cm.getCache()); assert interceptor.getHits() == 0 : "Expected 0 hits but got " + interceptor.getHits(); } } } protected void assertNoHits() { for (CacheContainer cm : hrServ2CacheManager.values()) { HitCountInterceptor interceptor = getHitCountInterceptor(cm.getCache()); assert interceptor.getHits() == 0 : "Expected 0 hits but got " + interceptor.getHits(); } } protected InetSocketAddress getAddress(HotRodServer hotRodServer) { InetSocketAddress socketAddress = new InetSocketAddress(hotRodServer.getHost(), hotRodServer.getPort()); addr2hrServer.put(socketAddress, hotRodServer); return socketAddress; } protected void resetStats() { for (EmbeddedCacheManager manager : cacheManagers) { HitCountInterceptor cmi = getHitCountInterceptor(manager.getCache()); cmi.reset(); } } protected void addInterceptors() { for (EmbeddedCacheManager manager : cacheManagers) { addHitCountInterceptor(manager.getCache()); } } private void addHitCountInterceptor(Cache<Object, Object> cache) { HitCountInterceptor interceptor = new HitCountInterceptor(); cache.getAdvancedCache().addInterceptor(interceptor, 1); } private InetSocketAddress getHotRodServerAddress(Cache<Object, Object> cache) { InetSocketAddress addr = null; for (Map.Entry<InetSocketAddress, CacheContainer> entry : hrServ2CacheManager.entrySet()) { if (entry.getValue().equals(cache.getCacheManager())) { addr = entry.getKey(); } } return addr; } /** * @author Mircea.Markus@jboss.com * @since 4.1 */ public static class HitCountInterceptor extends CommandInterceptor{ private volatile int invocationCount; @Override protected Object handleDefault(InvocationContext ctx, VisitableCommand command) throws Throwable { if (ctx.isOriginLocal()) { invocationCount ++; } return super.handleDefault(ctx, command); } public int getHits() { return invocationCount; } public void reset() { invocationCount = 0; } } }