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