package org.infinispan.server.test.jcache;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.lang.management.ManagementFactory;
import java.util.stream.StreamSupport;
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.spi.CachingProvider;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.infinispan.arquillian.core.InfinispanResource;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
import org.infinispan.arquillian.core.RunningServer;
import org.infinispan.arquillian.core.WithRunningServer;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.jcache.RIMBeanServerRegistrationUtility.ObjectNameType;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test for issues related to ISPN-6574
*
* Test check whether JCache API is aware of caches defined in Infinispan server
* configuration
*
* Three tested functionalities are not yet implemented (not part of the
* original ticket), fix pending in <b>ISPN-7095</b>
*
* Calling getCache on a cache will refresh that cache inside CacheManager,
* making the other functionality work ok for that particular cache (hence the
* separate caches for each test)
*
* @author zhostasa
*
*/
@RunWith(Arquillian.class)
@WithRunningServer({ @RunningServer(name = "cachecontainer") })
public class JCacheStateAwarenessIT {
private static final String enableStatisticsTestCacheName = "enableStatisticsTestCache";
private static final String enableManagementTestCacheName = "enableManagementTestCache";
private static final String getCacheNamesTestCacheName = "getCacheNamesTestCache";
private static final String getCacheTestCacheName = "getCacheTestCache";
private static final String testKey = "testKey";
private static final String testValue = "testValue";
private static final String cachingProvider = "org.infinispan.jcache.remote.JCachingProvider";
final int managementPort = 9999;
@InfinispanResource("cachecontainer")
private RemoteInfinispanServer server1;
private RemoteCacheManager rcm1;
private CachingProvider jcacheProvider;
private CacheManager cacheManager;
private MBeanServer mBeanServer;
@Before
public void setUp() {
if (rcm1 == null) {
Configuration conf = new ConfigurationBuilder().addServer()
.host(server1.getHotrodEndpoint().getInetAddress().getHostName())
.port(server1.getHotrodEndpoint().getPort()).build();
rcm1 = new RemoteCacheManager(conf);
jcacheProvider = Caching.getCachingProvider(cachingProvider);
cacheManager = jcacheProvider.getCacheManager();
mBeanServer = ManagementFactory.getPlatformMBeanServer();
}
}
/**
* Test enableStatistics command on JCache API <br>
* <br>
* Fix pending in <b>ISPN-7095</b>
*/
@Test
@Ignore("Ignored until ISPN-7095")
public void testEnableStatistics() throws Exception {
ObjectName mBeanName = getMBeanName(enableStatisticsTestCacheName, "Statistics");
cacheManager.enableStatistics(enableStatisticsTestCacheName, true);
assertTrue("Statistics register as disabled after enabling", mBeanServer.isRegistered(mBeanName));
cacheManager.enableStatistics(enableStatisticsTestCacheName, false);
assertFalse("Statistics register as enabled after disabling", mBeanServer.isRegistered(mBeanName));
}
/**
* Test enableManagement command on JCache API<br>
* <br>
* Fix pending in <b>ISPN-7095</b>
*
* @throws MalformedObjectNameException
*/
@Test
@Ignore("Ignored until ISPN-7095")
public void testEnableManagement() throws MalformedObjectNameException {
ObjectName mBeanName = getMBeanName(enableManagementTestCacheName, "Configuration");
cacheManager.enableManagement(enableManagementTestCacheName, true);
assertTrue("Statistics register as disabled after enabling", mBeanServer.isRegistered(mBeanName));
cacheManager.enableManagement(enableManagementTestCacheName, false);
assertFalse("Statistics register as enabled after disabling", mBeanServer.isRegistered(mBeanName));
}
/**
* Creates canonical name of managed bean
*
* @param testCacheName
* name of the cache to enable management on
* @param objectNameType
* Object name as per {@link ObjectNameType}
*
* @return ObjectName of the managed bean
* @throws MalformedObjectNameException
*/
private ObjectName getMBeanName(String testCacheName, String objectNameType) throws MalformedObjectNameException {
return new ObjectName("javax.cache:type=Cache" + objectNameType + ",CacheManager="
+ cacheManager.getURI().toString() + ",Cache=" + testCacheName);
}
/**
* Test whether cache is found in cache name list of JCache API, fix
* pending<br>
* <br>
* Fix pending in <b>ISPN-7095</b>
*/
@Test
@Ignore("Ignored until ISPN-7095")
public void testGetCacheNames() {
boolean passed = StreamSupport.stream(cacheManager.getCacheNames().spliterator(), true)
.anyMatch(n -> getCacheNamesTestCacheName.equalsIgnoreCase(n));
assertTrue(getCacheNamesTestCacheName + " cache name was not found in list retrieved from CacheManager", passed);
}
/**
* Accesses cache trough HR client to confirm its existence and insert data,
* then attempts to access it trough JCache API and retrieve the data
*
* @param testCacheName
* test on specific cache name, development feature
*/
@Test
public void testCacheGet(String testCacheName) {
String cacheName = testCacheName != null ? testCacheName : getCacheTestCacheName;
RemoteCache<Object, Object> remoteCacheFromHR = rcm1.getCache(cacheName);
assertNotNull("The cache " + cacheName + " is not accessible trough HR (e.g. does not exist or is not there)",
remoteCacheFromHR);
remoteCacheFromHR.put(testKey, testValue);
Cache<Object, Object> remoteCacheFromJCache = cacheManager.getCache(cacheName);
assertNotNull("The cache " + cacheName + " is not accessible trough JCache", remoteCacheFromJCache);
assertNotNull("Cache " + cacheName + " was retrieved, but key " + testKey + " could not be retrieved",
remoteCacheFromJCache.get(testKey));
assertEquals("The cache was retrieved but the retrieved value was not same", remoteCacheFromJCache.get(testKey),
testValue);
}
}