11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.cache; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.util.concurrent.ExecutionError; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.util.concurrent.UncheckedExecutionException; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutionException; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.atomic.AtomicReference; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link AbstractLoadingCache}. 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Charles Fry 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class AbstractLoadingCacheTest extends TestCase { 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetUnchecked_checked() { 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Exception cause = new Exception(); 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final AtomicReference<Object> valueRef = new AtomicReference<Object>(); 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LoadingCache<Object, Object> cache = new AbstractLoadingCache<Object, Object>() { 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object get(Object key) throws ExecutionException { 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object v = valueRef.get(); 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (v == null) { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new ExecutionException(cause); 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return v; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object getIfPresent(Object key) { 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return valueRef.get(); 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert cache.getUnchecked(new Object()); 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UncheckedExecutionException expected) { 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(cause, expected.getCause()); 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object newValue = new Object(); 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueRef.set(newValue); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(newValue, cache.getUnchecked(new Object())); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetUnchecked_unchecked() { 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final RuntimeException cause = new RuntimeException(); 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final AtomicReference<Object> valueRef = new AtomicReference<Object>(); 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LoadingCache<Object, Object> cache = new AbstractLoadingCache<Object, Object>() { 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object get(Object key) throws ExecutionException { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object v = valueRef.get(); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (v == null) { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new ExecutionException(cause); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return v; 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object getIfPresent(Object key) { 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return valueRef.get(); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert cache.getUnchecked(new Object()); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UncheckedExecutionException expected) { 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(cause, expected.getCause()); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object newValue = new Object(); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueRef.set(newValue); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(newValue, cache.getUnchecked(new Object())); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetUnchecked_error() { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Error cause = new Error(); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final AtomicReference<Object> valueRef = new AtomicReference<Object>(); 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LoadingCache<Object, Object> cache = new AbstractLoadingCache<Object, Object>() { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object get(Object key) throws ExecutionException { 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object v = valueRef.get(); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (v == null) { 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new ExecutionError(cause); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return v; 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object getIfPresent(Object key) { 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return valueRef.get(); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert cache.getUnchecked(new Object()); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ExecutionError expected) { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(cause, expected.getCause()); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object newValue = new Object(); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueRef.set(newValue); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(newValue, cache.getUnchecked(new Object())); 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetUnchecked_otherThrowable() { 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Throwable cause = new Throwable(); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final AtomicReference<Object> valueRef = new AtomicReference<Object>(); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LoadingCache<Object, Object> cache = new AbstractLoadingCache<Object, Object>() { 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object get(Object key) throws ExecutionException { 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object v = valueRef.get(); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (v == null) { 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new ExecutionException(cause); 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return v; 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object getIfPresent(Object key) { 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return valueRef.get(); 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert cache.getUnchecked(new Object()); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UncheckedExecutionException expected) { 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(cause, expected.getCause()); 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object newValue = new Object(); 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueRef.set(newValue); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(newValue, cache.getUnchecked(new Object())); 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 158