/* * Created on Jan 26, 2006 * * 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. * * Copyright @2007 the original author or authors. */ package org.springmodules.cache.provider.tangosol; import com.tangosol.net.NamedCache; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.propertyeditors.StringArrayPropertyEditor; import org.springframework.util.StringUtils; import org.springmodules.cache.provider.CacheModelValidator; import org.springmodules.cache.provider.ReflectionCacheModelEditor; import org.springmodules.cache.util.TangosolUtils; import java.beans.PropertyEditor; import java.util.Map; /** * Unit Tests for <code>{@link CoherenceFacade}</code>. * <p/> * <Strong>Note:</Strong> This class requires * <a href="http://www.tangosol.com">Tangosol Coherence</a> jars in the * classpath to work. * * @author Omar Irbouh * @author Alex Ruiz */ public class CoherenceFacadeTests extends TestCase { private static final String CACHE_NAME = "VirtualCache"; private static final String ENTRY_KEY = "KEY"; private static final String ENTRY_VALUE = "VALUE"; private NamedCache cache; private CoherenceFacade facade; protected final Log logger = LogFactory.getLog(getClass()); // check whether required Tangosol API is on classpath public void runBare() throws Throwable { if (TangosolUtils.isApiPresent()) { super.runBare(); } else { logger.info("Unable to run tests. Tangosol API is missing."); } } /** * Verifies that the method * <code>{@link CoherenceFacade#modelValidator()}</code> returns an * an instance of <code>{@link CoherenceModelValidator}</code> not equal to * <code>null</code>. */ public void testGetCacheModelValidator() { CacheModelValidator validator = facade.modelValidator(); assertNotNull(validator); assertEquals(CoherenceModelValidator.class, validator.getClass()); } public void testGetCachingModelEditor() { PropertyEditor editor = facade.getCachingModelEditor(); assertNotNull(editor); assertEquals(ReflectionCacheModelEditor.class, editor.getClass()); ReflectionCacheModelEditor modelEditor = (ReflectionCacheModelEditor) editor; assertEquals(CoherenceCachingModel.class, modelEditor.getCacheModelClass()); assertNull(modelEditor.getCacheModelPropertyEditors()); } public void testGetFlushingModelEditor() { PropertyEditor editor = facade.getFlushingModelEditor(); assertNotNull(editor); assertEquals(ReflectionCacheModelEditor.class, editor.getClass()); ReflectionCacheModelEditor modelEditor = (ReflectionCacheModelEditor) editor; assertEquals(CoherenceFlushingModel.class, modelEditor.getCacheModelClass()); Map propertyEditors = modelEditor.getCacheModelPropertyEditors(); assertEquals(1, propertyEditors.size()); assertSame(StringArrayPropertyEditor.class, propertyEditors.get("cacheNames").getClass()); } public void testIsSerializableCacheElementRequired() { assertFalse(facade.isSerializableCacheElementRequired()); } public void testOnFlushCache() { setUpCache(); cache.put(ENTRY_KEY, ENTRY_VALUE); CoherenceFlushingModel model = new CoherenceFlushingModel( new String[]{CACHE_NAME}); facade.onFlushCache(model); assertValueIsNotInCache(); tearDownCache(); } public void testOnGetFromCache() { setUpCache(); cache.put(ENTRY_KEY, ENTRY_VALUE); CoherenceCachingModel model = defaultCachingModel(); assertEquals("Value stored under key " + StringUtils.quote(ENTRY_KEY), ENTRY_VALUE, facade.onGetFromCache(ENTRY_KEY, model)); tearDownCache(); } public void testOnPutInCache() { setUpCache(); CoherenceCachingModel model = defaultCachingModel(); facade.onPutInCache(ENTRY_KEY, model, ENTRY_VALUE); assertValueIsInCache(); tearDownCache(); } public void testOnPutInCacheWithTimeToLeave() { setUpCache(); long timeToLive = 3000; CoherenceCachingModel model = defaultCachingModel(); model.setTimeToLive(timeToLive); facade.onPutInCache(ENTRY_KEY, model, ENTRY_VALUE); assertValueIsInCache(); try { Thread.sleep(timeToLive * 2); } catch (InterruptedException exception) { exception.printStackTrace(); } assertValueIsNotInCache(); tearDownCache(); } public void testOnRemoveFromCache() { setUpCache(); cache.put(ENTRY_KEY, ENTRY_VALUE); CoherenceCachingModel model = defaultCachingModel(); facade.onRemoveFromCache(ENTRY_KEY, model); assertValueIsNotInCache(); } protected void setUp() { facade = new CoherenceFacade(); } private void assertValueIsInCache() { assertEquals("Value stored under key " + StringUtils.quote(ENTRY_KEY), ENTRY_VALUE, cache.get(ENTRY_KEY)); } private void assertValueIsNotInCache() { assertNull("There should not be any value stored under the key " + StringUtils.quote(ENTRY_KEY), cache.get(ENTRY_KEY)); } private CoherenceCachingModel defaultCachingModel() { return new CoherenceCachingModel(CACHE_NAME); } private void setUpCache() { cache = TangosolUtils.getNamedCache(CACHE_NAME); assertTrue("Cache " + StringUtils.quote(CACHE_NAME) + " should be empty", cache.isEmpty()); } private void tearDownCache() { cache.clear(); TangosolUtils.shutdownCacheFactory(); } }