package org.infinispan.server.test.client.hotrod; import static java.util.Collections.emptyMap; import static org.infinispan.test.TestingUtil.loadFileAsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import org.infinispan.arquillian.core.InfinispanResource; 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.category.HotRodSingleNode; import org.jboss.arquillian.junit.Arquillian; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; /** * @author gustavonalle * @since 8.0 */ @RunWith(Arquillian.class) @Category(HotRodSingleNode.class) public class ScriptExecIT { private static final String SCRIPT_CACHE_NAME = "___script_cache"; private static final String COMPATIBILITY_CACHE_NAME = "compatibilityCache"; private static final String STREAM = "stream.js"; static RemoteCacheManager remoteCacheManager; RemoteCache<Integer, String> remoteCache; RemoteCache<String, String> scriptCache; @InfinispanResource("container1") RemoteInfinispanServer server1; @Rule public ExpectedException exceptionRule = ExpectedException.none(); @Before public void initialize() { if (remoteCacheManager == null) { Configuration config = createRemoteCacheManagerConfiguration(); remoteCacheManager = new RemoteCacheManager(config, true); } scriptCache = remoteCacheManager.getCache(SCRIPT_CACHE_NAME); remoteCache = remoteCacheManager.getCache(); } @After public void clearCache() { remoteCache.clear(); remoteCacheManager.getCache(COMPATIBILITY_CACHE_NAME).clear(); } private Configuration createRemoteCacheManagerConfiguration() { ConfigurationBuilder config = new ConfigurationBuilder(); config.addServer() .host(server1.getHotrodEndpoint().getInetAddress().getHostName()) .port(server1.getHotrodEndpoint().getPort()); return config.build(); } @Test public void testRemovingNonExistentScript() { exceptionRule.expect(HotRodClientException.class); exceptionRule.expectMessage("Unknown task"); remoteCache.execute("nonExistent.js", new HashMap<>()); } @Test public void testSimpleScriptExecutionWithParams() throws IOException { RemoteCache<String, String> remoteCache = remoteCacheManager.getCache(COMPATIBILITY_CACHE_NAME); addScripts("test.js"); Map<String, Object> parameters = new HashMap<>(); parameters.put("key", "parameter"); parameters.put("value", "value"); int result = remoteCache.execute("test.js", parameters); assertEquals(1, result); assertEquals("value", remoteCache.get("parameter")); } @Test public void testMapReduceScriptExecution() throws IOException { RemoteCache<String, String> remoteCache = remoteCacheManager.getCache(COMPATIBILITY_CACHE_NAME); addScripts("stream_serverTask.js"); remoteCache.put("1", "word1 word2 word3"); remoteCache.put("2", "word1 word2"); remoteCache.put("3", "word1"); Map<String, Long> results = remoteCache.execute("stream_serverTask.js", emptyMap()); assertEquals(3, results.size()); assertTrue(results.get("word1").equals(Long.valueOf(3))); assertTrue(results.get("word2").equals(Long.valueOf(2))); assertTrue(results.get("word3").equals(Long.valueOf(1))); } @Test public void testScriptExecution() throws Exception { remoteCache.clear(); remoteCache.put(1, "word1 word2 word3"); remoteCache.put(2, "word1 word2"); remoteCache.put(3, "word1"); addScripts(STREAM); Map<String, Long> results = remoteCache.execute(STREAM, emptyMap()); assertEquals(3, results.size()); assertTrue(results.get("word1").equals(Long.valueOf(3))); assertTrue(results.get("word2").equals(Long.valueOf(2))); assertTrue(results.get("word3").equals(Long.valueOf(1))); } private void addScripts(String... scripts) throws IOException { for (String script : scripts) { try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(script)) { scriptCache.put(script, loadFileAsString(in)); } } } @AfterClass public static void release() { if (remoteCacheManager != null) { remoteCacheManager.stop(); } } }