package org.infinispan.scripting;
import static org.infinispan.scripting.utils.ScriptingUtils.getScriptingManager;
import static org.infinispan.scripting.utils.ScriptingUtils.loadData;
import static org.infinispan.scripting.utils.ScriptingUtils.loadScript;
import static org.infinispan.test.TestingUtil.waitForNoRebalance;
import static org.infinispan.test.TestingUtil.withCacheManagers;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.context.Flag;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.remoting.transport.jgroups.JGroupsAddress;
import org.infinispan.tasks.TaskContext;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.MultiCacheManagerCallable;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "scripting.ClusteredScriptingTest")
public class ClusteredScriptingTest extends AbstractInfinispanTest {
public static final int EXPECTED_WORDS = 3202;
@Test(dataProvider = "cacheModeProvider")
public void testLocalScriptExecutionWithCache(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(
TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
@Override
public void call() throws IOException, ExecutionException, InterruptedException {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
for(EmbeddedCacheManager cm : cms) {
cm.defineConfiguration(ScriptingTest.CACHE_NAME, cm.getDefaultCacheConfiguration());
}
Cache cache = cms[0].getCache(ScriptingTest.CACHE_NAME);
loadScript(scriptingManager, "/test.js");
executeScriptOnManager("test.js", cms[0]);
executeScriptOnManager("test.js", cms[1]);
}
});
}
@Test(dataProvider = "cacheModeProvider")
public void testLocalScriptExecutionWithCache1(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
@Override
public void call() throws Exception {
for(EmbeddedCacheManager cm : cms) {
cm.defineConfiguration(ScriptingTest.CACHE_NAME, cm.getDefaultCacheConfiguration());
}
Cache<Object, Object> cache = cms[0].getCache(ScriptingTest.CACHE_NAME);
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
loadScript(scriptingManager, "/test1.js");
cache.put("a", "newValue");
executeScriptOnManager("test1.js", cms[0]);
executeScriptOnManager("test1.js", cms[1]);
}
});
}
@Test(dataProvider = "cacheModeProvider")
public void testDistExecScriptWithCache(final CacheMode cacheMode) throws IOException, InterruptedException, ExecutionException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
loadScript(scriptingManager, "/distExec1.js");
waitForNoRebalance(cache1, cache2);
CompletableFuture<ArrayList<JGroupsAddress>> resultsFuture = scriptingManager.runScript("distExec1.js", new TaskContext().cache(cache1));
ArrayList<JGroupsAddress> results = resultsFuture.get();
assertEquals(2, results.size());
assertTrue(results.contains(cms[0].getAddress()));
assertTrue(results.contains(cms[1].getAddress()));
}
});
}
@Test(dataProvider = "cacheModeProvider")
public void testDistExecScriptWithCacheManagerAndParams(final CacheMode cacheMode) throws IOException, InterruptedException, ExecutionException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
loadScript(scriptingManager, "/distExec.js");
waitForNoRebalance(cache1, cache2);
CompletableFuture<ArrayList<JGroupsAddress>> resultsFuture = scriptingManager.runScript("distExec.js",
new TaskContext().cache(cache1).addParameter("a", "value"));
ArrayList<JGroupsAddress> results = resultsFuture.get();
assertEquals(2, results.size());
assertTrue(results.contains(cms[0].getAddress()));
assertTrue(results.contains(cms[1].getAddress()));
assertEquals("value", cache1.get("a"));
assertEquals("value", cache2.get("a"));
}
});
}
@Test(expectedExceptions = IllegalStateException.class, dataProvider = "cacheModeProvider", expectedExceptionsMessageRegExp = ".*without a cache binding.*")
public void testDistributedScriptExecutionWithoutCacheBinding(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
loadScript(scriptingManager, "/distExec.js");
scriptingManager.runScript("distExec.js").get();
}
});
}
@Test(dataProvider = "cacheModeProvider")
public void testDistributedMapReduceStreamWithFlag(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
loadData(cache1, "/macbeth.txt");
loadScript(scriptingManager, "/wordCountStream.js");
waitForNoRebalance(cache1, cache2);
Map<String, Long> resultsFuture = (Map<String, Long>) scriptingManager.runScript(
"wordCountStream.js", new TaskContext().cache(cache1.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL))).get();
assertEquals(EXPECTED_WORDS, resultsFuture.size());
assertEquals(resultsFuture.get("macbeth"), Long.valueOf(287));
resultsFuture = (Map<String, Long>) scriptingManager.runScript(
"wordCountStream.js", new TaskContext().cache(cache1.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL))).get();
assertEquals(EXPECTED_WORDS, resultsFuture.size());
assertEquals(resultsFuture.get("macbeth"), Long.valueOf(287));
}
});
}
@Test(enabled = false, dataProvider = "cacheModeProvider", description = "Disabled due to ISPN-6173.")
public void testDistributedMapReduceStreamLocalMode(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
loadData(cache1, "/macbeth.txt");
loadScript(scriptingManager, "/wordCountStream_serializable.js");
waitForNoRebalance(cache1, cache2);
ArrayList<Map<String, Long>> resultsFuture = (ArrayList<Map<String, Long>>) scriptingManager.runScript(
"wordCountStream_serializable.js", new TaskContext().cache(cache1)).get();
assertEquals(2, resultsFuture.size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(0).size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(1).size());
assertEquals(resultsFuture.get(0).get("macbeth"), Long.valueOf(287));
assertEquals(resultsFuture.get(1).get("macbeth"), Long.valueOf(287));
}
});
}
@Test(enabled = false, dataProvider = "cacheModeProvider", description = "Disabled due to ISPN-6173.")
public void testDistributedMapReduceStreamLocalModeWithExecutors(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
loadData(cache1, "/macbeth.txt");
loadScript(scriptingManager, "/wordCountStream_Exec.js");
waitForNoRebalance(cache1, cache2);
ArrayList<Map<String, Long>> resultsFuture = (ArrayList<Map<String, Long>>) scriptingManager.runScript(
"wordCountStream_Exec.js", new TaskContext().cache(cache1)).get();
assertEquals(2, resultsFuture.size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(0).size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(1).size());
assertEquals(resultsFuture.get(0).get("macbeth"), Long.valueOf(287));
assertEquals(resultsFuture.get(1).get("macbeth"), Long.valueOf(287));
}
});
}
@Test(enabled = false, dataProvider = "cacheModeProvider", description = "Disabled due to ISPN-6173.")
public void testDistributedMapReduceStream(final CacheMode cacheMode) throws IOException, ExecutionException, InterruptedException {
withCacheManagers(new MultiCacheManagerCallable(TestCacheManagerFactory.createCacheManager(cacheMode, false),
TestCacheManagerFactory.createCacheManager(cacheMode, false)) {
public void call() throws Exception {
ScriptingManager scriptingManager = getScriptingManager(cms[0]);
Cache cache1 = cms[0].getCache();
Cache cache2 = cms[1].getCache();
loadData(cache1, "/macbeth.txt");
loadScript(scriptingManager, "/wordCountStream_dist.js");
waitForNoRebalance(cache1, cache2);
ArrayList<Map<String, Long>> resultsFuture = (ArrayList<Map<String, Long>>) scriptingManager.runScript(
"wordCountStream_dist.js", new TaskContext().cache(cache1)).get();
assertEquals(2, resultsFuture.size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(0).size());
assertEquals(EXPECTED_WORDS, resultsFuture.get(1).size());
assertEquals(resultsFuture.get(0).get("macbeth"), Long.valueOf(287));
assertEquals(resultsFuture.get(1).get("macbeth"), Long.valueOf(287));
}
});
}
private void executeScriptOnManager(String scriptName, EmbeddedCacheManager cacheManager) throws InterruptedException, ExecutionException {
ScriptingManager scriptingManager = getScriptingManager(cacheManager);
String value = (String) scriptingManager.runScript(scriptName, new TaskContext().addParameter("a", "value")).get();
assertEquals(value, cacheManager.getCache(ScriptingTest.CACHE_NAME).get("a"));
}
@DataProvider(name = "cacheModeProvider")
private static Object[][] provideCacheMode() {
return new Object[][] {{CacheMode.REPL_SYNC}, {CacheMode.DIST_SYNC}};
}
}