package org.infinispan.tasks; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.tasks.DummyTaskEngine.DummyTaskTypes; import org.infinispan.tasks.impl.TaskManagerImpl; import org.infinispan.tasks.logging.Messages; import org.infinispan.tasks.spi.TaskEngine; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.util.logging.events.EventLogCategory; import org.infinispan.util.logging.events.EventLogLevel; import org.infinispan.util.logging.events.EventLogManager; import org.testng.annotations.Test; @Test(testName = "tasks.TaskManagerTest", groups = "functional") public class TaskManagerTest extends SingleCacheManagerTest { protected TaskManagerImpl taskManager; private DummyTaskEngine taskEngine; private MemoryEventLogger memoryLogger; @Override protected EmbeddedCacheManager createCacheManager() throws Exception { return TestCacheManagerFactory.createCacheManager(); } @Override protected void setup() throws Exception { super.setup(); GlobalComponentRegistry gcr = cacheManager.getGlobalComponentRegistry(); taskManager = (TaskManagerImpl) gcr.getComponent(TaskManager.class); taskEngine = new DummyTaskEngine(); taskManager.registerTaskEngine(taskEngine); memoryLogger = new MemoryEventLogger(cacheManager, gcr.getTimeService()); gcr.getComponent(EventLogManager.class).replaceEventLogger(memoryLogger); } @Test(expectedExceptions = IllegalStateException.class) public void testRegisterDuplicateEngine() { taskManager.registerTaskEngine(taskEngine); } @Test(expectedExceptions = IllegalArgumentException.class) public void testUnhandledTask() { taskManager.runTask("UnhandledTask", new TaskContext()); } public void testStoredEngines() { Collection<TaskEngine> engines = taskManager.getEngines(); assertEquals(1, engines.size()); assertEquals(taskEngine.getName(), engines.iterator().next().getName()); } public void testRunTask() throws InterruptedException, ExecutionException { memoryLogger.reset(); CompletableFuture<String> okTask = taskManager.runTask(DummyTaskTypes.SUCCESSFUL_TASK.name(), new TaskContext().logEvent(true)); assertEquals("result", okTask.get()); assertEquals(0, taskManager.getCurrentTasks().size()); assertEquals(Messages.MESSAGES.taskSuccess(DummyTaskTypes.SUCCESSFUL_TASK.name()), memoryLogger.getMessage()); assertEquals("result", memoryLogger.getDetail()); assertEquals(EventLogCategory.TASKS, memoryLogger.getCategory()); assertEquals(EventLogLevel.INFO, memoryLogger.getLevel()); memoryLogger.reset(); CompletableFuture<Object> koTask = taskManager.runTask(DummyTaskTypes.FAILING_TASK.name(), new TaskContext().logEvent(true)); String message = koTask.handle((r, e) -> { return e.getCause().getMessage(); }).get(); assertEquals(0, taskManager.getCurrentTasks().size()); assertEquals("exception", message); assertEquals(Messages.MESSAGES.taskFailure(DummyTaskTypes.FAILING_TASK.name()), memoryLogger.getMessage()); assertTrue(memoryLogger.getDetail().contains("java.lang.Exception: exception")); assertEquals(EventLogCategory.TASKS, memoryLogger.getCategory()); assertEquals(EventLogLevel.ERROR, memoryLogger.getLevel()); memoryLogger.reset(); CompletableFuture<Object> slowTask = taskManager.runTask(DummyTaskTypes.SLOW_TASK.name(), new TaskContext().logEvent(true)); Collection<TaskExecution> currentTasks = taskManager.getCurrentTasks(); assertEquals(1, currentTasks.size()); TaskExecution execution = currentTasks.iterator().next(); assertEquals(DummyTaskTypes.SLOW_TASK.name(), execution.getName()); List<Task> tasks = taskManager.getTasks(); assertEquals(3, tasks.size()); Task task = tasks.get(2); assertEquals(DummyTaskTypes.SLOW_TASK.name(), task.getName()); assertEquals("Dummy", task.getType()); assertEquals(TaskExecutionMode.ONE_NODE, task.getExecutionMode()); taskEngine.getSlowTask().complete("slow"); assertEquals(0, taskManager.getCurrentTasks().size()); assertEquals("slow", slowTask.get()); } }