1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.cache;
16
17 import static com.google.common.cache.CacheTesting.checkEmpty;
18 import static com.google.common.cache.TestingCacheLoaders.constantLoader;
19 import static com.google.common.cache.TestingCacheLoaders.exceptionLoader;
20 import static com.google.common.cache.TestingRemovalListeners.queuingRemovalListener;
21 import static java.util.concurrent.TimeUnit.SECONDS;
22
23 import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
24 import com.google.common.cache.TestingRemovalListeners.QueuingRemovalListener;
25 import com.google.common.util.concurrent.UncheckedExecutionException;
26
27 import junit.framework.TestCase;
28
29
30
31
32
33
34 public class NullCacheTest extends TestCase {
35 QueuingRemovalListener<Object, Object> listener;
36
37 @Override
38 protected void setUp() {
39 listener = queuingRemovalListener();
40 }
41
42 public void testGet() {
43 Object computed = new Object();
44 LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
45 .maximumSize(0)
46 .removalListener(listener)
47 .build(constantLoader(computed));
48
49 Object key = new Object();
50 assertSame(computed, cache.getUnchecked(key));
51 RemovalNotification<Object, Object> notification = listener.remove();
52 assertSame(key, notification.getKey());
53 assertSame(computed, notification.getValue());
54 assertSame(RemovalCause.SIZE, notification.getCause());
55 assertTrue(listener.isEmpty());
56 checkEmpty(cache);
57 }
58
59 public void testGet_expireAfterWrite() {
60 Object computed = new Object();
61 LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
62 .expireAfterWrite(0, SECONDS)
63 .removalListener(listener)
64 .build(constantLoader(computed));
65
66 Object key = new Object();
67 assertSame(computed, cache.getUnchecked(key));
68 RemovalNotification<Object, Object> notification = listener.remove();
69 assertSame(key, notification.getKey());
70 assertSame(computed, notification.getValue());
71 assertSame(RemovalCause.SIZE, notification.getCause());
72 assertTrue(listener.isEmpty());
73 checkEmpty(cache);
74 }
75
76 public void testGet_expireAfterAccess() {
77 Object computed = new Object();
78 LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
79 .expireAfterAccess(0, SECONDS)
80 .removalListener(listener)
81 .build(constantLoader(computed));
82
83 Object key = new Object();
84 assertSame(computed, cache.getUnchecked(key));
85 RemovalNotification<Object, Object> notification = listener.remove();
86 assertSame(key, notification.getKey());
87 assertSame(computed, notification.getValue());
88 assertSame(RemovalCause.SIZE, notification.getCause());
89 assertTrue(listener.isEmpty());
90 checkEmpty(cache);
91 }
92
93 public void testGet_computeNull() {
94 LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
95 .maximumSize(0)
96 .removalListener(listener)
97 .build(constantLoader(null));
98
99 try {
100 cache.getUnchecked(new Object());
101 fail();
102 } catch (InvalidCacheLoadException e) { }
103
104 assertTrue(listener.isEmpty());
105 checkEmpty(cache);
106 }
107
108 public void testGet_runtimeException() {
109 final RuntimeException e = new RuntimeException();
110 LoadingCache<Object, Object> map = CacheBuilder.newBuilder()
111 .maximumSize(0)
112 .removalListener(listener)
113 .build(exceptionLoader(e));
114
115 try {
116 map.getUnchecked(new Object());
117 fail();
118 } catch (UncheckedExecutionException uee) {
119 assertSame(e, uee.getCause());
120 }
121 assertTrue(listener.isEmpty());
122 checkEmpty(map);
123 }
124 }