package org.infinispan.expiration.impl;
import java.util.concurrent.TimeUnit;
import org.infinispan.Cache;
import org.infinispan.commons.util.Util;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.SingleFileStoreConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.util.TimeService;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "expiration.impl.ExpirationSingleFileStoreDistListenerFunctionalTest")
public class ExpirationSingleFileStoreDistListenerFunctionalTest extends ExpirationStoreListenerFunctionalTest {
private EmbeddedCacheManager extraManager;
private Cache<Object, Object> extraCache;
@Override
protected void configure(ConfigurationBuilder config) {
config
// Prevent the reaper from running, reaperEnabled(false) doesn't work when a store is present
.expiration().wakeUpInterval(Long.MAX_VALUE)
.clustering().cacheMode(CacheMode.DIST_SYNC)
.persistence().addSingleFileStore().location(TestingUtil.tmpDirectory(this.getClass()));
}
@AfterClass(alwaysRun = true)
protected void clearTempDir() {
Util.recursiveFileRemove(TestingUtil.tmpDirectory(this.getClass()));
Util.recursiveFileRemove(TestingUtil.tmpDirectory(this.getClass().getSimpleName() + "2"));
}
protected void removeFromContainer(String key) {
super.removeFromContainer(key);
extraCache.getAdvancedCache().getDataContainer().remove(key);
}
@Override
protected EmbeddedCacheManager createCacheManager(ConfigurationBuilder builder) {
extraManager = TestCacheManagerFactory.createClusteredCacheManager(builder);
// Inject our time service into the new CacheManager as well
TestingUtil.replaceComponent(extraManager, TimeService.class, timeService, true);
extraCache = extraManager.getCache();
SingleFileStoreConfigurationBuilder sfsBuilder = (SingleFileStoreConfigurationBuilder) builder.persistence().stores().get(0);
// Make sure each cache writes to a different location
sfsBuilder.location(TestingUtil.tmpDirectory(this.getClass().getSimpleName() + "2"));
EmbeddedCacheManager returned = TestCacheManagerFactory.createClusteredCacheManager(builder);
// Unfortunately we can't reinject timeservice once a cache has been started, thus we have to inject
// here as well, since we need the cache to verify the cluster was formed
TestingUtil.replaceComponent(returned, TimeService.class, timeService, true);
Cache<Object, Object> checkCache = returned.getCache();
TestingUtil.blockUntilViewReceived(checkCache, 2, TimeUnit.SECONDS.toMillis(10));
return returned;
}
}