• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.cache;
18 
19 import com.google.common.cache.AbstractCache.SimpleStatsCounter;
20 import com.google.common.cache.AbstractCache.StatsCounter;
21 import com.google.common.collect.ImmutableList;
22 import com.google.common.collect.Lists;
23 
24 import junit.framework.TestCase;
25 
26 import java.util.List;
27 import java.util.concurrent.ExecutionException;
28 import java.util.concurrent.atomic.AtomicReference;
29 
30 /**
31  * Unit test for {@link AbstractCache}.
32  *
33  * @author Charles Fry
34  */
35 public class AbstractCacheTest extends TestCase {
36 
testGetAllPresent()37   public void testGetAllPresent() {
38     final AtomicReference<Object> valueRef = new AtomicReference<Object>();
39     Cache<Object, Object> cache = new AbstractCache<Object, Object>() {
40       @Override
41       public Object getIfPresent(Object key) {
42         return valueRef.get();
43       }
44 
45       @Override
46       public Object get(Object key) throws ExecutionException {
47         throw new UnsupportedOperationException();
48       }
49 
50     };
51 
52     assertNull(cache.getIfPresent(new Object()));
53 
54     Object newValue = new Object();
55     valueRef.set(newValue);
56     assertSame(newValue, cache.getIfPresent(new Object()));
57   }
58 
testInvalidateAll()59   public void testInvalidateAll() {
60     final List<Object> invalidated = Lists.newArrayList();
61     Cache<Integer, Integer> cache = new AbstractCache<Integer, Integer>() {
62       @Override
63       public Integer getIfPresent(Integer key) {
64         throw new UnsupportedOperationException();
65       }
66 
67       @Override
68       public Integer get(Integer key) throws ExecutionException {
69         throw new UnsupportedOperationException();
70       }
71 
72       @Override
73       public void invalidate(Object key) {
74         invalidated.add(key);
75       }
76     };
77 
78     List<Integer> toInvalidate = ImmutableList.of(1, 2, 3, 4);
79     cache.invalidateAll(toInvalidate);
80     assertEquals(toInvalidate, invalidated);
81   }
82 
testEmptySimpleStats()83   public void testEmptySimpleStats() {
84     StatsCounter counter = new SimpleStatsCounter();
85     CacheStats stats = counter.snapshot();
86     assertEquals(0, stats.requestCount());
87     assertEquals(0, stats.hitCount());
88     assertEquals(1.0, stats.hitRate());
89     assertEquals(0, stats.missCount());
90     assertEquals(0.0, stats.missRate());
91     assertEquals(0, stats.loadSuccessCount());
92     assertEquals(0, stats.loadExceptionCount());
93     assertEquals(0, stats.loadCount());
94     assertEquals(0, stats.totalLoadTime());
95     assertEquals(0.0, stats.averageLoadPenalty());
96     assertEquals(0, stats.evictionCount());
97   }
98 
testSingleSimpleStats()99   public void testSingleSimpleStats() {
100     StatsCounter counter = new SimpleStatsCounter();
101     for (int i = 0; i < 11; i++) {
102       counter.recordHits(1);
103     }
104     for (int i = 0; i < 13; i++) {
105       counter.recordLoadSuccess(i);
106     }
107     for (int i = 0; i < 17; i++) {
108       counter.recordLoadException(i);
109     }
110     for (int i = 0; i < 23; i++) {
111       counter.recordMisses(1);
112     }
113     for (int i = 0; i < 27; i++) {
114       counter.recordEviction();
115     }
116     CacheStats stats = counter.snapshot();
117     int requestCount = 11 + 23;
118     assertEquals(requestCount, stats.requestCount());
119     assertEquals(11, stats.hitCount());
120     assertEquals(11.0/requestCount, stats.hitRate());
121     int missCount = 23;
122     assertEquals(missCount, stats.missCount());
123     assertEquals(((double) missCount)/requestCount, stats.missRate());
124     assertEquals(13, stats.loadSuccessCount());
125     assertEquals(17, stats.loadExceptionCount());
126     assertEquals(13 + 17, stats.loadCount());
127     assertEquals(214, stats.totalLoadTime());
128     assertEquals(214.0/(13 + 17), stats.averageLoadPenalty());
129     assertEquals(27, stats.evictionCount());
130   }
131 
testSimpleStatsIncrementBy()132   public void testSimpleStatsIncrementBy() {
133     long totalLoadTime = 0;
134 
135     SimpleStatsCounter counter1 = new SimpleStatsCounter();
136     for (int i = 0; i < 11; i++) {
137       counter1.recordHits(1);
138     }
139     for (int i = 0; i < 13; i++) {
140       counter1.recordLoadSuccess(i);
141       totalLoadTime += i;
142     }
143     for (int i = 0; i < 17; i++) {
144       counter1.recordLoadException(i);
145       totalLoadTime += i;
146     }
147     for (int i = 0; i < 19; i++) {
148       counter1.recordMisses(1);
149     }
150     for (int i = 0; i < 23; i++) {
151       counter1.recordEviction();
152     }
153 
154     SimpleStatsCounter counter2 = new SimpleStatsCounter();
155     for (int i = 0; i < 27; i++) {
156       counter2.recordHits(1);
157     }
158     for (int i = 0; i < 31; i++) {
159       counter2.recordLoadSuccess(i);
160       totalLoadTime += i;
161     }
162     for (int i = 0; i < 37; i++) {
163       counter2.recordLoadException(i);
164       totalLoadTime += i;
165     }
166     for (int i = 0; i < 41; i++) {
167       counter2.recordMisses(1);
168     }
169     for (int i = 0; i < 43; i++) {
170       counter2.recordEviction();
171     }
172 
173     counter1.incrementBy(counter2);
174     assertEquals(new CacheStats(38, 60, 44, 54, totalLoadTime, 66),
175         counter1.snapshot());
176   }
177 
178 }
179