1 /* 2 * Copyright (C) 2011 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15 package com.google.common.cache; 16 17 import static com.google.common.cache.TestingCacheLoaders.incrementingLoader; 18 import static java.util.concurrent.TimeUnit.MILLISECONDS; 19 20 import com.google.common.cache.TestingCacheLoaders.IncrementingLoader; 21 import com.google.common.testing.FakeTicker; 22 23 import junit.framework.TestCase; 24 25 /** 26 * Tests relating to automatic cache refreshing. 27 * 28 * @author Charles Fry 29 */ 30 public class CacheRefreshTest extends TestCase { 31 public void testAutoRefresh() { 32 FakeTicker ticker = new FakeTicker(); 33 IncrementingLoader loader = incrementingLoader(); 34 LoadingCache<Integer, Integer> cache = CacheBuilder.newBuilder() 35 .refreshAfterWrite(3, MILLISECONDS) 36 .expireAfterWrite(6, MILLISECONDS) 37 .lenientParsing() 38 .ticker(ticker) 39 .build(loader); 40 int expectedLoads = 0; 41 int expectedReloads = 0; 42 for (int i = 0; i < 3; i++) { 43 assertEquals(Integer.valueOf(i), cache.getUnchecked(i)); 44 expectedLoads++; 45 assertEquals(expectedLoads, loader.getLoadCount()); 46 assertEquals(expectedReloads, loader.getReloadCount()); 47 ticker.advance(1, MILLISECONDS); 48 } 49 50 assertEquals(Integer.valueOf(0), cache.getUnchecked(0)); 51 assertEquals(Integer.valueOf(1), cache.getUnchecked(1)); 52 assertEquals(Integer.valueOf(2), cache.getUnchecked(2)); 53 assertEquals(expectedLoads, loader.getLoadCount()); 54 assertEquals(expectedReloads, loader.getReloadCount()); 55 56 // refresh 0 57 ticker.advance(1, MILLISECONDS); 58 assertEquals(Integer.valueOf(1), cache.getUnchecked(0)); 59 expectedReloads++; 60 assertEquals(Integer.valueOf(1), cache.getUnchecked(1)); 61 assertEquals(Integer.valueOf(2), cache.getUnchecked(2)); 62 assertEquals(expectedLoads, loader.getLoadCount()); 63 assertEquals(expectedReloads, loader.getReloadCount()); 64 65 // write to 1 to delay its refresh 66 cache.asMap().put(1, -1); 67 ticker.advance(1, MILLISECONDS); 68 assertEquals(Integer.valueOf(1), cache.getUnchecked(0)); 69 assertEquals(Integer.valueOf(-1), cache.getUnchecked(1)); 70 assertEquals(Integer.valueOf(2), cache.getUnchecked(2)); 71 assertEquals(expectedLoads, loader.getLoadCount()); 72 assertEquals(expectedReloads, loader.getReloadCount()); 73 74 // refresh 2 75 ticker.advance(1, MILLISECONDS); 76 assertEquals(Integer.valueOf(1), cache.getUnchecked(0)); 77 assertEquals(Integer.valueOf(-1), cache.getUnchecked(1)); 78 assertEquals(Integer.valueOf(3), cache.getUnchecked(2)); 79 expectedReloads++; 80 assertEquals(expectedLoads, loader.getLoadCount()); 81 assertEquals(expectedReloads, loader.getReloadCount()); 82 83 ticker.advance(1, MILLISECONDS); 84 assertEquals(Integer.valueOf(1), cache.getUnchecked(0)); 85 assertEquals(Integer.valueOf(-1), cache.getUnchecked(1)); 86 assertEquals(Integer.valueOf(3), cache.getUnchecked(2)); 87 assertEquals(expectedLoads, loader.getLoadCount()); 88 assertEquals(expectedReloads, loader.getReloadCount()); 89 90 // refresh 0 and 1 91 ticker.advance(1, MILLISECONDS); 92 assertEquals(Integer.valueOf(2), cache.getUnchecked(0)); 93 expectedReloads++; 94 assertEquals(Integer.valueOf(0), cache.getUnchecked(1)); 95 expectedReloads++; 96 assertEquals(Integer.valueOf(3), cache.getUnchecked(2)); 97 assertEquals(expectedLoads, loader.getLoadCount()); 98 assertEquals(expectedReloads, loader.getReloadCount()); 99 } 100 } 101