View Javadoc

1   /***
2    *  Copyright 2003-2010 Terracotta, Inc.
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  
17  package net.sf.ehcache.constructs;
18  
19  import java.util.Arrays;
20  import java.util.List;
21  
22  import junit.framework.TestCase;
23  import net.sf.ehcache.CacheException;
24  import net.sf.ehcache.CacheManager;
25  import net.sf.ehcache.Ehcache;
26  import net.sf.ehcache.ObjectExistsException;
27  import net.sf.ehcache.constructs.MockDecoratorFactory.MockDecoratorFactoryCache;
28  
29  import org.junit.Test;
30  import org.slf4j.Logger;
31  import org.slf4j.LoggerFactory;
32  
33  /***
34   * @author Abhishek Sanoujam
35   */
36  public class DecoratorNoNameTest extends TestCase {
37  
38      private static final Logger LOG = LoggerFactory.getLogger(DecoratorNoNameTest.class);
39  
40      private static final String EHCACHE_DECORATOR_NONAME_TEST_XML = "/ehcache-decorator-noname-test.xml";
41      private static final String EHCACHE_DECORATOR_NONAME_FAIL_TEST_XML = "/ehcache-decorator-noname-fail-test.xml";
42  
43      @Test
44      public void testCacheDecoratorFactory() {
45          CacheManager cacheManager = new CacheManager(getClass().getResourceAsStream(EHCACHE_DECORATOR_NONAME_TEST_XML));
46          List<String> cacheNames = Arrays.asList(cacheManager.getCacheNames());
47          LOG.info("" + cacheNames);
48  
49          assertEquals(6, cacheNames.size());
50  
51          checkDeclaredNamesExists(cacheNames);
52  
53      }
54  
55      private void checkDeclaredNamesExists(List<String> cacheNames) {
56          assertTrue(cacheNames.contains("noDecoratorCache"));
57          assertTrue(cacheNames.contains("oneDecoratorCache"));
58          assertTrue(cacheNames.contains("oneDecoratorCacheFirst"));
59          assertTrue(cacheNames.contains("twoDecoratorCache"));
60          assertTrue(cacheNames.contains("twoDecoratorCacheFirst"));
61          assertTrue(cacheNames.contains("twoDecoratorCacheSecond"));
62      }
63  
64      @Test
65      public void testCacheDecoratorFactoryProperties() {
66          LOG.info("Testing default cache decorator properties");
67          CacheManager cacheManager = new CacheManager(getClass().getResourceAsStream(EHCACHE_DECORATOR_NONAME_TEST_XML));
68          List<String> cacheNames = Arrays.asList(cacheManager.getCacheNames());
69          assertEquals(6, cacheNames.size());
70          checkDeclaredNamesExists(cacheNames);
71  
72          for (String name : cacheNames) {
73              Ehcache ehcache = cacheManager.getEhcache(name);
74              assertTrue("Should be instance of MockDecoratorFactoryCache", ehcache instanceof MockDecoratorFactoryCache);
75          }
76  
77          checkDeclaredCachesProperties(cacheManager);
78  
79          LOG.info("Testing default cache decorator properties Complete");
80      }
81  
82      private void checkDeclaredCachesProperties(CacheManager cacheManager) {
83          // every cache is a nonstopcache as defaultCache has a decorator with no name
84          checkMockDecoratorCache(cacheManager, "noDecoratorCache", "defaultDecoratorKeyValue");
85          checkMockDecoratorCache(cacheManager, "oneDecoratorCache", "defaultDecoratorKeyValue");
86          checkMockDecoratorCache(cacheManager, "twoDecoratorCache", "defaultDecoratorKeyValue");
87          checkMockDecoratorCache(cacheManager, "oneDecoratorCacheFirst", "oneDecoratorCacheFirstKey");
88          checkMockDecoratorCache(cacheManager, "twoDecoratorCacheFirst", "twoDecoratorCacheFirstKey");
89          checkMockDecoratorCache(cacheManager, "twoDecoratorCacheSecond", "twoDecoratorCacheSecondKey");
90      }
91  
92      @Test
93      public void testAddDynamicCache() {
94          LOG.info("Testing dynamic cache addition");
95          CacheManager cacheManager = new CacheManager(getClass().getResourceAsStream(EHCACHE_DECORATOR_NONAME_TEST_XML));
96          List<String> cacheNames = Arrays.asList(cacheManager.getCacheNames());
97          assertEquals(6, cacheNames.size());
98          checkDeclaredNamesExists(cacheNames);
99  
100         cacheManager.addCache("newDynamicCache");
101         cacheNames = Arrays.asList(cacheManager.getCacheNames());
102         assertEquals(7, cacheNames.size());
103         checkDeclaredNamesExists(cacheNames);
104         assertTrue(cacheNames.contains("newDynamicCache"));
105 
106         checkDeclaredCachesProperties(cacheManager);
107         checkMockDecoratorCache(cacheManager, "newDynamicCache", "defaultDecoratorKeyValue");
108 
109         LOG.info("Testing dynamic cache addition Complete");
110     }
111 
112     @Test
113     public void testAddDynamicCacheIfAbsent() {
114         LOG.info("Testing dynamic addCacheIfAbsent");
115         CacheManager cacheManager = new CacheManager(getClass().getResourceAsStream(EHCACHE_DECORATOR_NONAME_TEST_XML));
116         List<String> cacheNames = Arrays.asList(cacheManager.getCacheNames());
117         assertEquals(6, cacheNames.size());
118         checkDeclaredNamesExists(cacheNames);
119 
120         Ehcache orig = cacheManager.addCacheIfAbsent("newDynamicCache");
121         assertEquals("Newly added cache should be MockDecoratorFactoryCache as defaultCache has decorator with no name", true,
122                 orig instanceof MockDecoratorFactoryCache);
123         cacheNames = Arrays.asList(cacheManager.getCacheNames());
124 
125         assertEquals(7, cacheNames.size());
126         checkDeclaredNamesExists(cacheNames);
127         assertTrue(cacheNames.contains("newDynamicCache"));
128 
129         checkDeclaredCachesProperties(cacheManager);
130         checkMockDecoratorCache(cacheManager, "newDynamicCache", "defaultDecoratorKeyValue");
131 
132         // do addCacheIfAbsent again, caches shouldn't get replaced
133         Ehcache newCache = cacheManager.addCacheIfAbsent("newDynamicCache");
134         assertTrue(orig == newCache);
135 
136         cacheNames = Arrays.asList(cacheManager.getCacheNames());
137 
138         assertEquals(7, cacheNames.size());
139         checkDeclaredNamesExists(cacheNames);
140         assertTrue(cacheNames.contains("newDynamicCache"));
141 
142         checkDeclaredCachesProperties(cacheManager);
143         checkMockDecoratorCache(cacheManager, "newDynamicCache", "defaultDecoratorKeyValue");
144 
145         // check reference equality
146         assertTrue(orig == cacheManager.getEhcache("newDynamicCache"));
147 
148         // doing addCache() should blow up
149         try {
150             cacheManager.addCache("newDynamicCache");
151             fail("Adding cache with same name should throw exception");
152         } catch (ObjectExistsException e) {
153             // expected
154         }
155 
156         LOG.info("Testing dynamic addCacheIfAbsent Complete");
157     }
158 
159     private void checkMockDecoratorCache(CacheManager cacheManager, String name, String expectedKeyValue) {
160         Ehcache ehcache = cacheManager.getEhcache(name);
161         assertEquals(name, ehcache.getName());
162         assertEquals("Should be instanceof MockDecoratorFactoryCache : " + ehcache, true, ehcache instanceof MockDecoratorFactoryCache);
163         MockDecoratorFactoryCache ns = (MockDecoratorFactoryCache) ehcache;
164         assertEquals(expectedKeyValue, ns.getProperties().get("someKey"));
165     }
166 
167     @Test
168     public void testFailingConfig() {
169         LOG.info("Testing failing config");
170         try {
171             CacheManager cacheManager = new CacheManager(getClass().getResourceAsStream(EHCACHE_DECORATOR_NONAME_FAIL_TEST_XML));
172             fail("Config having multiple ambiguous decorators should fail to initialize");
173         } catch (CacheException e) {
174             // expected
175         }
176         LOG.info("Testing failing config Complete");
177     }
178 }