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);
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
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
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
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
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
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
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
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 }