From 5493e3f33006b780fbc55a64cb58727245ab953b Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Mon, 19 Sep 2016 14:08:45 +0200 Subject: [PATCH] SONAR-8093 PostProjectAnalysisTasksExecutor do not stop if task fails --- .../PostProjectAnalysisTasksExecutor.java | 12 +++++++++ .../PostProjectAnalysisTasksExecutorTest.java | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java index 1fed2f087ce..9b27f00b00d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java @@ -32,6 +32,8 @@ import org.sonar.api.ce.posttask.Project; import org.sonar.api.ce.posttask.QualityGate; import org.sonar.api.ce.posttask.ScannerContext; import org.sonar.api.utils.System2; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReader; import org.sonar.server.computation.task.projectanalysis.qualitygate.Condition; @@ -53,6 +55,8 @@ import static org.sonar.api.ce.posttask.CeTask.Status.SUCCESS; public class PostProjectAnalysisTasksExecutor implements ComputationStepExecutor.Listener { private static final PostProjectAnalysisTask[] NO_POST_PROJECT_ANALYSIS_TASKS = new PostProjectAnalysisTask[0]; + private static final Logger LOG = Loggers.get(PostProjectAnalysisTasksExecutor.class); + private final org.sonar.ce.queue.CeTask ceTask; private final AnalysisMetadataHolder analysisMetadataHolder; private final QualityGateHolder qualityGateHolder; @@ -93,7 +97,15 @@ public class PostProjectAnalysisTasksExecutor implements ComputationStepExecutor ProjectAnalysis projectAnalysis = createProjectAnalysis(allStepsExecuted ? SUCCESS : FAILED); for (PostProjectAnalysisTask postProjectAnalysisTask : postProjectAnalysisTasks) { + executeTask(projectAnalysis, postProjectAnalysisTask); + } + } + + private static void executeTask(ProjectAnalysis projectAnalysis, PostProjectAnalysisTask postProjectAnalysisTask) { + try { postProjectAnalysisTask.finished(projectAnalysis); + } catch (Exception e) { + LOG.error("Execution of task " + postProjectAnalysisTask.getClass() + " failed", e); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java index 46134497eda..304b624d925 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java @@ -50,6 +50,8 @@ import static com.google.common.collect.ImmutableList.of; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.MapEntry.entry; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -234,6 +236,29 @@ public class PostProjectAnalysisTasksExecutorTest { assertThat(scannerContext.getProperties()).containsExactly(entry("foo", "bar")); } + @Test + @UseDataProvider("booleanValues") + public void finished_does_not_fail_if_listener_throws_exception_and_execute_subsequent_listeners(boolean allStepsExecuted) { + PostProjectAnalysisTask postProjectAnalysisTask1 = mock(PostProjectAnalysisTask.class); + PostProjectAnalysisTask postProjectAnalysisTask2 = mock(PostProjectAnalysisTask.class); + PostProjectAnalysisTask postProjectAnalysisTask3 = mock(PostProjectAnalysisTask.class); + InOrder inOrder = inOrder(postProjectAnalysisTask1, postProjectAnalysisTask2, postProjectAnalysisTask3); + + doThrow(new RuntimeException("Faking a listener throws an exception")) + .when(postProjectAnalysisTask2) + .finished(any(PostProjectAnalysisTask.ProjectAnalysis.class)); + + new PostProjectAnalysisTasksExecutor( + ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader, + system2, new PostProjectAnalysisTask[] {postProjectAnalysisTask1, postProjectAnalysisTask2, postProjectAnalysisTask3}) + .finished(allStepsExecuted); + + inOrder.verify(postProjectAnalysisTask1).finished(projectAnalysisArgumentCaptor.capture()); + inOrder.verify(postProjectAnalysisTask2).finished(projectAnalysisArgumentCaptor.capture()); + inOrder.verify(postProjectAnalysisTask3).finished(projectAnalysisArgumentCaptor.capture()); + inOrder.verifyNoMoreInteractions(); + } + @DataProvider public static Object[][] booleanValues() { return new Object[][] { -- 2.39.5