package org.infinispan.server.test.task;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
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.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.server.test.task.servertask.DistributedCacheUsingTask;
import org.infinispan.server.test.task.servertask.DistributedJSExecutingServerTask;
import org.infinispan.server.test.task.servertask.DistributedMapReduceServerTask;
import org.infinispan.server.test.task.servertask.DistributedTestServerTask;
import org.infinispan.server.test.task.servertask.JSExecutingServerTask;
import org.infinispan.server.test.task.servertask.LocalMapReduceServerTask;
import org.infinispan.tasks.ServerTask;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
/**
* Abstract class holding tests for Remote Task Execution in Distributed mode.
*
* @author amanukya
*/
public abstract class AbstractDistributedServerTaskIT {
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
private static List<RemoteCacheManager> managers = null;
protected abstract List<RemoteInfinispanServer> getServers();
protected static List<String> expectedServerList;
protected static final String CACHE_NAME = DistributedMapReduceServerTask.CACHE_NAME;
protected static final String CACHE_NAME_TX = DistributedCacheUsingTask.CACHE_NAME;
@Before
public void setUp() {
if (managers == null) {
Configuration conf;
managers = new ArrayList<>();
for (RemoteInfinispanServer server : getServers()) {
conf = new ConfigurationBuilder().addServer().host(server.getHotrodEndpoint().getInetAddress().getHostName())
.port(server.getHotrodEndpoint().getPort()).build();
managers.add(new RemoteCacheManager(conf, true));
}
}
for (RemoteCacheManager rcm : managers) {
rcm.getCache().clear();
rcm.getCache(CACHE_NAME).clear();
rcm.getCache(CACHE_NAME_TX).clear();
}
}
@AfterClass
public static void release() {
if (managers != null && !managers.isEmpty()) {
for (RemoteCacheManager manager : managers) {
manager.stop();
}
}
}
protected static JavaArchive createJavaArchive() {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class);
jar.addClass(DistributedTestServerTask.class);
jar.addClass(DistributedCacheUsingTask.class);
jar.addClass(DistributedMapReduceServerTask.class);
jar.addClass(DistributedJSExecutingServerTask.class);
jar.addClass(LocalMapReduceServerTask.class);
jar.addClass(JSExecutingServerTask.class);
jar.addAsServiceProvider(ServerTask.class, DistributedTestServerTask.class, DistributedCacheUsingTask.class,
DistributedMapReduceServerTask.class, DistributedJSExecutingServerTask.class);
return jar;
}
@Test
@SuppressWarnings("unchecked")
public void shouldGatherNodeNamesInRemoteTasks() throws Exception {
Object resultObject = managers.get(0).getCache().execute(DistributedTestServerTask.NAME, Collections.emptyMap());
assertNotNull(resultObject);
List<String> result = (List<String>) resultObject;
assertEquals(2, result.size());
System.out.println("The RESULT IS: " + result);
assertTrue("result list does not contain expected items.", result.containsAll(expectedServerList));
}
@Test
@SuppressWarnings("unchecked")
public void shouldThrowExceptionInRemoteTasks() throws Exception {
Map<String, Boolean> params = new HashMap<String, Boolean>();
params.put("throwException", true);
exceptionRule.expect(HotRodClientException.class);
exceptionRule.expectMessage("Intentionally Thrown Exception");
managers.get(0).getCache().execute(DistributedTestServerTask.NAME, params);
}
@Test
@SuppressWarnings("unchecked")
public void shouldPutNewValueInRemoteCache() throws Exception {
String key = "key";
String value = "value";
String paramValue = "parameter";
Map<String, String> params = new HashMap<>();
params.put(DistributedCacheUsingTask.PARAM_KEY, paramValue);
managers.get(1).getCache(CACHE_NAME_TX);
managers.get(0).getCache(CACHE_NAME_TX).put(key, value);
managers.get(0).getCache(CACHE_NAME_TX).execute(DistributedCacheUsingTask.NAME, params);
assertEquals("modified:modified:value:parameter:parameter", managers.get(0).getCache(CACHE_NAME_TX).get(key));
}
@Test
@SuppressWarnings("unchecked")
public void shouldExecuteMapReduceOnReplCacheViaTask() throws Exception {
RemoteCache remoteCache = managers.get(1).getCache(DistributedMapReduceServerTask.CACHE_NAME);
remoteCache.put(1, "word1 word2 word3");
remoteCache.put(2, "word1 word2");
remoteCache.put(3, "word1");
List<Map<String, Long>> result = (List<Map<String, Long>>)remoteCache.execute(DistributedMapReduceServerTask.NAME, Collections.emptyMap());
assertEquals(2, result.size());
verifyMapReduceResult(result.get(0));
verifyMapReduceResult(result.get(1));
}
@Test
@Ignore(value="Is disabled until ISPN-6173 is fixed.")
public void shouldExecuteMapReduceViaJavaScriptInTask() throws Exception {
RemoteCache remoteCache = managers.get(1).getCache(DistributedJSExecutingServerTask.CACHE_NAME);
remoteCache.put(1, "word1 word2 word3");
remoteCache.put(2, "word1 word2");
remoteCache.put(3, "word1");
List<Map<String, Long>> result = (List<Map<String, Long>>)remoteCache.execute(DistributedJSExecutingServerTask.NAME, Collections.emptyMap());
assertEquals(2, result.size());
verifyMapReduceResult(result.get(0));
verifyMapReduceResult(result.get(1));
}
private void verifyMapReduceResult(Map<String, Long> result) {
assertEquals(3, result.size());
assertEquals(3, result.get("word1").intValue());
assertEquals(2, result.get("word2").intValue());
assertEquals(1, result.get("word3").intValue());
}
}