package org.infinispan.server.test.task; import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; 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.exceptions.HotRodClientException; import org.infinispan.server.test.category.Task; import org.infinispan.server.test.task.servertask.Greeting; import org.infinispan.server.test.task.servertask.GreetingServerTask; import org.infinispan.server.test.task.servertask.JSExecutingServerTask; import org.infinispan.server.test.task.servertask.LocalExceptionalServerTask; import org.infinispan.server.test.task.servertask.LocalMapReduceServerTask; import org.infinispan.server.test.task.servertask.LocalTestServerTask; import org.infinispan.server.test.util.ITestUtils; import org.infinispan.tasks.ServerTask; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; @RunWith(Arquillian.class) @Category({Task.class}) public class LocalServerTaskIT { @InfinispanResource("standalone-customtask") RemoteInfinispanServer server; @Rule public ExpectedException exceptionRule = ExpectedException.none(); @BeforeClass public static void before() throws Exception { String serverDir = System.getProperty("server1.dist"); JavaArchive jar = ShrinkWrap.create(JavaArchive.class); jar.addClass(LocalTestServerTask.class); jar.addClass(LocalExceptionalServerTask.class); jar.addClass(LocalMapReduceServerTask.class); jar.addClass(JSExecutingServerTask.class); jar.addClass(GreetingServerTask.class); jar.addClass(Greeting.class); jar.addAsServiceProvider(ServerTask.class, LocalTestServerTask.class, LocalExceptionalServerTask.class, LocalMapReduceServerTask.class, JSExecutingServerTask.class, GreetingServerTask.class); jar.addAsResource(new File("/stream_serverTask.js")); jar.addAsManifestResource("MANIFEST.MF"); File f = new File(serverDir, "/standalone/deployments/custom-task.jar"); jar.as(ZipExporter.class).exportTo(f, true); } @AfterClass public static void undeploy() { String serverDir = System.getProperty("server1.dist"); File jar = new File(serverDir, "/standalone/deployments/custom-task.jar"); if (jar.exists()) jar.delete(); File f = new File(serverDir, "/standalone/deployments/custom-task.jar.deployed"); if (f.exists()) f.delete(); } @Test @WithRunningServer({@RunningServer(name = "standalone-customtask")}) public void shouldModifyCacheInViaTask() throws Exception { RemoteCacheManager rcm = ITestUtils.createCacheManager(server); String value = "value"; rcm.getCache().put(LocalTestServerTask.TASK_EXECUTED, value); rcm.getCache().execute(LocalTestServerTask.NAME, Collections.emptyMap()); assertEquals(LocalTestServerTask.MODIFIED_PREFIX + value, rcm.getCache().get(LocalTestServerTask.TASK_EXECUTED)); assertEquals(LocalTestServerTask.MODIFIED_PREFIX + value, rcm.getCache(LocalTestServerTask.CACHE_NAME).get(LocalTestServerTask.TASK_EXECUTED)); } @Test @WithRunningServer({@RunningServer(name = "standalone-customtask")}) public void shouldThrowExceptionInViaTask() throws Exception { RemoteCacheManager rcm = ITestUtils.createCacheManager(server); exceptionRule.expect(HotRodClientException.class); exceptionRule.expectMessage(LocalExceptionalServerTask.EXCEPTION_MESSAGE); rcm.getCache().execute(LocalExceptionalServerTask.NAME, Collections.emptyMap()); } @Test @WithRunningServer({@RunningServer(name = "standalone-customtask")}) public void shouldExecuteMapReduceViaTask() throws Exception { RemoteCacheManager rcm = ITestUtils.createCacheManager(server); RemoteCache remoteCache = rcm.getCache(); remoteCache.put(1, "word1 word2 word3"); remoteCache.put(2, "word1 word2"); remoteCache.put(3, "word1"); Map<String, Long> result = (Map<String, Long>)remoteCache.execute(LocalMapReduceServerTask.NAME, Collections.emptyMap()); assertEquals(3, result.size()); assertEquals(3, result.get("word1").intValue()); assertEquals(2, result.get("word2").intValue()); assertEquals(1, result.get("word3").intValue()); } @Test @WithRunningServer({@RunningServer(name = "standalone-customtask")}) public void shouldExecuteMapReduceViaJavaScriptInTask() throws Exception { RemoteCacheManager rcm = ITestUtils.createCacheManager(server); RemoteCache remoteCache = rcm.getCache(); remoteCache.put(1, "word1 word2 word3"); remoteCache.put(2, "word1 word2"); remoteCache.put(3, "word1"); Map<String, Long> result = (Map<String, Long>)remoteCache.execute(JSExecutingServerTask.NAME, Collections.emptyMap()); assertEquals(3, result.size()); assertEquals(3, result.get("word1").intValue()); assertEquals(2, result.get("word2").intValue()); assertEquals(1, result.get("word3").intValue()); } @Test @WithRunningServer({@RunningServer(name = "standalone-customtask")}) public void shouldWorkWithCustomMojo() throws Exception { RemoteCacheManager rcm = ITestUtils.createCacheManager(server); RemoteCache remoteCache = rcm.getCache(); Map params = new HashMap(); params.put("greeting", toBytes(new Greeting("hello, good morning :)"))); String result = (String) remoteCache.execute(GreetingServerTask.NAME, params); assertEquals("hello, good morning :)", result); } private byte[] toBytes(Object o) { try { ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(o); oos.close(); return os.toByteArray(); } catch (IOException e) { throw new AssertionError(e); } } }