View Javadoc

1   package com.atlassian.cache;
2   
3   import java.util.concurrent.TimeUnit;
4   import java.util.concurrent.atomic.AtomicInteger;
5   
6   import javax.annotation.Nonnull;
7   
8   import org.hamcrest.Matchers;
9   import org.junit.Test;
10  
11  import static org.hamcrest.Matchers.hasSize;
12  import static org.junit.Assert.assertThat;
13  import static org.junit.Assert.fail;
14  
15  public abstract class AbstractCacheTest
16  {
17      @Test
18      public void testWhenRemovingAKeyWhereTheLoaderReturnsNullTheExceptionIsSwallowed()
19      {
20          try
21          {
22              Cache<String, Long> cache = makeNullReturningCache();
23              cache.remove("I don't exist key");
24          }
25          catch (Exception e)
26          {
27              fail("Exception should not be thrown when a loader return null during a remove: " + e.getMessage());
28          }
29      }
30  
31      @Test
32      public void testWhenRemovingAKeyWithValueWhereTheLoaderReturnsNullTheExceptionIsSwallowed()
33      {
34          try
35          {
36              Cache<String, Long> cache = makeNullReturningCache();
37              cache.remove("I don't exist key", 1L); //magic one null will always be returned
38          }
39          catch (Exception e)
40          {
41              fail("Exception should not be thrown when a loader return null during a remove: " + e.getMessage());
42          }
43      }
44  
45      @Test
46      public void testWhenRemovingAllKeysWhereTheLoaderReturnsNullTheExceptionIsSwallowed()
47      {
48          try
49          {
50              Cache<String, Long> cache = makeNullReturningCache();
51              cache.removeAll();
52          }
53          catch (Exception e)
54          {
55              fail("Exception should not be thrown when a loader return null during a remove: " + e.getMessage());
56          }
57      }
58  
59      protected CacheFactory factory;
60  
61      protected Cache<String,Long> makeExceptionalCache()
62      {
63          // Build a Cache using the builder
64          CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
65          {
66              @Nonnull
67              @Override
68              public Long load(@Nonnull final String key)
69              {
70                  return Long.valueOf(key);
71              }
72          };
73          final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
74          assertEmpty(cache);
75          return cache;
76      }
77  
78      protected Cache<String, Long> makeExpiringCache()
79      {
80          // Build a Cache using the builder
81          CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
82          {
83              @Nonnull
84              @Override
85              public Long load(@Nonnull final String key)
86              {
87                  try
88                  {
89                      return Long.valueOf(key);
90                  }
91                  catch (NumberFormatException e)
92                  {
93                      return -21L;
94                  }
95              }
96          };
97          CacheSettings settings = settingsBuilder().expireAfterAccess(10, TimeUnit.MILLISECONDS).build();
98          final Cache<String, Long> cache = factory.getCache("mycache", loader, settings);
99          assertEmpty(cache);
100         return cache;
101     }
102 
103     protected Cache<String,Long> makeNullReturningCache()
104     {
105         // Build a Cache using the builder
106         CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
107         {
108             @Nonnull
109             @Override
110             public Long load(@Nonnull final String key)
111             {
112                 try
113                 {
114                     return Long.valueOf(key);
115                 }
116                 catch (NumberFormatException e)
117                 {
118                     return null;
119                 }
120             }
121         };
122         final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
123         assertEmpty(cache);
124         return cache;
125     }
126 
127     protected Cache<String, Long> makeSimpleCache()
128     {
129         // Build a Cache using the builder
130         final Cache<String, Long> cache = factory.getCache("mycache", null, settingsBuilder().build());
131         assertEmpty(cache);
132         return cache;
133     }
134 
135     protected Cache<String, Long> makeSizeLimitedCache(int maxEntries)
136     {
137         CacheSettings required = settingsBuilder().maxEntries(maxEntries).build();
138         final Cache<String, Long> cache = factory.getCache("mycache", null, required);
139         assertEmpty(cache);
140         return cache;
141     }
142 
143     protected Cache<String, Long> makeSizeLimitedCache(final int maxEntries, final AtomicInteger loadCounter)
144     {
145         // Build a Cache using the builder
146         CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
147         {
148             @Nonnull
149             @Override
150             public Long load(@Nonnull final String key)
151             {
152                 loadCounter.incrementAndGet();
153                 return Long.valueOf(key);
154             }
155         };
156         CacheSettings settings = settingsBuilder().maxEntries(maxEntries).build();
157         final Cache<String, Long> cache = factory.getCache("mycache", loader, settings);
158         assertEmpty(cache);
159         return cache;
160     }
161 
162     protected Cache<String, Long> makeUnexpiringCache()
163     {
164         // Build a Cache using the builder
165         CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
166         {
167             @Nonnull
168             @Override
169             public Long load(@Nonnull final String key)
170             {
171                 try
172                 {
173                     return Long.valueOf(key);
174                 }
175                 catch (NumberFormatException e)
176                 {
177                     return -21L;
178                 }
179             }
180         };
181         final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
182         assertEmpty(cache);
183         return cache;
184     }
185 
186     protected CacheSettingsBuilder settingsBuilder()
187     {
188         return new CacheSettingsBuilder();
189     }
190 
191     // Hiding broken type inferences
192 
193     protected static <K,V> void assertEmpty(Cache<K,V> cache)
194     {
195         assertThat(cache.getKeys(), Matchers.<K>empty());
196     }
197 
198     protected static <K,V> void assertSize(Cache<K,V> cache, final int expectedSize)
199     {
200         assertThat(cache.getKeys(), hasSize(expectedSize));
201     }
202 }