package org.infinispan.scripting; import static org.infinispan.scripting.utils.ScriptingUtils.loadData; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.infinispan.commons.CacheException; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.tasks.TaskContext; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.CleanupAfterMethod; import org.testng.annotations.Test; @Test(groups = "functional", testName = "scripting.ScriptingTest") @CleanupAfterMethod public class ScriptingTest extends AbstractScriptingTest { static final String CACHE_NAME = "script-exec"; protected String[] getScripts() { return new String[] { "test.js", "testMissingMetaProps.js", "testExecWithoutProp.js", "testInnerScriptCall.js" }; } @Override protected void setup() throws Exception { super.setup(); cacheManager.defineConfiguration(CACHE_NAME, new ConfigurationBuilder().build()); } @Override protected void clearContent() { cacheManager.getCache().clear(); } public void testSimpleScript() throws Exception { String result = (String) scriptingManager.runScript("test.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*No script named.*") public void testScriptRemove() throws Exception { scriptingManager.getScript("testExecWithoutProp.js"); scriptingManager.removeScript("testExecWithoutProp.js"); scriptingManager.getScript("testExecWithoutProp.js"); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*No script named.*") public void testRunNonExistentScript() throws Exception { String result = (String) scriptingManager.runScript("nonExistent.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*Script execution error.*") public void testSimpleScriptWitoutPassingParameter() throws Exception { String result = (String) scriptingManager.runScript("test.js").get(); assertEquals("a", result); } public void testSimpleScriptReplacementWithNew() throws ExecutionException, InterruptedException, IOException { String result = (String) scriptingManager.runScript("test.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); //Replacing the existing script with new one. InputStream is = this.getClass().getResourceAsStream("/test1.js"); String script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("test.js", script); result = (String) scriptingManager.runScript("test.js").get(); assertEquals("a:modified", result); //Rolling back the replacement. is = this.getClass().getResourceAsStream("/test.js"); script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("test.js", script); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*No script named.*") public void testScriptingCacheClear() throws Exception { String result = (String) scriptingManager.runScript("test.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); cache(ScriptingManager.SCRIPT_CACHE).clear(); result = (String) scriptingManager.runScript("test.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); } public void testScriptingCacheManualReplace() throws Exception { String result = (String) scriptingManager.runScript("test.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); //Replacing the existing script with new one. InputStream is = this.getClass().getResourceAsStream("/test1.js"); String script = TestingUtil.loadFileAsString(is); cache(ScriptingManager.SCRIPT_CACHE).replace("test.js", script); result = (String) scriptingManager.runScript("test.js").get(); assertEquals("a:modified", result); //Rolling back the replacement. is = this.getClass().getResourceAsStream("/test.js"); script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("test.js", script); } public void testSimpleScript1() throws Exception { String value = "javaValue"; String key = "processValue"; cacheManager.getCache(CACHE_NAME).put(key, value); CompletableFuture exec = scriptingManager.runScript("testExecWithoutProp.js"); exec.get(1000, TimeUnit.MILLISECONDS); assertEquals(value + ":additionFromJavascript", cacheManager.getCache(CACHE_NAME).get(key)); } public void testScriptCallFromJavascript() throws Exception { String result = (String) scriptingManager.runScript("testInnerScriptCall.js", new TaskContext().cache(cacheManager.getCache(CACHE_NAME)).addParameter("a", "ahoj")).get(); assertEquals("script1:additionFromJavascript", result); assertEquals("ahoj", cacheManager.getCache(CACHE_NAME).get("a")); } public void testSimpleScriptWithMissingLanguageInMetaPropeties() throws Exception { String result = (String) scriptingManager.runScript("testMissingMetaProps.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*No script named.*") public void testRemovingNonExistentScript() { scriptingManager.removeScript("nonExistent"); } public void testRemovingScript() throws IOException, ExecutionException, InterruptedException { assertNotNull(scriptingManager.getScript("test.js")); scriptingManager.removeScript("test.js"); assertNull(cacheManager.getCache(ScriptingManager.SCRIPT_CACHE).get("test.js")); InputStream is = this.getClass().getResourceAsStream("/test.js"); String script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("test.js", script); assertNotNull(scriptingManager.getScript("test.js")); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*Script execution error.*") public void testWrongJavaRef() throws Exception { InputStream is = this.getClass().getResourceAsStream("/testWrongJavaRef.js"); String script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("testWrongJavaRef.js", script); String result = (String) scriptingManager.runScript("testWrongJavaRef.js", new TaskContext().addParameter("a", "a")).get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*Script execution error.*") public void testWrongPropertyRef() throws Exception { InputStream is = this.getClass().getResourceAsStream("/testWrongPropertyRef.js"); String script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("testWrongPropertyRef.js", script); String result = (String) scriptingManager.runScript("testWrongPropertyRef.js").get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*Compiler error for script.*") public void testJsCompilationError() throws Exception { InputStream is = this.getClass().getResourceAsStream("/testJsCompilationError.js"); String script = TestingUtil.loadFileAsString(is); scriptingManager.addScript("testJsCompilationError.js", script); String result = (String) scriptingManager.runScript("testJsCompilationError.js").get(); assertEquals("a", result); } @Test(expectedExceptions = CacheException.class, expectedExceptionsMessageRegExp = ".*No script named.*") public void testGetNonExistentScript() { scriptingManager.getScript("nonExistent.js"); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*Cannot find an appropriate script engine for script.*") public void testNonSupportedScript() { scriptingManager.addScript("Test.java", "//mode=local,language=java\n" + "public class Test {\n" + " public static void main(String[] args) {\n" + " System.out.println(cache.get(\"test.js\"));\n" + " }\n" + " }"); scriptingManager.runScript("Test.java"); } public void testMapReduceScript() throws IOException, ExecutionException, InterruptedException { InputStream is = this.getClass().getResourceAsStream("/wordCountStream.js"); String script = TestingUtil.loadFileAsString(is); loadData(cache(), "/macbeth.txt"); scriptingManager.addScript("wordCountStream.js", script); Map<String, Long> result = (Map<String, Long>) scriptingManager.runScript("wordCountStream.js", new TaskContext().cache(cache())).get(); assertEquals(3202, result.size()); assertEquals(Long.valueOf(287), result.get("macbeth")); } }