From f9d73d68926658ba810e13f8ad6e83ff1469fd8b Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Fri, 24 Aug 2018 17:57:54 +0200 Subject: [PATCH] SONAR-8368 do not track closed issues on first analysis --- .../issue/TrackerExecution.java | 7 ++++-- .../issue/IntegrateIssuesVisitorTest.java | 2 +- .../issue/TrackerExecutionTest.java | 25 ++++++++++++++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecution.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecution.java index 29ab66bc3aa..097fa8dbe4f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecution.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecution.java @@ -21,6 +21,7 @@ package org.sonar.ce.task.projectanalysis.issue; import java.util.Set; import org.sonar.api.issue.Issue; +import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.tracking.Input; @@ -36,22 +37,24 @@ public class TrackerExecution { private final ClosedIssuesInputFactory closedIssuesInputFactory; private final Tracker tracker; private final ComponentIssuesLoader componentIssuesLoader; + private final AnalysisMetadataHolder analysisMetadataHolder; public TrackerExecution(TrackerBaseInputFactory baseInputFactory, TrackerRawInputFactory rawInputFactory, ClosedIssuesInputFactory closedIssuesInputFactory, Tracker tracker, - ComponentIssuesLoader componentIssuesLoader) { + ComponentIssuesLoader componentIssuesLoader, AnalysisMetadataHolder analysisMetadataHolder) { this.baseInputFactory = baseInputFactory; this.rawInputFactory = rawInputFactory; this.closedIssuesInputFactory = closedIssuesInputFactory; this.tracker = tracker; this.componentIssuesLoader = componentIssuesLoader; + this.analysisMetadataHolder = analysisMetadataHolder; } public Tracking track(Component component) { Input rawInput = rawInputFactory.create(component); Input openBaseIssuesInput = baseInputFactory.create(component); NonClosedTracking openIssueTracking = tracker.trackNonClosed(rawInput, openBaseIssuesInput); - if (openIssueTracking.isComplete()) { + if (openIssueTracking.isComplete() || analysisMetadataHolder.isFirstAnalysis()) { return openIssueTracking; } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java index c16fa35f2d1..9e7bbbe8697 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java @@ -143,7 +143,7 @@ public class IntegrateIssuesVisitorTest { TrackerBaseInputFactory baseInputFactory = new TrackerBaseInputFactory(issuesLoader, dbClient, movedFilesRepository); TrackerMergeBranchInputFactory mergeInputFactory = new TrackerMergeBranchInputFactory(issuesLoader, mergeBranchComponentsUuids, dbClient); ClosedIssuesInputFactory closedIssuesInputFactory = new ClosedIssuesInputFactory(issuesLoader, dbClient, movedFilesRepository); - tracker = new TrackerExecution(baseInputFactory, rawInputFactory, closedIssuesInputFactory, new Tracker<>(), issuesLoader); + tracker = new TrackerExecution(baseInputFactory, rawInputFactory, closedIssuesInputFactory, new Tracker<>(), issuesLoader, analysisMetadataHolder); shortBranchTracker = new ShortBranchTrackerExecution(baseInputFactory, rawInputFactory, mergeInputFactory, new Tracker<>()); mergeBranchTracker = new MergeBranchTrackerExecution(rawInputFactory, mergeInputFactory, new Tracker<>()); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecutionTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecutionTest.java index d7551a1b5b0..8f1f49dcda1 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecutionTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerExecutionTest.java @@ -26,6 +26,7 @@ import java.util.Set; import java.util.stream.IntStream; import org.junit.Test; import org.sonar.api.issue.Issue; +import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.ReportComponent; import org.sonar.core.issue.DefaultIssue; @@ -49,8 +50,9 @@ public class TrackerExecutionTest { private final ClosedIssuesInputFactory closedIssuesInputFactory = mock(ClosedIssuesInputFactory.class); private final Tracker tracker = mock(Tracker.class); private final ComponentIssuesLoader componentIssuesLoader = mock(ComponentIssuesLoader.class); + private final AnalysisMetadataHolder analysisMetadataHolder = mock(AnalysisMetadataHolder.class); - private TrackerExecution underTest = new TrackerExecution(baseInputFactory, rawInputFactory, closedIssuesInputFactory, tracker, componentIssuesLoader); + private TrackerExecution underTest = new TrackerExecution(baseInputFactory, rawInputFactory, closedIssuesInputFactory, tracker, componentIssuesLoader, analysisMetadataHolder); private Input rawInput = mock(Input.class); private Input openIssuesInput = mock(Input.class); @@ -65,6 +67,25 @@ public class TrackerExecutionTest { when(baseInputFactory.create(component)).thenReturn(openIssuesInput); when(closedIssuesInputFactory.create(any())).thenThrow(new IllegalStateException("closedIssuesInputFactory should not be called")); when(nonClosedTracking.isComplete()).thenReturn(true); + when(analysisMetadataHolder.isFirstAnalysis()).thenReturn(false); + when(tracker.trackNonClosed(rawInput, openIssuesInput)).thenReturn(nonClosedTracking); + when(tracker.trackClosed(any(), any())).thenThrow(new IllegalStateException("trackClosed should not be called")); + + Tracking tracking = underTest.track(component); + + assertThat(tracking).isSameAs(nonClosedTracking); + verify(tracker).trackNonClosed(rawInput, openIssuesInput); + verifyNoMoreInteractions(tracker); + } + + @Test + public void track_does_not_track_nonClosed_issues_if_tracking_returns_incomplete_but_this_is_first_analysis() { + ReportComponent component = ReportComponent.builder(Component.Type.FILE, 1).build(); + when(rawInputFactory.create(component)).thenReturn(rawInput); + when(baseInputFactory.create(component)).thenReturn(openIssuesInput); + when(closedIssuesInputFactory.create(any())).thenThrow(new IllegalStateException("closedIssuesInputFactory should not be called")); + when(nonClosedTracking.isComplete()).thenReturn(false); + when(analysisMetadataHolder.isFirstAnalysis()).thenReturn(true); when(tracker.trackNonClosed(rawInput, openIssuesInput)).thenReturn(nonClosedTracking); when(tracker.trackClosed(any(), any())).thenThrow(new IllegalStateException("trackClosed should not be called")); @@ -82,6 +103,7 @@ public class TrackerExecutionTest { when(baseInputFactory.create(component)).thenReturn(openIssuesInput); when(closedIssuesInputFactory.create(component)).thenReturn(closedIssuesInput); when(nonClosedTracking.isComplete()).thenReturn(false); + when(analysisMetadataHolder.isFirstAnalysis()).thenReturn(false); when(tracker.trackNonClosed(rawInput, openIssuesInput)).thenReturn(nonClosedTracking); when(tracker.trackClosed(nonClosedTracking, closedIssuesInput)).thenReturn(closedTracking); @@ -100,6 +122,7 @@ public class TrackerExecutionTest { when(baseInputFactory.create(component)).thenReturn(openIssuesInput); when(closedIssuesInputFactory.create(component)).thenReturn(closedIssuesInput); when(nonClosedTracking.isComplete()).thenReturn(false); + when(analysisMetadataHolder.isFirstAnalysis()).thenReturn(false); when(tracker.trackNonClosed(rawInput, openIssuesInput)).thenReturn(nonClosedTracking); when(tracker.trackClosed(nonClosedTracking, closedIssuesInput)).thenReturn(closedTracking); Set mappedClosedIssues = IntStream.range(1, 2 + new Random().nextInt(2)) -- 2.39.5