diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java index fcde5233..790eb92e 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java @@ -153,7 +153,8 @@ public class TaskLifecycleListener implements ApplicationListener parameters); - /** - * Retrieves the next available execution id for a task execution. - * @return long containing the executionId. - */ - public long getNextExecutionId(); } diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDao.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDao.java index 1da03782..874b5a5b 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDao.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDao.java @@ -63,9 +63,8 @@ public class JdbcTaskExecutionDao implements TaskExecutionDao { public static final String TASK_NAME_WHERE_CLAUSE = "where TASK_NAME = ? "; private static final String SAVE_TASK_EXECUTION = "INSERT into %PREFIX%EXECUTION" - + "(TASK_EXECUTION_ID, START_TIME, END_TIME, " - + "TASK_NAME, EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED)" - + "values (?, ?, ?, ?, ?, ?, ?)"; + + "(TASK_EXECUTION_ID, START_TIME, TASK_NAME, LAST_UPDATED)" + + "values (?, ?, ?, ?)"; private static final String CREATE_TASK_PARAMETER = "INSERT into " + "%PREFIX%EXECUTION_PARAMS(TASK_EXECUTION_ID, TASK_PARAM ) values (?, ?)"; @@ -74,8 +73,7 @@ public class JdbcTaskExecutionDao implements TaskExecutionDao { + "%PREFIX%EXECUTION WHERE TASK_EXECUTION_ID = ?"; private static final String UPDATE_TASK_EXECUTION = "UPDATE %PREFIX%EXECUTION set " - + "START_TIME = ?, END_TIME = ?, TASK_NAME = ?, EXIT_CODE = ?, " - + "EXIT_MESSAGE = ?, LAST_UPDATED = ? " + + "END_TIME = ?, EXIT_CODE = ?, EXIT_MESSAGE = ?, LAST_UPDATED = ? " + "where TASK_EXECUTION_ID = ?"; private static final String GET_EXECUTION_BY_ID = "SELECT TASK_EXECUTION_ID, " + @@ -119,36 +117,38 @@ public class JdbcTaskExecutionDao implements TaskExecutionDao { } @Override - public void saveTaskExecution(TaskExecution taskExecution) { - Object[] parameters = new Object[]{ taskExecution.getExecutionId(), - taskExecution.getStartTime(), taskExecution.getEndTime(), - taskExecution.getTaskName(), taskExecution.getExitCode(), - taskExecution.getExitMessage(), new Date()}; + public TaskExecution createTaskExecution(String taskName, + Date startTime, List parameters) { + long taskExecutionId = getNextExecutionId(); + TaskExecution taskExecution = new TaskExecution(taskExecutionId, null, taskName, + startTime, null, null, parameters); + + Object[] queryParameters = new Object[]{ taskExecutionId, startTime, taskName, new Date()}; jdbcTemplate.update( getQuery(SAVE_TASK_EXECUTION), - parameters, - new int[]{ Types.BIGINT, Types.TIMESTAMP, Types.TIMESTAMP, - Types.VARCHAR, Types.INTEGER, Types.VARCHAR, Types.TIMESTAMP }); - insertTaskParameters(taskExecution.getExecutionId(), taskExecution.getParameters()); + queryParameters, + new int[]{ Types.BIGINT, Types.TIMESTAMP, Types.VARCHAR, Types.TIMESTAMP }); + insertTaskParameters(taskExecutionId, parameters); + return taskExecution; } @Override - public void updateTaskExecution(TaskExecution taskExecution) { + public void completeTaskExecution(long taskExecutionId, Integer exitCode, Date endTime, + String exitMessage) { // Check if given TaskExecution's Id already exists, if none is found // it is invalid and an exception should be thrown. if (jdbcTemplate.queryForObject(getQuery(CHECK_TASK_EXECUTION_EXISTS), Integer.class, - new Object[]{ taskExecution.getExecutionId() }) != 1) { - throw new IllegalStateException("Invalid TaskExecution, ID " + taskExecution.getExecutionId() + " not found."); + new Object[]{ taskExecutionId}) != 1) { + throw new IllegalStateException("Invalid TaskExecution, ID " + taskExecutionId + " not found."); } - Object[] parameters = new Object[]{ taskExecution.getStartTime(), taskExecution.getEndTime(), - taskExecution.getTaskName(), taskExecution.getExitCode(), - taskExecution.getExitMessage(), new Date(), taskExecution.getExecutionId()}; + Object[] parameters = new Object[]{ endTime, exitCode, exitMessage, new Date(), + taskExecutionId}; jdbcTemplate.update( getQuery(UPDATE_TASK_EXECUTION), parameters, - new int[]{ Types.TIMESTAMP, Types.TIMESTAMP, Types.VARCHAR, Types.INTEGER, - Types.VARCHAR, Types.TIMESTAMP, Types.BIGINT}); + new int[]{ Types.TIMESTAMP, Types.INTEGER, Types.VARCHAR, Types.TIMESTAMP, + Types.BIGINT}); } /** diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDao.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDao.java index ff4b13e6..5ce382b7 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDao.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDao.java @@ -19,6 +19,7 @@ package org.springframework.cloud.task.repository.dao; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -48,13 +49,21 @@ public class MapTaskExecutionDao implements TaskExecutionDao { } @Override - public void saveTaskExecution(TaskExecution taskExecution) { - taskExecutions.put(taskExecution.getExecutionId(), taskExecution); + public TaskExecution createTaskExecution(String taskName, + Date startTime, List parameters) { + long taskExecutionId = getNextExecutionId(); + TaskExecution taskExecution = new TaskExecution(taskExecutionId, null, taskName, + startTime, null, null, parameters); + taskExecutions.put(taskExecutionId, taskExecution); + return taskExecution; } @Override - public void updateTaskExecution(TaskExecution taskExecution) { - taskExecutions.put(taskExecution.getExecutionId(), taskExecution); + public void completeTaskExecution(long executionId, Integer exitCode, Date endTime, String exitMessage) { + TaskExecution taskExecution= taskExecutions.get(executionId); + taskExecution.setEndTime(endTime); + taskExecution.setExitCode(exitCode); + taskExecution.setExitMessage(exitMessage); } @Override diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/TaskExecutionDao.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/TaskExecutionDao.java index 80179ebf..7073e710 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/TaskExecutionDao.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/TaskExecutionDao.java @@ -16,6 +16,7 @@ package org.springframework.cloud.task.repository.dao; +import java.util.Date; import java.util.List; import org.springframework.cloud.task.repository.TaskExecution; @@ -32,16 +33,23 @@ public interface TaskExecutionDao { /** * Save a new {@link TaskExecution}. * - * @param taskExecution the taskExecution to be stored. + * @param taskName the name that associated with the task execution. + * @param startTime the time task began. + * @param parameters list of key/value pairs that configure the task. + * @return A fully qualified {@linkTaskExecution} instance. */ - void saveTaskExecution(TaskExecution taskExecution); + TaskExecution createTaskExecution( String taskName, + Date startTime, List parameters); /** * Update and existing {@link TaskExecution}. * - * @param taskExecution the taskExecution to be updated. + * @param executionId the id of the taskExecution to be updated. + * @param exitCode the status of the task upon completion. + * @param endTime the time the task completed. + * @param exitMessage the message assigned to the task upon completion. */ - void updateTaskExecution(TaskExecution taskExecution); + void completeTaskExecution(long executionId, Integer exitCode, Date endTime, String exitMessage); /** * Retrieves a task execution from the task repository. @@ -107,9 +115,4 @@ public interface TaskExecutionDao { public Page findAll(Pageable pageable); - /** - * Retrieves the next available execution id for a task execution. - * @return long containing the executionId. - */ - public long getNextExecutionId(); } diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/SimpleTaskRepository.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/SimpleTaskRepository.java index 8b27b3ca..d4a9a7b6 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/SimpleTaskRepository.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/SimpleTaskRepository.java @@ -16,6 +16,9 @@ package org.springframework.cloud.task.repository.support; +import java.util.Date; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,26 +52,32 @@ public class SimpleTaskRepository implements TaskRepository { } @Override - public void update(TaskExecution taskExecution) { + public TaskExecution completeTaskExecution(long executionId, Integer exitCode, Date endTime, + String exitMessage) { initialize(); - validateTaskExecution(taskExecution); - taskExecutionDao.updateTaskExecution(taskExecution); - logger.info("Updating: " + taskExecution.toString()); + validateExitInformation(executionId, exitCode, endTime); + exitMessage = trimExitMessage(exitMessage); + taskExecutionDao.completeTaskExecution(executionId, exitCode, endTime, exitMessage); + logger.debug("Updating: TaskExecution with executionId="+executionId + + " with the following {" + + "exitCode=" + exitCode + + ", endTime=" + endTime + + ", exitMessage='" + exitMessage + '\'' + + '}'); + + return taskExecutionDao.getTaskExecution(executionId); } @Override - public void createTaskExecution(TaskExecution taskExecution) { + public TaskExecution createTaskExecution(String taskName, + Date startTime,List parameters) { initialize(); - validateTaskExecution(taskExecution); - taskExecutionDao.saveTaskExecution(taskExecution); + validateCreateInformation(startTime, taskName); + TaskExecution taskExecution = + taskExecutionDao.createTaskExecution(taskName, startTime, parameters); logger.info("Creating: " + taskExecution.toString()); - } - - @Override - public long getNextExecutionId() { - initialize(); - return taskExecutionDao.getNextExecutionId(); + return taskExecution; } /** @@ -93,23 +102,30 @@ public class SimpleTaskRepository implements TaskRepository { } /** - * Validate TaskExecution. At a minimum a startTime. - * - * @param taskExecution the taskExecution to be evaluagted. + * Validate startTime and taskName are valid. */ - private void validateTaskExecution(TaskExecution taskExecution) { - Assert.notNull(taskExecution, "taskExecution should not be null"); - Assert.notNull(taskExecution.getStartTime(), "TaskExecution start time cannot be null."); + private void validateCreateInformation(Date startTime, String taskName) { + Assert.notNull(startTime, "TaskExecution start time cannot be null."); - if (taskExecution.getTaskName() != null && - taskExecution.getTaskName().length() > MAX_TASK_NAME_SIZE) { + if (taskName != null && + taskName.length() > MAX_TASK_NAME_SIZE) { throw new IllegalArgumentException("TaskName length exceeds " + MAX_TASK_NAME_SIZE + " characters"); } - //Trim the exit message - if(taskExecution.getExitMessage() != null && - taskExecution.getExitMessage().length() > MAX_EXIT_MESSAGE_SIZE){ - taskExecution.setExitMessage(taskExecution.getExitMessage().substring(0, MAX_EXIT_MESSAGE_SIZE - 1)); + } + + private void validateExitInformation(long executionId, Integer exitCode, Date endTime){ + Assert.notNull(exitCode, "exitCode should not be null"); + Assert.isTrue(exitCode >= 0, "exit code must be greater than or equal to zero"); + Assert.notNull(endTime, "TaskExecution endTime cannot be null."); + } + + private String trimExitMessage(String exitMessage){ + String result = exitMessage; + if(exitMessage != null && + exitMessage.length() > MAX_EXIT_MESSAGE_SIZE) { + result = exitMessage.substring(0, MAX_EXIT_MESSAGE_SIZE - 1); } + return result; } } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/listener/TaskLifecycleListenerTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/listener/TaskLifecycleListenerTests.java index 4f20f63e..4f64ea73 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/listener/TaskLifecycleListenerTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/listener/TaskLifecycleListenerTests.java @@ -73,14 +73,14 @@ public class TaskLifecycleListenerTests { @Test public void testTaskCreate() { context.refresh(); - verifyTaskExecution(0, false, null, null); + verifyTaskExecution(0, false, 0, null); } @Test public void testTaskCreateWithArgs() { context.register(ArgsConfiguration.class); context.refresh(); - verifyTaskExecution(2, false, null, null); + verifyTaskExecution(2, false, 0, null); } @Test @@ -130,7 +130,7 @@ public class TaskLifecycleListenerTests { } else { assertNull(taskExecution.getEndTime()); - assertNull(taskExecution.getExitCode()); + assertTrue(taskExecution.getExitCode() == 0); } assertEquals("testTask", taskExecution.getTaskName()); diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDaoTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDaoTests.java index 09901edf..7d7153c6 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDaoTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDaoTests.java @@ -58,7 +58,8 @@ public class JdbcTaskExecutionDaoTests { @DirtiesContext public void saveTaskExecution() { TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - dao.saveTaskExecution(expectedTaskExecution); + expectedTaskExecution = dao.createTaskExecution(expectedTaskExecution.getTaskName(), expectedTaskExecution.getStartTime(), + expectedTaskExecution.getParameters()); TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, TestDBUtils.getTaskExecutionFromDB(dataSource, expectedTaskExecution.getExecutionId())); @@ -66,20 +67,25 @@ public class JdbcTaskExecutionDaoTests { @Test @DirtiesContext - public void updateTaskExecution() { - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - dao.saveTaskExecution(expectedTaskExecution); - dao.updateTaskExecution(expectedTaskExecution); + public void completeTaskExecution() { + TaskExecution expectedTaskExecution = TestVerifierUtils.endSampleTaskExecutionNoParam(); + expectedTaskExecution = dao.createTaskExecution(expectedTaskExecution.getTaskName(), + expectedTaskExecution.getStartTime(), expectedTaskExecution.getParameters()); + dao.completeTaskExecution(expectedTaskExecution.getExecutionId(), + expectedTaskExecution.getExitCode(), expectedTaskExecution.getEndTime(), + expectedTaskExecution.getExitMessage()); TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, TestDBUtils.getTaskExecutionFromDB(dataSource, expectedTaskExecution.getExecutionId())); } @Test(expected = IllegalStateException.class) @DirtiesContext - public void updateTaskExecutionWithNoCreate() { + public void completeTaskExecutionWithNoCreate() { JdbcTaskExecutionDao dao = new JdbcTaskExecutionDao(dataSource); - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - dao.updateTaskExecution(expectedTaskExecution); + TaskExecution expectedTaskExecution = TestVerifierUtils.endSampleTaskExecutionNoParam(); + dao.completeTaskExecution(expectedTaskExecution.getExecutionId(), + expectedTaskExecution.getExitCode(), expectedTaskExecution.getEndTime(), + expectedTaskExecution.getExitMessage()); } } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDaoTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDaoTests.java index 5c5889aa..776f8fdb 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDaoTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/dao/MapTaskExecutionDaoTests.java @@ -35,7 +35,8 @@ public class MapTaskExecutionDaoTests { public void saveTaskExecution(){ MapTaskExecutionDao dao = new MapTaskExecutionDao(); TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - dao.saveTaskExecution(expectedTaskExecution); + expectedTaskExecution = dao.createTaskExecution(expectedTaskExecution.getTaskName(), + expectedTaskExecution.getStartTime(), expectedTaskExecution.getParameters()); Map taskExecutionMap = dao.getTaskExecutions(); assertNotNull("taskExecutionMap must not be null", taskExecutionMap); TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, @@ -43,11 +44,14 @@ public class MapTaskExecutionDaoTests { } @Test - public void updateTaskExecution(){ + public void completeTaskExecution(){ MapTaskExecutionDao dao = new MapTaskExecutionDao(); TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - dao.saveTaskExecution(expectedTaskExecution); - dao.updateTaskExecution(expectedTaskExecution); + expectedTaskExecution = dao.createTaskExecution(expectedTaskExecution.getTaskName(), + expectedTaskExecution.getStartTime(), expectedTaskExecution.getParameters()); + dao.completeTaskExecution(expectedTaskExecution.getExecutionId(), + expectedTaskExecution.getExitCode(), expectedTaskExecution.getEndTime(), + expectedTaskExecution.getExitMessage()); Map taskExecutionMap = dao.getTaskExecutions(); assertNotNull("taskExecutionMap must not be null", taskExecutionMap); TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskExplorerTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskExplorerTests.java index 364d5c37..727318d9 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskExplorerTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskExplorerTests.java @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import java.util.TreeSet; @@ -41,7 +42,6 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; @@ -164,8 +164,8 @@ public class SimpleTaskExplorerTests { } for (; i < (COMPLETE_COUNT + TEST_COUNT); i++) { - TaskExecution expectedTaskExecution = new TaskExecution(i, 0, TASK_NAME, new Date(), null, null, new ArrayList(0)); - this.taskRepository.createTaskExecution(expectedTaskExecution); + TaskExecution expectedTaskExecution = this.taskRepository.createTaskExecution( + TASK_NAME, new Date(), new ArrayList()); expectedResults.put(expectedTaskExecution.getExecutionId(), expectedTaskExecution); } Pageable pageable = new PageRequest(0, 10); @@ -190,6 +190,7 @@ public class SimpleTaskExplorerTests { final int TEST_COUNT = 5; final int COMPLETE_COUNT = 7; final String TASK_NAME = "FOOBAR"; + Random randomGenerator = new Random(); Map expectedResults = new HashMap<>(); //Store completed jobs @@ -198,9 +199,8 @@ public class SimpleTaskExplorerTests { } for (int i = 0; i < TEST_COUNT; i++) { - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - expectedTaskExecution.setTaskName(TASK_NAME); - this.taskRepository.createTaskExecution(expectedTaskExecution); + TaskExecution expectedTaskExecution = this.taskRepository.createTaskExecution( + TASK_NAME, new Date(), new ArrayList()); expectedResults.put(expectedTaskExecution.getExecutionId(), expectedTaskExecution); } @@ -307,7 +307,8 @@ public class SimpleTaskExplorerTests { private TaskExecution createAndSaveTaskExecution(int i) { TaskExecution taskExecution = TestVerifierUtils.createSampleTaskExecution(i); - this.taskRepository.createTaskExecution(taskExecution); + taskExecution = this.taskRepository.createTaskExecution(taskExecution.getTaskName(), + taskExecution.getStartTime(), taskExecution.getParameters()); return taskExecution; } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryJdbcTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryJdbcTests.java index 3da49518..2779ee43 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryJdbcTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryJdbcTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.task.repository.support; +import java.util.Date; +import java.util.UUID; + import javax.sql.DataSource; import org.junit.Test; @@ -74,30 +77,56 @@ public class SimpleTaskRepositoryJdbcTests { @Test @DirtiesContext - public void testUpdateTaskExecution() { + public void testCompleteTaskExecution() { TaskExecution expectedTaskExecution = TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); - expectedTaskExecution = TaskExecutionCreator.updateTaskExecution(taskRepository, - expectedTaskExecution.getExecutionId()); - TaskExecution actualTaskExecution = TestDBUtils.getTaskExecutionFromDB( - dataSource, expectedTaskExecution.getExecutionId()); + expectedTaskExecution.setEndTime(new Date()); + expectedTaskExecution.setExitCode(77); + expectedTaskExecution.setExitMessage(UUID.randomUUID().toString()); + + TaskExecution actualTaskExecution = TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, actualTaskExecution); } @Test @DirtiesContext public void testCreateTaskExecutionNoParamMaxExitMessageSize(){ - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); + TaskExecution expectedTaskExecution = TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); expectedTaskExecution.setExitMessage(new String(new char[SimpleTaskRepository.MAX_EXIT_MESSAGE_SIZE+1])); - taskRepository.createTaskExecution(expectedTaskExecution); + expectedTaskExecution.setEndTime(new Date()); + taskRepository.completeTaskExecution(expectedTaskExecution.getExecutionId(), + expectedTaskExecution.getExitCode(), new Date(), + expectedTaskExecution.getExitMessage()); } @Test(expected=IllegalArgumentException.class) @DirtiesContext public void testCreateTaskExecutionNoParamMaxTaskName(){ - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - expectedTaskExecution.setTaskName(new String(new char[SimpleTaskRepository.MAX_TASK_NAME_SIZE+1])); - taskRepository.createTaskExecution(expectedTaskExecution); + taskRepository.createTaskExecution( + new String(new char[SimpleTaskRepository.MAX_TASK_NAME_SIZE+1]), + new Date(), null); + } + + @Test(expected=IllegalArgumentException.class) + @DirtiesContext + public void testCreateTaskExecutionNegativeException(){ + TaskExecution expectedTaskExecution = + TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); + expectedTaskExecution.setEndTime(new Date()); + expectedTaskExecution.setExitCode(-1); + + TaskExecution actualTaskExecution = TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); + TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, actualTaskExecution); + } + + + @Test(expected=IllegalArgumentException.class) + @DirtiesContext + public void testCreateTaskExecutionNullEndTime(){ + TaskExecution expectedTaskExecution = + TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); + expectedTaskExecution.setExitCode(-1); + TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); } } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryLoggerTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryLoggerTests.java index 4697ebbe..1aef4f18 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryLoggerTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryLoggerTests.java @@ -16,6 +16,8 @@ package org.springframework.cloud.task.repository.support; +import java.util.Date; + import ch.qos.logback.core.Appender; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,14 +51,14 @@ public class SimpleTaskRepositoryLoggerTests { } @Test - public void testTaskUpdate() { + public void testTaskComplete() { final Appender mockAppender = TestVerifierUtils.getMockAppender(); TaskExecution expectedTaskExecution = TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); - TaskExecutionCreator.updateTaskExecution(taskRepository, - expectedTaskExecution.getExecutionId()); + expectedTaskExecution.setEndTime(new Date()); + TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); TestVerifierUtils.verifyLogEntryExists(mockAppender, - "Updating: TaskExecution{executionId=" + "Updating: TaskExecution with executionId=" + expectedTaskExecution.getExecutionId()); } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryMapTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryMapTests.java index 0e6d28b2..0eb6b0a4 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryMapTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/support/SimpleTaskRepositoryMapTests.java @@ -16,12 +16,12 @@ package org.springframework.cloud.task.repository.support; -import static org.springframework.test.util.AssertionErrors.assertTrue; - +import java.util.Date; import java.util.Map; import org.junit.Before; import org.junit.Test; + import org.springframework.cloud.task.repository.TaskExecution; import org.springframework.cloud.task.repository.TaskRepository; import org.springframework.cloud.task.repository.dao.MapTaskExecutionDao; @@ -31,6 +31,8 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; +import static org.springframework.test.util.AssertionErrors.assertTrue; + /** * Tests for the SimpleTaskRepository that uses Map as a datastore. * @author Glenn Renfro. @@ -64,14 +66,13 @@ public class SimpleTaskRepositoryMapTests { } @Test - public void testUpdateTaskExecution() { + public void testCompleteTaskExecution() { TaskExecution expectedTaskExecution = TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); - expectedTaskExecution = TaskExecutionCreator.updateTaskExecution(taskRepository, - expectedTaskExecution.getExecutionId()); - TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, - getSingleTaskExecutionFromMapRepository(taskRepository, - expectedTaskExecution.getExecutionId())); + expectedTaskExecution.setEndTime(new Date()); + + TaskExecution actualTaskExecution = TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); + TestVerifierUtils.verifyTaskExecution(expectedTaskExecution, actualTaskExecution); } private TaskExecution getSingleTaskExecutionFromMapRepository( @@ -83,6 +84,14 @@ public class SimpleTaskRepositoryMapTests { return taskMap.get(taskExecutionId); } + @Test(expected=IllegalArgumentException.class) + public void testCreateTaskExecutionNullEndTime(){ + TaskExecution expectedTaskExecution = + TaskExecutionCreator.createAndStoreTaskExecutionNoParams(taskRepository); + expectedTaskExecution.setExitCode(-1); + TaskExecutionCreator.completeExecution(taskRepository, expectedTaskExecution); + } + @Configuration public static class EmptyConfiguration{} } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TaskExecutionCreator.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TaskExecutionCreator.java index 3195c0e9..5b412e22 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TaskExecutionCreator.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TaskExecutionCreator.java @@ -38,7 +38,8 @@ public class TaskExecutionCreator { */ public static TaskExecution createAndStoreTaskExecutionNoParams(TaskRepository taskRepository) { TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(); - taskRepository.createTaskExecution(expectedTaskExecution); + expectedTaskExecution = taskRepository.createTaskExecution(expectedTaskExecution.getTaskName(), + expectedTaskExecution.getStartTime(), expectedTaskExecution.getParameters()); return expectedTaskExecution; } @@ -54,7 +55,8 @@ public class TaskExecutionCreator { params.add(UUID.randomUUID().toString()); params.add(UUID.randomUUID().toString()); expectedTaskExecution.setParameters(params); - taskRepository.createTaskExecution(expectedTaskExecution); + expectedTaskExecution = taskRepository.createTaskExecution(expectedTaskExecution.getTaskName(), + expectedTaskExecution.getStartTime(), expectedTaskExecution.getParameters()); return expectedTaskExecution; } @@ -64,10 +66,10 @@ public class TaskExecutionCreator { * @param taskRepository the taskRepository where the taskExecution should be updated. * @return the taskExecution created. */ - public static TaskExecution updateTaskExecution(TaskRepository taskRepository, - long taskExecutionId) { - TaskExecution expectedTaskExecution = TestVerifierUtils.createSampleTaskExecutionNoParam(taskExecutionId); - taskRepository.update(expectedTaskExecution); - return expectedTaskExecution; + public static TaskExecution completeExecution(TaskRepository taskRepository, + TaskExecution expectedTaskExecution) { + return taskRepository.completeTaskExecution(expectedTaskExecution.getExecutionId(), + expectedTaskExecution.getExitCode(), expectedTaskExecution.getEndTime(), + expectedTaskExecution.getExitMessage()); } } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TestVerifierUtils.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TestVerifierUtils.java index b6a4d48c..e75ff0c2 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TestVerifierUtils.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/util/TestVerifierUtils.java @@ -82,16 +82,14 @@ public class TestVerifierUtils { * * @return */ - public static TaskExecution createSampleTaskExecutionNoParam(long executionId) { + public static TaskExecution createSampleTaskExecutionNoParam() { Random randomGenerator = new Random(); - int exitCode = randomGenerator.nextInt(); Date startTime = new Date(); - Date endTime = new Date(); + long executionId = randomGenerator.nextLong(); String taskName = UUID.randomUUID().toString(); - String exitMessage = UUID.randomUUID().toString(); - return new TaskExecution(executionId, exitCode, taskName, - startTime, endTime, exitMessage, new ArrayList()); + return new TaskExecution(executionId, 0, taskName, + startTime, null, null, new ArrayList()); } /** @@ -99,7 +97,7 @@ public class TestVerifierUtils { * * @return */ - public static TaskExecution createSampleTaskExecutionNoParam() { + public static TaskExecution endSampleTaskExecutionNoParam() { Random randomGenerator = new Random(); int exitCode = randomGenerator.nextInt(); Date startTime = new Date(); @@ -119,38 +117,14 @@ public class TestVerifierUtils { */ public static TaskExecution createSampleTaskExecution(long executionId) { Random randomGenerator = new Random(); - int exitCode = randomGenerator.nextInt(); Date startTime = new Date(); - Date endTime = new Date(); String taskName = UUID.randomUUID().toString(); - String exitMessage = UUID.randomUUID().toString(); List params = new ArrayList<>(PARAM_SIZE); for (int i = 0 ; i < PARAM_SIZE ; i++){ params.add(UUID.randomUUID().toString()); } - return new TaskExecution(executionId, exitCode, taskName, - startTime, endTime, exitMessage, params); - } - - /** - * Creates a fully populated TaskExecution for testing. - * - * @return - */ - public static TaskExecution createSampleTaskExecution() { - Random randomGenerator = new Random(); - int exitCode = randomGenerator.nextInt(); - long executionId = randomGenerator.nextLong(); - Date startTime = new Date(); - Date endTime = new Date(); - String taskName = UUID.randomUUID().toString(); - String exitMessage = UUID.randomUUID().toString(); - List params = new ArrayList<>(PARAM_SIZE); - for (int i = 0 ; i < PARAM_SIZE ; i++){ - params.add(UUID.randomUUID().toString()); - } - return new TaskExecution(executionId, exitCode, taskName, - startTime, endTime, exitMessage, params); + return new TaskExecution(executionId, null, taskName, + startTime, null, null, params); } /** diff --git a/spring-cloud-task-samples/timestamp/src/test/java/org/springframework/cloud/task/timestamp/TaskApplicationTests.java b/spring-cloud-task-samples/timestamp/src/test/java/org/springframework/cloud/task/timestamp/TaskApplicationTests.java index 00d1fac8..831f1307 100644 --- a/spring-cloud-task-samples/timestamp/src/test/java/org/springframework/cloud/task/timestamp/TaskApplicationTests.java +++ b/spring-cloud-task-samples/timestamp/src/test/java/org/springframework/cloud/task/timestamp/TaskApplicationTests.java @@ -16,8 +16,8 @@ package org.springframework.cloud.task.timestamp; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -41,7 +41,7 @@ public class TaskApplicationTests { public void testTimeStampApp() throws Exception { final String TEST_DATE_DOTS = "......."; final String CREATE_TASK_MESSAGE = "Creating: TaskExecution{executionId="; - final String UPDATE_TASK_MESSAGE = "Updating: TaskExecution{executionId="; + final String UPDATE_TASK_MESSAGE = "Updating: TaskExecution with executionId="; String[] args = { "--format=yyyy" + TEST_DATE_DOTS }; assertEquals(0, SpringApplication.exit(SpringApplication @@ -62,7 +62,7 @@ public class TaskApplicationTests { while (matcher.find()) { count++; } - assertEquals("The number of task titles did not match expected: ", 2, count); + assertEquals("The number of task titles did not match expected: ", 3, count); } } diff --git a/spring-cloud-task-samples/timestamp/src/test/resources/application.properties b/spring-cloud-task-samples/timestamp/src/test/resources/application.properties new file mode 100644 index 00000000..0103b71b --- /dev/null +++ b/spring-cloud-task-samples/timestamp/src/test/resources/application.properties @@ -0,0 +1,18 @@ +# +# Copyright 2016 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +logging.level.root=DEBUG +spring.application.name=Demo Timestamp Task