blob: bce084790bfbeb940b2ad43efca3a1d927d263bd [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
public final class BasicLruCacheTest extends TestCase {
public void testCreateOnCacheMiss() {
BasicLruCache<String, String> cache = newCreatingCache();
String created = cache.get("aa");
assertEquals("created-aa", created);
}
public void testNoCreateOnCacheHit() {
BasicLruCache<String, String> cache = newCreatingCache();
cache.put("aa", "put-aa");
assertEquals("put-aa", cache.get("aa"));
}
public void testConstructorDoesNotAllowZeroCacheSize() {
try {
new BasicLruCache<String, String>(0);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCannotPutNullKey() {
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(3);
try {
cache.put(null, "A");
fail();
} catch (NullPointerException expected) {
}
}
public void testCannotPutNullValue() {
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(3);
try {
cache.put("a", null);
fail();
} catch (NullPointerException expected) {
}
}
public void testEvictionWithSingletonCache() {
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(1);
cache.put("a", "A");
cache.put("b", "B");
assertSnapshot(cache, "b", "B");
}
public void testEntryEvictedWhenFull() {
List<String> expectedEvictionLog = new ArrayList<String>();
final List<String> evictionLog = new ArrayList<String>();
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(3) {
@Override protected void entryEvicted(String key, String value) {
evictionLog.add(key + "=" + value);
}
};
cache.put("a", "A");
cache.put("b", "B");
cache.put("c", "C");
assertEquals(expectedEvictionLog, evictionLog);
cache.put("d", "D");
expectedEvictionLog.add("a=A");
assertEquals(expectedEvictionLog, evictionLog);
}
/**
* Replacing the value for a key doesn't cause an eviction but it does bring
* the replaced entry to the front of the queue.
*/
public void testPutDoesNotCauseEviction() {
final List<String> evictionLog = new ArrayList<String>();
List<String> expectedEvictionLog = new ArrayList<String>();
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(3) {
@Override protected void entryEvicted(String key, String value) {
evictionLog.add(key + "=" + value);
}
};
cache.put("a", "A");
cache.put("b", "B");
cache.put("c", "C");
cache.put("b", "B2");
assertEquals(expectedEvictionLog, evictionLog);
assertSnapshot(cache, "a", "A", "c", "C", "b", "B2");
}
public void testEvictAll() {
final List<String> evictionLog = new ArrayList<String>();
BasicLruCache<String, String> cache = new BasicLruCache<String, String>(10) {
@Override protected void entryEvicted(String key, String value) {
evictionLog.add(key + "=" + value);
}
};
cache.put("a", "A");
cache.put("b", "B");
cache.put("c", "C");
cache.evictAll();
assertSnapshot(cache);
assertEquals(Arrays.asList("a=A", "b=B", "c=C"), evictionLog);
}
private BasicLruCache<String, String> newCreatingCache() {
return new BasicLruCache<String, String>(3) {
@Override protected String create(String key) {
return (key.length() > 1) ? ("created-" + key) : null;
}
};
}
private <T> void assertSnapshot(BasicLruCache<T, T> cache, T... keysAndValues) {
List<T> actualKeysAndValues = new ArrayList<T>();
for (Map.Entry<T, T> entry : cache.snapshot().entrySet()) {
actualKeysAndValues.add(entry.getKey());
actualKeysAndValues.add(entry.getValue());
}
// assert using lists because order is important for LRUs
assertEquals(Arrays.asList(keysAndValues), actualKeysAndValues);
}
}