aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2016-09-19 14:08:45 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2016-09-19 14:59:56 +0200
commit5493e3f33006b780fbc55a64cb58727245ab953b (patch)
treed7920d2d9b560308234d32fab8e64c934b0f96c0
parent51bd1b800316ac624a5f8ea2c1e2512d2b65efe3 (diff)
downloadsonarqube-5493e3f33006b780fbc55a64cb58727245ab953b.tar.gz
sonarqube-5493e3f33006b780fbc55a64cb58727245ab953b.zip
SONAR-8093 PostProjectAnalysisTasksExecutor do not stop if task fails
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java12
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java25
2 files changed, 37 insertions, 0 deletions
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[][] {