SCT-139 Exception info and error codes will be recorded for the task

resolves spring-cloud/spring-cloud-task#139
This commit is contained in:
Glenn Renfro
2016-05-10 10:08:49 -04:00
committed by Michael Minella
parent ef1c027146
commit df14546a7f
6 changed files with 125 additions and 4 deletions

View File

@@ -460,7 +460,7 @@ public class DeployerPartitionHandlerTests {
validateStepExecutionResults(results);
assertTrue("Time difference was too small: " + (endTime.getTime() - startTime.getTime()),
endTime.getTime() - startTime.getTime() >= 20000);
endTime.getTime() - startTime.getTime() >= 19999);
}
@Test(expected = TimeoutException.class)

View File

@@ -118,6 +118,7 @@ public class TaskLifecycleListener implements ApplicationListener<ApplicationEve
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if(applicationEvent instanceof ApplicationFailedEvent) {
this.applicationFailedEvent = (ApplicationFailedEvent) applicationEvent;
doTaskEnd();
}
else if(applicationEvent instanceof ExitCodeEvent){
this.exitCodeEvent = (ExitCodeEvent) applicationEvent;

View File

@@ -0,0 +1,119 @@
package org.springframework.cloud.task;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.test.OutputCapture;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.junit.Assert.assertTrue;
/**
* Verifies core behavior for Tasks.
*
* @author Glenn Renfro
*/
public class TaskCoreTests {
private static final String TASK_NAME = "taskEventTest";
private static final String EXCEPTION_MESSAGE = "FOO EXCEPTION";
private static final String CREATE_TASK_MESSAGE = "Creating: TaskExecution{executionId=";
private static final String UPDATE_TASK_MESSAGE = "Updating: TaskExecution with executionId=";
private static final String SUCCESS_EXIT_CODE_MESSAGE = "with the following {exitCode=0";
private static final String EXCEPTION_EXIT_CODE_MESSAGE = "with the following {exitCode=1";
private static final String EXIT_MESSAGE =
"exitMessage='java.lang.IllegalStateException: Failed to execute CommandLineRunner";
private ConfigurableApplicationContext applicationContext;
@Rule
public OutputCapture outputCapture = new OutputCapture();
@After
public void teardown() {
if (applicationContext != null && applicationContext.isActive()) {
applicationContext.close();
}
}
@Test
public void successfulTaskTest() {
applicationContext = new SpringApplicationBuilder().sources(new Object[]{TaskConfiguration.class,
PropertyPlaceholderAutoConfiguration.class}).build().run(new String[]{
"--spring.cloud.task.closecontext.enable=false",
"--spring.cloud.task.name=" + TASK_NAME,
"--spring.main.web-environment=false"});
String output = this.outputCapture.toString();
assertTrue("Test results do not show create task message: " + output,
output.contains(CREATE_TASK_MESSAGE));
assertTrue("Test results do not show success message: " + output,
output.contains(UPDATE_TASK_MESSAGE));
assertTrue("Test results have incorrect exit code: " + output,
output.contains(SUCCESS_EXIT_CODE_MESSAGE));
}
@Test
public void exceptionTaskTest() {
boolean exceptionFired = false;
try {
applicationContext = new SpringApplicationBuilder().sources(new Object[]{TaskExceptionConfiguration.class,
PropertyPlaceholderAutoConfiguration.class}).build().run(new String[]{
"--spring.cloud.task.closecontext.enable=false",
"--spring.cloud.task.name=" + TASK_NAME,
"--spring.main.web-environment=false"});
}
catch (IllegalStateException exception) {
exceptionFired = true;
}
assertTrue("An IllegalStateException should have been thrown", exceptionFired);
String output = this.outputCapture.toString();
assertTrue("Test results do not show create task message: " + output,
output.contains(CREATE_TASK_MESSAGE));
assertTrue("Test results do not show success message: " + output,
output.contains(UPDATE_TASK_MESSAGE));
assertTrue("Test results have incorrect exit code: " + output,
output.contains(EXCEPTION_EXIT_CODE_MESSAGE));
assertTrue("Test results have incorrect exit message: " + output,
output.contains(EXIT_MESSAGE));
assertTrue("Test results have exception message: " + output,
output.contains(EXCEPTION_MESSAGE));
}
@Configuration
@EnableTask
public static class TaskConfiguration {
@Bean
public CommandLineRunner commandLineRunner() {
return new CommandLineRunner() {
@Override
public void run(String... strings) throws Exception {
}
};
}
}
@Configuration
@EnableTask
public static class TaskExceptionConfiguration {
@Bean
public CommandLineRunner commandLineRunner() {
return new CommandLineRunner() {
@Override
public void run(String... strings) throws Exception {
throw new IllegalStateException(EXCEPTION_MESSAGE);
}
};
}
}
}

View File

@@ -100,9 +100,9 @@ public class TaskExecutionListenerTests {
RuntimeException exception = new RuntimeException(EXCEPTION_MESSAGE);
setupContextForTaskExecutionListener();
SpringApplication application = new SpringApplication();
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
DefaultTaskListenerConfiguration.TestTaskExecutionListener taskExecutionListener =
context.getBean(DefaultTaskListenerConfiguration.TestTaskExecutionListener.class);
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
context.publishEvent(new ApplicationReadyEvent(application, new String[0], context));
TaskExecution taskExecution = new TaskExecution(0, 1, "wombat", new Date(),
@@ -149,9 +149,9 @@ public class TaskExecutionListenerTests {
RuntimeException exception = new RuntimeException(EXCEPTION_MESSAGE);
setupContextForAnnotatedListener();
SpringApplication application = new SpringApplication();
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
DefaultAnnotationConfiguration.AnnotatedTaskListener annotatedListener =
context.getBean(DefaultAnnotationConfiguration.AnnotatedTaskListener.class);
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
context.publishEvent(new ApplicationReadyEvent(application, new String[0], context));
TaskExecution taskExecution = new TaskExecution(0, 1, "wombat", new Date(),

View File

@@ -104,8 +104,8 @@ public class TaskLifecycleListenerTests {
context.refresh();
RuntimeException exception = new RuntimeException("This was expected");
SpringApplication application = new SpringApplication();
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
this.taskExplorer = context.getBean(TaskExplorer.class);
context.publishEvent(new ApplicationFailedEvent(application, new String[0], context, exception));
context.publishEvent(new ApplicationReadyEvent(application, new String[0], context));
verifyTaskExecution(0, true, 1, exception);

View File

@@ -0,0 +1 @@
logging.level.org.springframework.cloud.task=debug