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
10 import static org.hamcrest.Matchers.hasSize;
11 import static org.junit.Assert.assertThat;
12
13 public class AbstractCacheTest
14 {
15 protected CacheFactory factory;
16
17 protected Cache<String,Long> makeExceptionalCache()
18 {
19
20 CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
21 {
22 @Nonnull
23 @Override
24 public Long load(@Nonnull final String key)
25 {
26 return Long.valueOf(key);
27 }
28 };
29 final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
30 assertEmpty(cache);
31 return cache;
32 }
33
34 protected Cache<String, Long> makeExpiringCache()
35 {
36
37 CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
38 {
39 @Nonnull
40 @Override
41 public Long load(@Nonnull final String key)
42 {
43 try
44 {
45 return Long.valueOf(key);
46 }
47 catch (NumberFormatException e)
48 {
49 return -21L;
50 }
51 }
52 };
53 CacheSettings settings = settingsBuilder().expireAfterAccess(10, TimeUnit.MILLISECONDS).build();
54 final Cache<String, Long> cache = factory.getCache("mycache", loader, settings);
55 assertEmpty(cache);
56 return cache;
57 }
58
59 protected Cache<String,Long> makeNullReturningCache()
60 {
61
62 CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
63 {
64 @Nonnull
65 @Override
66 public Long load(@Nonnull final String key)
67 {
68 try
69 {
70 return Long.valueOf(key);
71 }
72 catch (NumberFormatException e)
73 {
74 return null;
75 }
76 }
77 };
78 final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
79 assertEmpty(cache);
80 return cache;
81 }
82
83 protected Cache<String, Long> makeSimpleCache()
84 {
85
86 final Cache<String, Long> cache = factory.getCache("mycache", null, settingsBuilder().build());
87 assertEmpty(cache);
88 return cache;
89 }
90
91 protected Cache<String, Long> makeSizeLimitedCache(int maxEntries)
92 {
93 CacheSettings required = settingsBuilder().maxEntries(maxEntries).build();
94 final Cache<String, Long> cache = factory.getCache("mycache", null, required);
95 assertEmpty(cache);
96 return cache;
97 }
98
99 protected Cache<String, Long> makeSizeLimitedCache(final int maxEntries, final AtomicInteger loadCounter)
100 {
101
102 CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
103 {
104 @Nonnull
105 @Override
106 public Long load(@Nonnull final String key)
107 {
108 loadCounter.incrementAndGet();
109 return Long.valueOf(key);
110 }
111 };
112 CacheSettings settings = settingsBuilder().maxEntries(maxEntries).build();
113 final Cache<String, Long> cache = factory.getCache("mycache", loader, settings);
114 assertEmpty(cache);
115 return cache;
116 }
117
118 protected Cache<String, Long> makeUnexpiringCache()
119 {
120
121 CacheLoader<String, Long> loader = new CacheLoader<String, Long>()
122 {
123 @Nonnull
124 @Override
125 public Long load(@Nonnull final String key)
126 {
127 try
128 {
129 return Long.valueOf(key);
130 }
131 catch (NumberFormatException e)
132 {
133 return -21L;
134 }
135 }
136 };
137 final Cache<String, Long> cache = factory.getCache("mycache", loader, settingsBuilder().build());
138 assertEmpty(cache);
139 return cache;
140 }
141
142 protected CacheSettingsBuilder settingsBuilder()
143 {
144 return new CacheSettingsBuilder();
145 }
146
147
148
149 protected static <K,V> void assertEmpty(Cache<K,V> cache)
150 {
151 assertThat(cache.getKeys(), Matchers.<K>empty());
152 }
153
154 protected static <K,V> void assertSize(Cache<K,V> cache, final int expectedSize)
155 {
156 assertThat(cache.getKeys(), hasSize(expectedSize));
157 }
158 }