View Javadoc
1   package org.apache.commons.jcs.jcache;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.junit.Test;
23  
24  import javax.cache.Cache;
25  import javax.cache.CacheManager;
26  import javax.cache.Caching;
27  import javax.cache.configuration.CacheEntryListenerConfiguration;
28  import javax.cache.configuration.CompleteConfiguration;
29  import javax.cache.configuration.Factory;
30  import javax.cache.configuration.MutableConfiguration;
31  import javax.cache.event.CacheEntryCreatedListener;
32  import javax.cache.event.CacheEntryEvent;
33  import javax.cache.event.CacheEntryEventFilter;
34  import javax.cache.event.CacheEntryListener;
35  import javax.cache.event.CacheEntryListenerException;
36  import javax.cache.event.CacheEntryRemovedListener;
37  import javax.cache.event.CacheEntryUpdatedListener;
38  import javax.cache.expiry.AccessedExpiryPolicy;
39  import javax.cache.expiry.Duration;
40  import javax.cache.expiry.ExpiryPolicy;
41  import javax.cache.integration.CacheLoader;
42  import javax.cache.integration.CacheLoaderException;
43  import javax.cache.integration.CacheWriter;
44  import javax.cache.spi.CachingProvider;
45  import java.util.HashSet;
46  import java.util.Map;
47  import java.util.Set;
48  import java.util.concurrent.TimeUnit;
49  
50  import static org.junit.Assert.assertEquals;
51  import static org.junit.Assert.assertFalse;
52  import static org.junit.Assert.assertTrue;
53  
54  public class CacheTest
55  {
56      @Test
57      public void accessExpiry() throws InterruptedException
58      {
59          final CachingProvider cachingProvider = Caching.getCachingProvider();
60          final CacheManager cacheManager = cachingProvider.getCacheManager(cachingProvider.getDefaultURI(),
61                  Thread.currentThread().getContextClassLoader(),
62                  cachingProvider.getDefaultProperties());
63          final Cache<Integer, Integer> cache = cacheManager.createCache(
64                  "test",
65                  new MutableConfiguration<Integer, Integer>()
66                          .setStoreByValue(false)
67                          .setStatisticsEnabled(true)
68                          .setManagementEnabled(true)
69                          .setTypes(Integer.class, Integer.class)
70                          .setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500))));
71  
72          try {
73              cache.put(1, 2);
74              cache.get(1);
75              Thread.sleep(650);
76              assertFalse(cache.containsKey(1));
77              cache.put(1, 2);
78              for (int i = 0; i < 3; i++) { // we update the last access to force the idle time and lastaccess to be synced
79                  Thread.sleep(250);
80                  assertTrue("iteration: " + Integer.toString(i), cache.containsKey(1));
81              }
82              assertTrue(cache.containsKey(1));
83              Thread.sleep(650);
84              assertFalse(cache.containsKey(1));
85          } finally {
86              cacheManager.close();
87              cachingProvider.close();
88          }
89      }
90  
91      @Test
92      public void getPut()
93      {
94          final CachingProvider cachingProvider = Caching.getCachingProvider();
95          final CacheManager cacheManager = cachingProvider.getCacheManager();
96          final Cache<String, String> cache = cacheManager.createCache("default", new MutableConfiguration<String, String>());
97          assertFalse(cache.containsKey("foo"));
98          cache.put("foo", "bar");
99          assertTrue(cache.containsKey("foo"));
100         assertEquals("bar", cache.get("foo"));
101         cache.remove("foo");
102         assertFalse(cache.containsKey("foo"));
103         cachingProvider.close();
104     }
105 
106     @Test
107     public void listeners()
108     {
109         final CachingProvider cachingProvider = Caching.getCachingProvider();
110         final CacheManager cacheManager = cachingProvider.getCacheManager();
111         cacheManager.createCache("default", new MutableConfiguration<Object, Object>());
112         final Cache<String, String> cache = cacheManager.getCache("default");
113         final Set<String> event = new HashSet<String>();
114         cache.registerCacheEntryListener(new CacheEntryListenerConfiguration<String, String>()
115         {
116             @Override
117             public Factory<CacheEntryListener<? super String, ? super String>> getCacheEntryListenerFactory()
118             {
119                 return new Factory<CacheEntryListener<? super String, ? super String>>()
120                 {
121                     @Override
122                     public CacheEntryListener<? super String, ? super String> create()
123                     {
124                         return new CacheEntryCreatedListener<String, String>()
125                         {
126                             @Override
127                             public void onCreated(Iterable<CacheEntryEvent<? extends String, ? extends String>> cacheEntryEvents)
128                                     throws CacheEntryListenerException
129                             {
130                                 event.add(cacheEntryEvents.iterator().next().getKey());
131                             }
132                         };
133                     }
134                 };
135             }
136 
137             @Override
138             public boolean isOldValueRequired()
139             {
140                 return false;
141             }
142 
143             @Override
144             public Factory<CacheEntryEventFilter<? super String, ? super String>> getCacheEntryEventFilterFactory()
145             {
146                 return null;
147             }
148 
149             @Override
150             public boolean isSynchronous()
151             {
152                 return false;
153             }
154         });
155         cache.registerCacheEntryListener(new CacheEntryListenerConfiguration<String, String>()
156         {
157             @Override
158             public Factory<CacheEntryListener<? super String, ? super String>> getCacheEntryListenerFactory()
159             {
160                 return new Factory<CacheEntryListener<? super String, ? super String>>()
161                 {
162                     @Override
163                     public CacheEntryListener<? super String, ? super String> create()
164                     {
165                         return new CacheEntryUpdatedListener<String, String>()
166                         {
167                             @Override
168                             public void onUpdated(Iterable<CacheEntryEvent<? extends String, ? extends String>> cacheEntryEvents)
169                                     throws CacheEntryListenerException
170                             {
171                                 event.add(cacheEntryEvents.iterator().next().getKey());
172                             }
173                         };
174                     }
175                 };
176             }
177 
178             @Override
179             public boolean isOldValueRequired()
180             {
181                 return false;
182             }
183 
184             @Override
185             public Factory<CacheEntryEventFilter<? super String, ? super String>> getCacheEntryEventFilterFactory()
186             {
187                 return null;
188             }
189 
190             @Override
191             public boolean isSynchronous()
192             {
193                 return false;
194             }
195         });
196         cache.registerCacheEntryListener(new CacheEntryListenerConfiguration<String, String>()
197         {
198             @Override
199             public Factory<CacheEntryListener<? super String, ? super String>> getCacheEntryListenerFactory()
200             {
201                 return new Factory<CacheEntryListener<? super String, ? super String>>()
202                 {
203                     @Override
204                     public CacheEntryListener<? super String, ? super String> create()
205                     {
206                         return new CacheEntryRemovedListener<String, String>()
207                         {
208                             @Override
209                             public void onRemoved(Iterable<CacheEntryEvent<? extends String, ? extends String>> cacheEntryEvents)
210                                     throws CacheEntryListenerException
211                             {
212                                 event.add(cacheEntryEvents.iterator().next().getKey());
213                             }
214                         };
215                     }
216                 };
217             }
218 
219             @Override
220             public boolean isOldValueRequired()
221             {
222                 return false;
223             }
224 
225             @Override
226             public Factory<CacheEntryEventFilter<? super String, ? super String>> getCacheEntryEventFilterFactory()
227             {
228                 return null;
229             }
230 
231             @Override
232             public boolean isSynchronous()
233             {
234                 return false;
235             }
236         });
237 
238         cache.put("foo", "bar");
239         assertEquals(1, event.size());
240         assertEquals("foo", event.iterator().next());
241         event.clear();
242         cache.put("foo", "new");
243         assertEquals(1, event.size());
244         assertEquals("foo", event.iterator().next());
245         event.clear();
246         cache.remove("foo");
247         assertEquals(1, event.size());
248         assertEquals("foo", event.iterator().next());
249 
250         cachingProvider.close();
251     }
252 
253     @Test
254     public void loader()
255     {
256         final CachingProvider cachingProvider = Caching.getCachingProvider();
257         final CacheManager cacheManager = cachingProvider.getCacheManager();
258         cacheManager.createCache("default", new CompleteConfiguration<Object, Object>()
259         {
260             @Override
261             public boolean isReadThrough()
262             {
263                 return true;
264             }
265 
266             @Override
267             public boolean isWriteThrough()
268             {
269                 return false;
270             }
271 
272             @Override
273             public boolean isStatisticsEnabled()
274             {
275                 return false;
276             }
277 
278             @Override
279             public boolean isManagementEnabled()
280             {
281                 return false;
282             }
283 
284             @Override
285             public Iterable<CacheEntryListenerConfiguration<Object, Object>> getCacheEntryListenerConfigurations()
286             {
287                 return null;
288             }
289 
290             @Override
291             public Factory<CacheLoader<Object, Object>> getCacheLoaderFactory()
292             {
293                 return new Factory<CacheLoader<Object, Object>>()
294                 {
295                     @Override
296                     public CacheLoader<Object, Object> create()
297                     {
298                         return new CacheLoader<Object, Object>()
299                         {
300                             @Override
301                             public Object load(Object key) throws CacheLoaderException
302                             {
303                                 return "super";
304                             }
305 
306                             @Override
307                             public Map<Object, Object> loadAll(Iterable<?> keys) throws CacheLoaderException
308                             {
309                                 return null;
310                             }
311                         };
312                     }
313                 };
314             }
315 
316             @Override
317             public Factory<CacheWriter<? super Object, ? super Object>> getCacheWriterFactory()
318             {
319                 return null;
320             }
321 
322             @Override
323             public Factory<ExpiryPolicy> getExpiryPolicyFactory()
324             {
325                 return null;
326             }
327 
328             @Override
329             public Class<Object> getKeyType()
330             {
331                 return Object.class;
332             }
333 
334             @Override
335             public Class<Object> getValueType()
336             {
337                 return Object.class;
338             }
339 
340             @Override
341             public boolean isStoreByValue()
342             {
343                 return false;
344             }
345         });
346         final Cache<String, String> cache = cacheManager.getCache("default");
347         assertEquals("super", cache.get("lazilyLoaded"));
348         cachingProvider.close();
349     }
350 }