/* * JBoss, Home of Professional Open Source * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. */ package org.searchisko.api.tasker; import java.io.InterruptedIOException; import org.elasticsearch.index.Index; import org.elasticsearch.indices.IndexMissingException; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; /** * Unit test for {@link Task}. * * @author Vlastimil Elias (velias at redhat dot com) */ public class TaskTest { private static final String TASK_ID = "task id"; @Test public void run() throws InterruptedException { // case - finished OK { Task tested = getTested(); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FINISHED_OK, null); } // case - canceled { Task tested = getTested(); tested.setCanceled(true); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.CANCELED, null); } // case - runtime exception { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new RuntimeException("my runtime exception message"); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FAILOVER, "ERROR: Task execution interrupted due java.lang.RuntimeException: my runtime exception message"); } // case - index missing exception { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new IndexMissingException(new Index("my_index")); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FINISHED_ERROR, "ERROR: Task finished due missing search index: [my_index] missing"); } // case - null pointer exception { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new NullPointerException(); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FAILOVER, "ERROR: Task execution interrupted due NullPointerException, see log file for stacktrace"); } // case - checked exception { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new Exception("my exception message"); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FINISHED_ERROR, "ERROR: Task finished due exception: my exception message"); } // case - interrupted { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new InterruptedException(); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FAILOVER, "Task execution was interrupted"); } // case - interrupted IO { Task tested = getTested(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { throw new InterruptedIOException(); } }); tested.run(); Mockito.verify(tested.context).changeTaskStatus(TASK_ID, TaskStatus.FAILOVER, "Task execution was interrupted"); } } @Test public void isCanceledOrInterrupted() throws InterruptedException { Task tested = getTested(); Assert.assertFalse(tested.isCanceledOrInterrupted()); tested.setCanceled(true); Assert.assertTrue(tested.isCanceledOrInterrupted()); tested.setCanceled(false); Assert.assertFalse(tested.isCanceledOrInterrupted()); } @Test public void writeTaskLog() { Task tested = getTested(); tested.taskId = "taskid"; tested.writeTaskLog("mymessage"); Mockito.verify(tested.context).writeTaskLog(tested.taskId, "mymessage"); } @Test public void setExecutionContext() { Task tested = getTested(); TaskExecutionContext context = Mockito.mock(TaskExecutionContext.class); tested.setExecutionContext("mytaskid", context); Assert.assertEquals("mytaskid", tested.taskId); Assert.assertEquals(context, tested.context); Assert.assertFalse(tested.isDaemon()); } private Task getTested() { return getTested(null); } private Task getTested(final Answer<Boolean> answer) { Task t = new Task() { @Override protected void performTask() throws Exception { try { if (answer != null) answer.answer(null); } catch (Exception e) { throw e; } catch (Throwable t) { throw new Exception(t); } } }; t.taskId = TASK_ID; t.context = Mockito.mock(TaskExecutionContext.class); return t; } }