/* * Copyright 2005 Werner Guttmann, Ralf Joachim * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.castor.cache; import java.util.Collection; import java.util.Iterator; import java.util.Properties; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.castor.cache.distributed.CoherenceCache; import org.castor.cache.distributed.CoherenceCacheFactory; import org.castor.cache.distributed.EHCache; import org.castor.cache.distributed.EHCacheFactory; import org.castor.cache.distributed.FKCache; import org.castor.cache.distributed.FKCacheFactory; import org.castor.cache.distributed.GigaspacesCache; import org.castor.cache.distributed.GigaspacesCacheFactory; import org.castor.cache.distributed.JCache; import org.castor.cache.distributed.JCacheFactory; import org.castor.cache.distributed.JcsCache; import org.castor.cache.distributed.JcsCacheFactory; import org.castor.cache.distributed.OsCache; import org.castor.cache.distributed.OsCacheFactory; import org.castor.cache.hashbelt.FIFOHashbelt; import org.castor.cache.hashbelt.FIFOHashbeltFactory; import org.castor.cache.hashbelt.LRUHashbelt; import org.castor.cache.hashbelt.LRUHashbeltFactory; import org.castor.cache.simple.CountLimited; import org.castor.cache.simple.CountLimitedFactory; import org.castor.cache.simple.NoCache; import org.castor.cache.simple.NoCacheFactory; import org.castor.cache.simple.TimeLimited; import org.castor.cache.simple.TimeLimitedFactory; import org.castor.cache.simple.Unlimited; import org.castor.cache.simple.UnlimitedFactory; import org.castor.core.util.AbstractProperties; import org.castor.core.util.PropertiesException; import org.castor.cpa.CPAProperties; /** * @author <a href="mailto:werner DOT guttmann AT gmx DOT net">Werner Guttmann</a> * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> * @version $Revision$ $Date: 2006-04-29 04:11:14 -0600 (Sat, 29 Apr 2006) $ * @since 1.0 */ public final class TestCacheFactoryRegistry extends TestCase { private static final boolean DISABLE_LOGGING = true; private CacheFactoryRegistry _registry; public static Test suite() { TestSuite suite = new TestSuite("CacheFactoryRegistry Tests"); suite.addTest(new TestCacheFactoryRegistry("testConstructor")); suite.addTest(new TestCacheFactoryRegistry("testGetCacheNames")); suite.addTest(new TestCacheFactoryRegistry("testGetCacheFactories")); suite.addTest(new TestCacheFactoryRegistry("testGetCache")); return suite; } public TestCacheFactoryRegistry(final String name) { super(name); } public void testConstructor() { Logger logger = Logger.getLogger(CacheFactoryRegistry.class); Level level = logger.getLevel(); assertEquals("org.castor.cache.Factories", CPAProperties.CACHE_FACTORIES); AbstractProperties properties = CPAProperties.newInstance(); String memF = properties.getString(CPAProperties.CACHE_FACTORIES); properties.remove(CPAProperties.CACHE_FACTORIES); new CacheFactoryRegistry(properties); properties.put(CPAProperties.CACHE_FACTORIES, ""); new CacheFactoryRegistry(properties); properties.put(CPAProperties.CACHE_FACTORIES, UnlimitedFactory.class.getName()); new CacheFactoryRegistry(properties); if (DISABLE_LOGGING) { logger.setLevel(Level.FATAL); } properties.put(CPAProperties.CACHE_FACTORIES, "org.castor.cache.simple.UnknownFactory"); try { new CacheFactoryRegistry(properties); fail("Should have failed to create unknown class."); } catch (PropertiesException ex) { assertTrue(true); } logger.setLevel(level); properties.put(CPAProperties.CACHE_FACTORIES, memF); } public void testGetCacheNames() { AbstractProperties properties = CPAProperties.newInstance(); Collection<String> col = new CacheFactoryRegistry(properties).getCacheNames(); assertEquals(13, col.size()); assertTrue(col.contains(CountLimited.TYPE)); assertTrue(col.contains(NoCache.TYPE)); assertTrue(col.contains(TimeLimited.TYPE)); assertTrue(col.contains(Unlimited.TYPE)); assertTrue(col.contains(CoherenceCache.TYPE)); assertTrue(col.contains(FKCache.TYPE)); assertTrue(col.contains(JCache.TYPE)); assertTrue(col.contains(JcsCache.TYPE)); assertTrue(col.contains(OsCache.TYPE)); assertTrue(col.contains(FIFOHashbelt.TYPE)); assertTrue(col.contains(LRUHashbelt.TYPE)); assertTrue(col.contains(EHCache.TYPE)); assertTrue(col.contains(GigaspacesCache.TYPE)); } public void testGetCacheFactories() { AbstractProperties properties = CPAProperties.newInstance(); Collection<CacheFactory> col = new CacheFactoryRegistry(properties).getCacheFactories(); assertEquals(13, col.size()); assertTrue(containsInstanceOf(col, CountLimitedFactory.class)); assertTrue(containsInstanceOf(col, NoCacheFactory.class)); assertTrue(containsInstanceOf(col, TimeLimitedFactory.class)); assertTrue(containsInstanceOf(col, UnlimitedFactory.class)); assertTrue(containsInstanceOf(col, CoherenceCacheFactory.class)); assertTrue(containsInstanceOf(col, FKCacheFactory.class)); assertTrue(containsInstanceOf(col, JCacheFactory.class)); assertTrue(containsInstanceOf(col, JcsCacheFactory.class)); assertTrue(containsInstanceOf(col, OsCacheFactory.class)); assertTrue(containsInstanceOf(col, FIFOHashbeltFactory.class)); assertTrue(containsInstanceOf(col, LRUHashbeltFactory.class)); assertTrue(containsInstanceOf(col, EHCacheFactory.class)); assertTrue(containsInstanceOf(col, GigaspacesCacheFactory.class)); } private boolean containsInstanceOf(final Collection<CacheFactory> col, final Class<? extends CacheFactory> cls) { Iterator<CacheFactory> iter = col.iterator(); while (iter.hasNext()) { CacheFactory factory = iter.next(); if (cls.isInstance(factory)) { return true; } } return false; } public void testGetCache() throws CacheAcquireException { Logger logger = Logger.getLogger(CacheFactoryRegistry.class); Level level = logger.getLevel(); AbstractProperties properties = CPAProperties.newInstance(); _registry = new CacheFactoryRegistry(properties); Cache cache = null; if (DISABLE_LOGGING) { logger.setLevel(Level.FATAL); } try { cache = getCache("not-existing", 0); fail("Getting a non existent cache should throw an exception."); } catch (CacheAcquireException ex) { assertNull(cache); } logger.setLevel(level); cache = getCache("count-limited", 3); assertEquals("count-limited", cache.getType()); assertTrue(cache instanceof CountLimited); assertEquals(3, ((CountLimited) cache).getCapacity()); cache = getCache("none", 10); assertEquals("none", cache.getType()); assertTrue(cache instanceof NoCache); cache = getCache("time-limited", 10); assertEquals("time-limited", cache.getType()); assertTrue(cache instanceof TimeLimited); assertEquals(10, ((TimeLimited) cache).getTTL()); cache = getCache("unlimited", 10); assertEquals("unlimited", cache.getType()); assertTrue(cache instanceof Unlimited); // Creation of distributed caches can not be tested without having their // implementations available on the classpath but testing the construction // isn't necessary as we have done it at tests of their factories. // // If you still like to test you only need to comment in one or all of the // following sections. // cache = getCache("coherence", 10); // assertEquals("coherence", cache.getType()); // assertTrue(cache instanceof CoherenceCache); // cache = getCache("fkcache", 10); // assertEquals("fkcache", cache.getType()); // assertTrue(cache instanceof FKCache); // cache = getCache("jcache", 10); // assertEquals("jcache", cache.getType()); // assertTrue(cache instanceof JCache); // cache = getCache("jcs", 10); // assertEquals("jcs", cache.getType()); // assertTrue(cache instanceof JcsCache); } private Cache getCache(final String type, final int capacity) throws CacheAcquireException { Properties props = new Properties(); props.put(Cache.PARAM_TYPE, type); props.put(Cache.PARAM_NAME, "dummy"); props.put(Cache.PARAM_DEBUG, Cache.DEFAULT_DEBUG); props.put(CountLimited.PARAM_CAPACITY, Integer.toString(capacity)); props.put(TimeLimited.PARAM_TTL, Integer.toString(capacity)); return _registry.getCache(props, getClass().getClassLoader()); } }