From 91d5f8085ed683ec1854b8cc6496705c06d2a17a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 25 Mar 2013 11:58:05 +0100 Subject: [PATCH] added reference tests for cache managers --- .../main/java/sonia/scm/cache/EhCache.java | 14 ++ .../sonia/scm/cache/CacheManagerTestBase.java | 224 ++++++++++++++++++ .../sonia/scm/cache/EhCacheManagerTest.java | 84 +++++++ .../scm/cache/GuavaCacheManagerTest.java | 52 ++++ 4 files changed, 374 insertions(+) create mode 100644 scm-webapp/src/test/java/sonia/scm/cache/CacheManagerTestBase.java create mode 100644 scm-webapp/src/test/java/sonia/scm/cache/EhCacheManagerTest.java create mode 100644 scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheManagerTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/cache/EhCache.java b/scm-webapp/src/main/java/sonia/scm/cache/EhCache.java index 802db9d45c..4ac0e2a49e 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/EhCache.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/EhCache.java @@ -35,6 +35,8 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.annotations.VisibleForTesting; + import net.sf.ehcache.Element; import org.slf4j.Logger; @@ -186,6 +188,18 @@ public class EhCache implements Cache return value; } + /** + * Method description + * + * + * @return + */ + @VisibleForTesting + net.sf.ehcache.Cache getCacheImplementation() + { + return cache; + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheManagerTestBase.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheManagerTestBase.java new file mode 100644 index 0000000000..14d10eee20 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheManagerTestBase.java @@ -0,0 +1,224 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cache; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.collect.Sets; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.Matchers.*; + +import static org.junit.Assert.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * + * @author Sebastian Sdorra + * + * @param + */ +public abstract class CacheManagerTestBase +{ + + /** + * Method description + * + * + * @return + */ + protected abstract CacheManager createCacheManager(); + + /** + * Method description + * + * + * @throws IOException + */ + @After + public void tearDown() throws IOException + { + cacheManager.close(); + } + + /** + * Method description + * + */ + @Test + public void testSameReference() + { + Cache c1 = cacheManager.getCache(String.class, + String.class, "test-1"); + Cache c2 = cacheManager.getCache(String.class, + String.class, "test-1"); + + assertIsSame(c1, c2); + } + + /** + * Method description + * + * + * @throws ExecutionException + * @throws InterruptedException + */ + @Test + public void testSameReferenceMultiThreaded() + throws InterruptedException, ExecutionException + { + ExecutorService executor = Executors.newFixedThreadPool(2); + + Set> caches = Sets.newHashSet(); + + for (int i = 0; i < 20; i++) + { + //J- + caches.add( + executor.submit(new AcquireCacheCallable(cacheManager, "test-2")) + ); + //J+ + } + + executor.shutdown(); + + Cache c = null; + + for (Future f : caches) + { + Cache nc = f.get(); + + if (c != null) + { + assertIsSame(c, nc); + } + + c = nc; + } + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + */ + @Before + public void setUp() + { + cacheManager = createCacheManager(); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param c1 + * @param c2 + */ + protected void assertIsSame(Cache c1, + Cache c2) + { + assertSame(c1, c2); + } + + //~--- inner classes -------------------------------------------------------- + + /** + * Class description + * + * + * @version Enter version here..., 13/03/25 + * @author Enter your name here... + */ + private static class AcquireCacheCallable implements Callable + { + + /** + * Constructs ... + * + * + * @param cacheManager + * @param name + */ + public AcquireCacheCallable(CacheManager cacheManager, String name) + { + this.cacheManager = cacheManager; + this.name = name; + } + + //~--- methods ------------------------------------------------------------ + + /** + * Method description + * + * + * @return + * + * @throws Exception + */ + @Override + public Cache call() throws Exception + { + return cacheManager.getCache(String.class, String.class, name); + } + + //~--- fields ------------------------------------------------------------- + + /** Field description */ + private CacheManager cacheManager; + + /** Field description */ + private String name; + } + + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private CacheManager cacheManager; +} diff --git a/scm-webapp/src/test/java/sonia/scm/cache/EhCacheManagerTest.java b/scm-webapp/src/test/java/sonia/scm/cache/EhCacheManagerTest.java new file mode 100644 index 0000000000..899de9839b --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/cache/EhCacheManagerTest.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cache; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.Assert; + +/** + * + * @author Sebastian Sdorra + */ +public class EhCacheManagerTest extends CacheManagerTestBase +{ + + /** + * Method description + * + * + * @param c1 + * @param c2 + */ + @Override + protected void assertIsSame(Cache c1, Cache c2) + { + Assert.assertSame(getCacheImplementation(c1), getCacheImplementation(c1)); + } + + /** + * Method description + * + * + * @return + */ + @Override + protected CacheManager createCacheManager() + { + return CacheTestUtil.createDefaultEhCacheManager(); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param c1 + * + * @return + */ + private net.sf.ehcache.Cache getCacheImplementation(Cache c1) + { + return ((EhCache) c1).getCacheImplementation(); + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheManagerTest.java b/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheManagerTest.java new file mode 100644 index 0000000000..6a9380810c --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheManagerTest.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cache; + +/** + * + * @author Sebastian Sdorra + */ +public class GuavaCacheManagerTest extends CacheManagerTestBase +{ + + /** + * Method description + * + * + * @return + */ + @Override + protected CacheManager createCacheManager() + { + return CacheTestUtil.createDefaultGuavaCacheManager(); + } +}