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.identityLoader;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.concurrent.TimeUnit.SECONDS;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.cache.CacheBuilderFactory.DurationSpec;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.cache.LocalCache.Strength;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSet;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Iterables;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Maps;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutionException;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link LoadingCache} tests that deal with empty caches.
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author mike nonemacher
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
427dd252788645e940eada959bdde927426e2531c9Paul Duffin
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EmptyCachesTest extends TestCase {
447dd252788645e940eada959bdde927426e2531c9Paul Duffin
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmpty() {
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInvalidate_empty() {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked("a");
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked("b");
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.invalidate("a");
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.invalidate("b");
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.invalidate(0);
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInvalidateAll_empty() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked("a");
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked("b");
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked("c");
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.invalidateAll();
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_null() {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(cache.equals(null));
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEqualsAndHashCode_different() {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (CacheBuilder<Object, Object> builder : cacheFactory().buildAllPermutations()) {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // all caches should be different: instance equality
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new EqualsTester()
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addEqualityGroup(builder.build(identityLoader()))
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addEqualityGroup(builder.build(identityLoader()))
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addEqualityGroup(builder.build(identityLoader()))
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .testEquals();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_null() throws ExecutionException {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.get(null);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected NullPointerException");
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException e) {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetUnchecked_null() {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.getUnchecked(null);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected NullPointerException");
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException e) {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* ---------------- Key Set -------------- */
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet_nullToArray() {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Object> keys = cache.asMap().keySet();
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        keys.toArray(null);
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException e) {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet_addNotSupported() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().keySet().add(1);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().keySet().addAll(asList(1, 2));
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet_clear() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      warmUp(cache, 0, 100);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Object> keys = cache.asMap().keySet();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keys.clear();
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(keys);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet_empty_remove() {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Object> keys = cache.asMap().keySet();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(null));
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(6));
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(-6));
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.removeAll(asList(null, 0, 15, 1500)));
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.retainAll(asList(null, 0, 15, 1500)));
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(keys);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet_remove() {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(1);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(2);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Object> keys = cache.asMap().keySet();
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // We don't know whether these are still in the cache, so we can't assert on the return
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // values of these removes, but the cache should be empty after the removes, regardless.
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keys.remove(1);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keys.remove(2);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(null));
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(6));
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.remove(-6));
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.removeAll(asList(null, 0, 15, 1500)));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(keys.retainAll(asList(null, 0, 15, 1500)));
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(keys);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* ---------------- Values -------------- */
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues_nullToArray() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Object> values = cache.asMap().values();
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        values.toArray(null);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException e) {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues_addNotSupported() {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().values().add(1);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().values().addAll(asList(1, 2));
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues_clear() {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      warmUp(cache, 0, 100);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Object> values = cache.asMap().values();
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      values.clear();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(values);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues_empty_remove() {
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Object> values = cache.asMap().values();
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(null));
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(6));
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(-6));
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.removeAll(asList(null, 0, 15, 1500)));
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.retainAll(asList(null, 0, 15, 1500)));
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(values);
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues_remove() {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(1);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(2);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Object> values = cache.asMap().keySet();
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // We don't know whether these are still in the cache, so we can't assert on the return
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // values of these removes, but the cache should be empty after the removes, regardless.
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      values.remove(1);
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      values.remove(2);
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(null));
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(6));
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.remove(-6));
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.removeAll(asList(null, 0, 15, 1500)));
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(values.retainAll(asList(null, 0, 15, 1500)));
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(values);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* ---------------- Entry Set -------------- */
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet_nullToArray() {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Entry<Object, Object>> entries = cache.asMap().entrySet();
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        entries.toArray(null);
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException e) {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet_addNotSupported() {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().entrySet().add(entryOf(1, 1));
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        cache.asMap().values().addAll(asList(entryOf(1, 1), entryOf(2, 2)));
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // expected
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet_clear() {
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      warmUp(cache, 0, 100);
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Entry<Object, Object>> entrySet = cache.asMap().entrySet();
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrySet.clear();
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(entrySet);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet_empty_remove() {
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Entry<Object, Object>> entrySet = cache.asMap().entrySet();
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(null));
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(entryOf(6, 6)));
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(entryOf(-6, -6)));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.removeAll(asList(null, entryOf(0, 0), entryOf(15, 15))));
3187dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertFalse(entrySet.retainAll(asList(null, entryOf(0, 0), entryOf(15, 15))));
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(entrySet);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet_remove() {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (LoadingCache<Object, Object> cache : caches()) {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(1);
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(2);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Entry<Object, Object>> entrySet = cache.asMap().entrySet();
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // We don't know whether these are still in the cache, so we can't assert on the return
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // values of these removes, but the cache should be empty after the removes, regardless.
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrySet.remove(entryOf(1, 1));
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrySet.remove(entryOf(2, 2));
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(null));
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(entryOf(1, 1)));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.remove(entryOf(6, 6)));
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.removeAll(asList(null, entryOf(1, 1), entryOf(15, 15))));
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(entrySet.retainAll(asList(null, entryOf(1, 1), entryOf(15, 15))));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(entrySet);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkEmpty(cache);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* ---------------- Local utilities -------------- */
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Most of the tests in this class run against every one of these caches.
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Iterable<LoadingCache<Object, Object>> caches() {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // lots of different ways to configure a LoadingCache
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CacheBuilderFactory factory = cacheFactory();
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Iterables.transform(factory.buildAllPermutations(),
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<CacheBuilder<Object, Object>, LoadingCache<Object, Object>>() {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public LoadingCache<Object, Object> apply(
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              CacheBuilder<Object, Object> builder) {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return builder.build(identityLoader());
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private CacheBuilderFactory cacheFactory() {
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new CacheBuilderFactory()
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyStrengths(ImmutableSet.of(Strength.STRONG, Strength.WEAK))
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withValueStrengths(ImmutableSet.copyOf(Strength.values()))
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withConcurrencyLevels(ImmutableSet.of(1, 4, 16, 64))
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withMaximumSizes(ImmutableSet.of(0, 1, 10, 100, 1000))
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withInitialCapacities(ImmutableSet.of(0, 1, 10, 100, 1000))
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withExpireAfterWrites(ImmutableSet.of(
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            DurationSpec.of(0, SECONDS),
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            DurationSpec.of(1, SECONDS),
3717dd252788645e940eada959bdde927426e2531c9Paul Duffin            DurationSpec.of(24 * 60 * 60 * 1, SECONDS)))
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withExpireAfterAccesses(ImmutableSet.of(
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            DurationSpec.of(0, SECONDS),
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            DurationSpec.of(1, SECONDS),
3757dd252788645e940eada959bdde927426e2531c9Paul Duffin            DurationSpec.of(24 * 60 * 60 * 1, SECONDS)))
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withRefreshes(ImmutableSet.of(
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            DurationSpec.of(1, SECONDS),
3787dd252788645e940eada959bdde927426e2531c9Paul Duffin            DurationSpec.of(24 * 60 * 60 * 1, SECONDS)));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void warmUp(LoadingCache<Object, Object> cache, int minimum, int maximum) {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = minimum; i < maximum; i++) {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cache.getUnchecked(i);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<Object, Object> entryOf(Object key, Object value) {
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Maps.immutableEntry(key, value);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
391