package org.infinispan.api; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.metadata.EmbeddedMetadata; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.util.ControlledTimeService; import org.infinispan.util.TimeService; import org.testng.annotations.Test; @Test(groups = "functional", testName = "api.MetadataAPIDefaultExpiryTest") public class MetadataAPIDefaultExpiryTest extends SingleCacheManagerTest { public static final int EXPIRATION_TIMEOUT = 1000; private final ControlledTimeService controlledTimeService = new ControlledTimeService(); @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.expiration().lifespan(EXPIRATION_TIMEOUT); EmbeddedCacheManager manager = TestCacheManagerFactory.createCacheManager(builder); TestingUtil.replaceComponent(manager, TimeService.class, controlledTimeService, true); return manager; } public void testDefaultLifespanPut() { cache().put(1, "v1"); expectCachedThenExpired(1, "v1"); cache().getAdvancedCache().put(2, "v2", new EmbeddedMetadata.Builder().build()); expectCachedThenExpired(2, "v2"); } public void testDefaultLifespanReplace() { cache().put(1, "v1"); cache().replace(1, "v11"); expectCachedThenExpired(1, "v11"); cache().getAdvancedCache().put(2, "v2", new EmbeddedMetadata.Builder().build()); cache().getAdvancedCache().replace(2, "v22", new EmbeddedMetadata.Builder().build()); expectCachedThenExpired(2, "v22"); } public void testDefaultLifespanReplaceWithOldValue() { cache().put(1, "v1"); cache().replace(1, "v1", "v11"); expectCachedThenExpired(1, "v11"); cache().getAdvancedCache().put(2, "v2", new EmbeddedMetadata.Builder().build()); cache().getAdvancedCache().replace(2, "v2", "v22", new EmbeddedMetadata.Builder().build()); expectCachedThenExpired(2, "v22"); } public void testDefaultLifespanPutIfAbsent() { cache().putIfAbsent(1, "v1"); expectCachedThenExpired(1, "v1"); cache().getAdvancedCache().putIfAbsent(2, "v2", new EmbeddedMetadata.Builder().build()); expectCachedThenExpired(2, "v2"); } public void testDefaultLifespanPutForExternalRead() { cache().putForExternalRead(1, "v1"); expectCachedThenExpired(1, "v1"); cache().getAdvancedCache().putForExternalRead(2, "v2", new EmbeddedMetadata.Builder().build()); expectCachedThenExpired(2, "v2"); } public void testDefaultLifespanPutAsync() throws Exception { CompletableFuture<Object> f = cache().putAsync(1, "v1"); f.get(10, TimeUnit.SECONDS); expectCachedThenExpired(1, "v1"); f = cache().getAdvancedCache().putAsync(2, "v2", new EmbeddedMetadata.Builder().build()); f.get(10, TimeUnit.SECONDS); expectCachedThenExpired(2, "v2"); } private void expectCachedThenExpired(Integer key, String value) { // Check that it doesn't expire too early controlledTimeService.advance(EXPIRATION_TIMEOUT - 1); String v = this.<Integer, String>cache().get(key); assertEquals(value, v); // But not too late either controlledTimeService.advance(2); assertNull(cache.get(key)); } }