/*
* 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.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.searchisko.api.testtools.TestUtils;
/**
* Unit test for {@link TaskPersisterJpa}.
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class TaskPersisterJpaTest {
@Test
public void changeTaskStatus() {
TaskPersisterJpa tested = getTested();
// case - unknown task
Mockito.reset(tested.em);
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE)).thenReturn(null);
Assert.assertFalse(tested.changeTaskStatus("myid", TaskStatus.RUNNING, "testmessage"));
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE);
// case - no any transition possible from final statuses
for (TaskStatus actualStatus : new TaskStatus[] { TaskStatus.CANCELED, TaskStatus.FINISHED_ERROR,
TaskStatus.FINISHED_OK }) {
for (TaskStatus newStatus : TaskStatus.values()) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, false);
}
}
// case - transitions from NEW
{
TaskStatus actualStatus = TaskStatus.NEW;
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.NEW, TaskStatus.FAILOVER, TaskStatus.FINISHED_ERROR,
TaskStatus.FINISHED_OK }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, false);
}
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.RUNNING, TaskStatus.CANCELED }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, true);
}
}
// case - transitions from RUNNING
{
TaskStatus actualStatus = TaskStatus.RUNNING;
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.NEW, TaskStatus.RUNNING }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, false);
}
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.CANCELED, TaskStatus.FAILOVER,
TaskStatus.FINISHED_ERROR, TaskStatus.FINISHED_OK }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, true);
}
}
// case - transitions from NEW
{
TaskStatus actualStatus = TaskStatus.FAILOVER;
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.NEW, TaskStatus.FAILOVER, TaskStatus.FINISHED_ERROR,
TaskStatus.FINISHED_OK }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, false);
}
for (TaskStatus newStatus : new TaskStatus[] { TaskStatus.RUNNING, TaskStatus.CANCELED }) {
changeTaskstatusTestCaseImpl(tested, actualStatus, newStatus, true);
}
}
}
private void changeTaskstatusTestCaseImpl(TaskPersisterJpa tested, TaskStatus actualStatus, TaskStatus newStatus,
boolean retExpected) {
Mockito.reset(tested.em);
final TaskStatusInfo ret = createTaskStatusInfoWithStatus(actualStatus);
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE)).thenReturn(ret);
Assert.assertEquals(retExpected, tested.changeTaskStatus("myid", newStatus, "testmessage"));
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE);
if (retExpected) {
Assert.assertEquals("testmessage", ret.getProcessingLog());
Assert.assertEquals(newStatus, ret.getTaskStatus());
if (actualStatus == TaskStatus.RUNNING) {
TestUtils.assertCurrentDate(ret.getLastRunFinishedAt());
}
} else {
Assert.assertNull(ret.getProcessingLog());
Assert.assertEquals(actualStatus, ret.getTaskStatus());
}
}
@Test
public void createTask() {
TaskPersisterJpa tested = getTested();
final String taskType = "tt";
final Map<String, Object> taskConfig = new HashMap<String, Object>();
Mockito.doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
TaskStatusInfo actual = (TaskStatusInfo) invocation.getArguments()[0];
Assert.assertNotNull(actual.getId());
TestUtils.assertCurrentDate(actual.getTaskCreatedAt());
Assert.assertEquals(TaskStatus.NEW, actual.getTaskStatus());
Assert.assertEquals(taskType, actual.getTaskType());
TestUtils.assertJsonContent(taskConfig, actual.getTaskConfig());
return null;
}
}).when(tested.em).persist(Mockito.any(TaskStatusInfo.class));
Assert.assertNotNull(tested.createTask(taskType, taskConfig));
Mockito.verify(tested.em).persist(Mockito.any(TaskStatusInfo.class));
}
@Test
public void markTaskToBeCancelled() {
TaskPersisterJpa tested = getTested();
markTaskToBeCancelledImpl(tested, null, false);
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.NEW);
markTaskToBeCancelledImpl(tested, tsi, true);
Assert.assertTrue(tsi.isCancelRequested());
}
// case - no duplicate set if set already
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.NEW);
tsi.setCancelRequested(true);
markTaskToBeCancelledImpl(tested, tsi, false);
Assert.assertTrue(tsi.isCancelRequested());
}
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.RUNNING);
markTaskToBeCancelledImpl(tested, tsi, true);
Assert.assertTrue(tsi.isCancelRequested());
}
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.FAILOVER);
markTaskToBeCancelledImpl(tested, tsi, true);
Assert.assertTrue(tsi.isCancelRequested());
}
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.CANCELED);
markTaskToBeCancelledImpl(tested, tsi, false);
Assert.assertFalse(tsi.isCancelRequested());
}
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.FINISHED_OK);
markTaskToBeCancelledImpl(tested, tsi, false);
Assert.assertFalse(tsi.isCancelRequested());
}
{
Mockito.reset(tested.em);
TaskStatusInfo tsi = createTaskStatusInfoWithStatus(TaskStatus.FINISHED_ERROR);
markTaskToBeCancelledImpl(tested, tsi, false);
Assert.assertFalse(tsi.isCancelRequested());
}
}
private void markTaskToBeCancelledImpl(TaskPersisterJpa tested, TaskStatusInfo tsi, boolean expectedReturn) {
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE)).thenReturn(tsi);
Assert.assertEquals(expectedReturn, tested.markTaskToBeCancelled("myid"));
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE);
}
private TaskStatusInfo createTaskStatusInfoWithStatus(TaskStatus taskStatus) {
TaskStatusInfo ret = new TaskStatusInfo();
ret.setId("myid");
ret.setTaskStatus(taskStatus);
return ret;
}
@Test
public void getTaskStatusInfo() {
TaskPersisterJpa tested = getTested();
{
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid")).thenReturn(null);
Assert.assertNull(tested.getTaskStatusInfo("myid"));
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid");
}
{
Mockito.reset(tested.em);
final TaskStatusInfo ret = createTaskStatusInfoWithStatus(TaskStatus.FAILOVER);
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid")).thenReturn(ret);
Assert.assertEquals(ret, tested.getTaskStatusInfo("myid"));
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid");
}
}
@Test
public void writeTaskLog() {
TaskPersisterJpa tested = getTested();
tested.writeTaskLog("myid", null);
Mockito.verifyZeroInteractions(tested.em);
tested.writeTaskLog("myid", " ");
Mockito.verifyZeroInteractions(tested.em);
// case - unknown task
Mockito.reset(tested.em);
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE)).thenReturn(null);
tested.writeTaskLog("myid", "testmessage");
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE);
// case - known task
{
Mockito.reset(tested.em);
final TaskStatusInfo ret = createTaskStatusInfoWithStatus(TaskStatus.FAILOVER);
Mockito.when(tested.em.find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE)).thenReturn(ret);
tested.writeTaskLog("myid", "testmessage");
Mockito.verify(tested.em).find(TaskStatusInfo.class, "myid", LockModeType.PESSIMISTIC_WRITE);
Assert.assertEquals("testmessage", ret.getProcessingLog());
}
}
private TaskPersisterJpa getTested() {
TaskPersisterJpa t = new TaskPersisterJpa();
t.em = Mockito.mock(EntityManager.class);
return t;
}
}