package org.infinispan.jcache; import static org.infinispan.jcache.util.JCacheTestingUtil.sleep; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import java.io.Serializable; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicInteger; import javax.cache.Cache; import javax.cache.configuration.FactoryBuilder; import javax.cache.configuration.MutableCacheEntryListenerConfiguration; import javax.cache.event.CacheEntryExpiredListener; import javax.cache.event.CacheEntryListenerException; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.util.ControlledTimeService; import org.testng.annotations.Test; /** * Base class for clustered JCache expiration tests. Implementations must provide cache references. * * @author Matej Cimbora */ @Test(testName = "org.infinispan.jcache.AbstractTwoCachesExpirationTest", groups = "functional") public abstract class AbstractTwoCachesExpirationTest extends MultipleCacheManagersTest { protected final ControlledTimeService controlledTimeService = new ControlledTimeService(); protected static final int EXPIRATION_TIMEOUT = 1000; @Test public void testExpiration(Method m) { Cache<String, String> cache1 = getCache1(m); Cache<String, String> cache2 = getCache2(m); TestExpiredListener listener = new TestExpiredListener(); MutableCacheEntryListenerConfiguration conf1 = new MutableCacheEntryListenerConfiguration(FactoryBuilder.factoryOf(listener), null, false, false); cache1.registerCacheEntryListener(conf1); cache2.put("key1", "val1"); controlledTimeService.advance(EXPIRATION_TIMEOUT + 1000); eventually(() -> listener.invocationCount.get() >0); assertNull(cache1.get("key1")); listener.invocationCount.set(0); cache1.deregisterCacheEntryListener(conf1); cache2.put("key2", "val2"); controlledTimeService.advance(EXPIRATION_TIMEOUT + 1000); assertNull(cache1.get("key2")); sleep(EXPIRATION_TIMEOUT); assertEquals(listener.invocationCount.get(), 0); } private static class TestExpiredListener implements CacheEntryExpiredListener, Serializable { private final AtomicInteger invocationCount = new AtomicInteger(0); @Override public void onExpired(Iterable iterable) throws CacheEntryListenerException { iterable.forEach(e -> invocationCount.incrementAndGet()); } } public abstract Cache getCache1(Method m); public abstract Cache getCache2(Method m); }