package org.infinispan.all.remote.jcache;
import static javax.cache.configuration.FactoryBuilder.factoryOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.net.URI;
import java.util.Properties;
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableCacheEntryListenerConfiguration;
import javax.cache.configuration.MutableConfiguration;
import org.infinispan.client.hotrod.impl.ConfigurationProperties;
import org.infinispan.jcache.remote.JCachingProvider;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests for failover of JCache remote listeners
*
* @author gustavonalle
* @since 8.0
*/
@RunWith(Arquillian.class)
public class JCacheFailoverIT {
private static final String CONTAINER1 = "container-1";
private static final String CONTAINER2 = "container-2";
@ArquillianResource
private ContainerController controller;
private MutableConfiguration<String, String> createConfigurationWith(TrackingCacheEntryListener<String, String> listener) {
return new MutableConfiguration<String, String>()
.setTypes(String.class, String.class)
.addCacheEntryListenerConfiguration(
new MutableCacheEntryListenerConfiguration<>(factoryOf(listener), null, true, true));
}
private CacheManager createCacheManagerWithTimeoutInMillis(int timeout) {
Properties properties = new Properties();
properties.put(ConfigurationProperties.SO_TIMEOUT, String.valueOf(timeout));
return Caching.getCachingProvider().getCacheManager(URI.create(JCachingProvider.class.getName()), getClass().getClassLoader(), properties);
}
@Test
public void testRemoteListener() {
// Start a single server and listen to some events
controller.start(CONTAINER1);
assertTrue(controller.isStarted(CONTAINER1));
TrackingCacheEntryListener<String, String> listener = new TrackingCacheEntryListener<>();
MutableConfiguration<String, String> configuration = createConfigurationWith(listener);
CacheManager cm = createCacheManagerWithTimeoutInMillis(3000);
Cache<String, String> cache = cm.createCache("default", configuration);
cache.put("1", "value1");
assertEquals(1, listener.getCreated());
// Start a second server
controller.start(CONTAINER2);
assertTrue(controller.isStarted(CONTAINER2));
// Generate more events
cache.put("2", "value2");
assertEquals(2, listener.getCreated());
int beforeFailOver = listener.getCreated();
// Kill server where listener was registered
controller.kill(CONTAINER1);
// Generate more events
cache.put("3", "value3");
cache.put("4", "value4");
cache.put("5", "value5");
// Check events continue to arrive
assertTrue(listener.getCreated() > beforeFailOver);
}
}