11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the License
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * or implied. See the License for the specific language governing permissions and limitations under
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.cache;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.cache.CacheTesting.checkEmpty;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.cache.TestingCacheLoaders.constantLoader;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.cache.TestingCacheLoaders.exceptionLoader;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.cache.TestingRemovalListeners.queuingRemovalListener;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.concurrent.TimeUnit.SECONDS;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.cache.CacheLoader.InvalidCacheLoadException;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.cache.TestingRemovalListeners.QueuingRemovalListener;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.util.concurrent.UncheckedExecutionException;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link LoadingCache} tests for caches with a maximum size of zero.
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author mike nonemacher
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class NullCacheTest extends TestCase {
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  QueuingRemovalListener<Object, Object> listener;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected void setUp() {
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    listener = queuingRemovalListener();
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet() {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object computed = new Object();
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .maximumSize(0)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .removalListener(listener)
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build(constantLoader(computed));
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object key = new Object();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, cache.getUnchecked(key));
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RemovalNotification<Object, Object> notification = listener.remove();
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(key, notification.getKey());
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, notification.getValue());
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(RemovalCause.SIZE, notification.getCause());
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(listener.isEmpty());
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkEmpty(cache);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_expireAfterWrite() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object computed = new Object();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .expireAfterWrite(0, SECONDS)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .removalListener(listener)
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build(constantLoader(computed));
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object key = new Object();
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, cache.getUnchecked(key));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RemovalNotification<Object, Object> notification = listener.remove();
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(key, notification.getKey());
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, notification.getValue());
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(RemovalCause.SIZE, notification.getCause());
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(listener.isEmpty());
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkEmpty(cache);
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_expireAfterAccess() {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object computed = new Object();
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .expireAfterAccess(0, SECONDS)
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .removalListener(listener)
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build(constantLoader(computed));
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object key = new Object();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, cache.getUnchecked(key));
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RemovalNotification<Object, Object> notification = listener.remove();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(key, notification.getKey());
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(computed, notification.getValue());
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(RemovalCause.SIZE, notification.getCause());
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(listener.isEmpty());
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkEmpty(cache);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_computeNull() {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .maximumSize(0)
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .removalListener(listener)
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build(constantLoader(null));
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(new Object());
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (InvalidCacheLoadException e) { /* expected */}
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(listener.isEmpty());
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkEmpty(cache);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_runtimeException() {
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final RuntimeException e = new RuntimeException();
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LoadingCache<Object, Object> map = CacheBuilder.newBuilder()
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .maximumSize(0)
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .removalListener(listener)
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build(exceptionLoader(e));
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.getUnchecked(new Object());
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UncheckedExecutionException uee) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(e, uee.getCause());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(listener.isEmpty());
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkEmpty(map);
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
125