diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-05-10 11:15:16 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-05-11 12:26:46 +0200 |
commit | 4e19fe7ccd4c5ff5ca29fb0bdb831ed03942f441 (patch) | |
tree | 7d381f8050c7b12541afecb5c7521e875c8fd92f /server/sonar-server | |
parent | 0e6cefb238f064259b13db23a50b0cfa66aa7790 (diff) | |
download | sonarqube-4e19fe7ccd4c5ff5ca29fb0bdb831ed03942f441.tar.gz sonarqube-4e19fe7ccd4c5ff5ca29fb0bdb831ed03942f441.zip |
SONAR-7555 Add measures on number of won't fix issues
Diffstat (limited to 'server/sonar-server')
2 files changed, 52 insertions, 9 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueCounter.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueCounter.java index 779dce7fcd2..fa95b9efc83 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueCounter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueCounter.java @@ -26,7 +26,6 @@ import com.google.common.collect.Multiset; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; -import org.sonar.api.issue.Issue; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.rules.RuleType; import org.sonar.core.issue.DefaultIssue; @@ -39,6 +38,8 @@ import org.sonar.server.computation.metric.MetricRepository; import org.sonar.server.computation.period.Period; import org.sonar.server.computation.period.PeriodsHolder; +import static org.sonar.api.issue.Issue.RESOLUTION_FALSE_POSITIVE; +import static org.sonar.api.issue.Issue.RESOLUTION_WONT_FIX; import static org.sonar.api.issue.Issue.STATUS_CONFIRMED; import static org.sonar.api.issue.Issue.STATUS_OPEN; import static org.sonar.api.issue.Issue.STATUS_REOPENED; @@ -58,6 +59,7 @@ import static org.sonar.api.measures.CoreMetrics.NEW_VIOLATIONS_KEY; import static org.sonar.api.measures.CoreMetrics.OPEN_ISSUES_KEY; import static org.sonar.api.measures.CoreMetrics.REOPENED_ISSUES_KEY; import static org.sonar.api.measures.CoreMetrics.VIOLATIONS_KEY; +import static org.sonar.api.measures.CoreMetrics.WONT_FIX_ISSUES_KEY; import static org.sonar.api.rule.Severity.BLOCKER; import static org.sonar.api.rule.Severity.CRITICAL; import static org.sonar.api.rule.Severity.INFO; @@ -67,10 +69,8 @@ import static org.sonar.api.rule.Severity.MINOR; /** * For each component, computes the measures related to number of issues: * <ul> - * <li>unresolved issues</li> - * <li>false-positives</li> - * <li>open issues</li> * <li>issues per status (open, reopen, confirmed)</li> + * <li>issues per resolution (unresolved, false-positives, won't fix)</li> * <li>issues per severity (from info to blocker)</li> * <li>issues per type (code smell, bug, vulnerability)</li> * </ul> @@ -167,6 +167,7 @@ public class IssueCounter extends IssueVisitor { addMeasure(component, REOPENED_ISSUES_KEY, currentCounters.counter().reopened); addMeasure(component, CONFIRMED_ISSUES_KEY, currentCounters.counter().confirmed); addMeasure(component, FALSE_POSITIVE_ISSUES_KEY, currentCounters.counter().falsePositives); + addMeasure(component, WONT_FIX_ISSUES_KEY, currentCounters.counter().wontFix); } private void addMeasuresByType(Component component) { @@ -231,6 +232,7 @@ public class IssueCounter extends IssueVisitor { private int reopened = 0; private int confirmed = 0; private int falsePositives = 0; + private int wontFix = 0; private final Multiset<String> severityBag = HashMultiset.create(); private final EnumMultiset<RuleType> typeBag = EnumMultiset.create(RuleType.class); @@ -240,6 +242,7 @@ public class IssueCounter extends IssueVisitor { reopened += counter.reopened; confirmed += counter.confirmed; falsePositives += counter.falsePositives; + wontFix += counter.wontFix; severityBag.addAll(counter.severityBag); typeBag.addAll(counter.typeBag); } @@ -249,8 +252,10 @@ public class IssueCounter extends IssueVisitor { unresolved++; typeBag.add(issue.type()); severityBag.add(issue.severity()); - } else if (Issue.RESOLUTION_FALSE_POSITIVE.equals(issue.resolution())) { + } else if (RESOLUTION_FALSE_POSITIVE.equals(issue.resolution())) { falsePositives++; + } else if (RESOLUTION_WONT_FIX.equals(issue.resolution())) { + wontFix++; } switch (issue.status()) { case STATUS_OPEN: diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueCounterTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueCounterTest.java index a55dafba40a..c23c67a60ee 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueCounterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueCounterTest.java @@ -43,6 +43,7 @@ import org.sonar.server.computation.period.PeriodsHolderRule; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.api.issue.Issue.RESOLUTION_FALSE_POSITIVE; import static org.sonar.api.issue.Issue.RESOLUTION_FIXED; +import static org.sonar.api.issue.Issue.RESOLUTION_WONT_FIX; import static org.sonar.api.issue.Issue.STATUS_CLOSED; import static org.sonar.api.issue.Issue.STATUS_CONFIRMED; import static org.sonar.api.issue.Issue.STATUS_OPEN; @@ -63,6 +64,7 @@ import static org.sonar.api.measures.CoreMetrics.NEW_VIOLATIONS_KEY; import static org.sonar.api.measures.CoreMetrics.OPEN_ISSUES_KEY; import static org.sonar.api.measures.CoreMetrics.REOPENED_ISSUES_KEY; import static org.sonar.api.measures.CoreMetrics.VIOLATIONS_KEY; +import static org.sonar.api.measures.CoreMetrics.WONT_FIX_ISSUES_KEY; import static org.sonar.api.rule.Severity.BLOCKER; import static org.sonar.api.rule.Severity.CRITICAL; import static org.sonar.api.rule.Severity.MAJOR; @@ -92,6 +94,7 @@ public class IssueCounterTest { static final Metric NEW_MINOR_ISSUES_METRIC = new MetricImpl(14, NEW_MINOR_VIOLATIONS_KEY, NEW_MINOR_VIOLATIONS_KEY, INT); static final Metric NEW_INFO_ISSUES_METRIC = new MetricImpl(15, NEW_INFO_VIOLATIONS_KEY, NEW_INFO_VIOLATIONS_KEY, INT); static final Metric FALSE_POSITIVE_ISSUES_METRIC = new MetricImpl(16, FALSE_POSITIVE_ISSUES_KEY, FALSE_POSITIVE_ISSUES_KEY, INT); + static final Metric WONT_FIX_ISSUES_METRIC = new MetricImpl(23, WONT_FIX_ISSUES_KEY, WONT_FIX_ISSUES_KEY, INT); static final Metric CODE_SMELLS_METRIC = new MetricImpl(17, CoreMetrics.CODE_SMELLS_KEY, CoreMetrics.CODE_SMELLS_KEY, INT); static final Metric BUGS_METRIC = new MetricImpl(18, CoreMetrics.BUGS_KEY, CoreMetrics.BUGS_KEY, INT); static final Metric VULNERABILITIES_METRIC = new MetricImpl(19, CoreMetrics.VULNERABILITIES_KEY, CoreMetrics.VULNERABILITIES_KEY, INT); @@ -126,6 +129,7 @@ public class IssueCounterTest { .add(NEW_MINOR_ISSUES_METRIC) .add(NEW_INFO_ISSUES_METRIC) .add(FALSE_POSITIVE_ISSUES_METRIC) + .add(WONT_FIX_ISSUES_METRIC) .add(CODE_SMELLS_METRIC) .add(BUGS_METRIC) .add(VULNERABILITIES_METRIC) @@ -165,26 +169,60 @@ public class IssueCounterTest { underTest.beforeComponent(PROJECT); underTest.afterComponent(PROJECT); - // count by status assertThat(measureRepository.getRawMeasure(FILE1, ISSUES_METRIC).get().getIntValue()).isEqualTo(1); assertThat(measureRepository.getRawMeasure(FILE1, OPEN_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); - assertThat(measureRepository.getRawMeasure(FILE1, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); assertThat(measureRepository.getRawMeasure(FILE1, CONFIRMED_ISSUES_METRIC).get().getIntValue()).isEqualTo(0); assertThat(measureRepository.getRawMeasure(FILE2, ISSUES_METRIC).get().getIntValue()).isEqualTo(2); assertThat(measureRepository.getRawMeasure(FILE2, OPEN_ISSUES_METRIC).get().getIntValue()).isEqualTo(0); - assertThat(measureRepository.getRawMeasure(FILE2, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(0); assertThat(measureRepository.getRawMeasure(FILE2, CONFIRMED_ISSUES_METRIC).get().getIntValue()).isEqualTo(2); assertThat(measureRepository.getRawMeasure(FILE3, ISSUES_METRIC).get().getIntValue()).isEqualTo(0); assertThat(measureRepository.getRawMeasure(PROJECT, ISSUES_METRIC).get().getIntValue()).isEqualTo(3); assertThat(measureRepository.getRawMeasure(PROJECT, OPEN_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); - assertThat(measureRepository.getRawMeasure(PROJECT, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); assertThat(measureRepository.getRawMeasure(PROJECT, CONFIRMED_ISSUES_METRIC).get().getIntValue()).isEqualTo(2); } @Test + public void count_issues_by_resolution() { + periodsHolder.setPeriods(); + + // bottom-up traversal -> from files to project + underTest.beforeComponent(FILE1); + underTest.onIssue(FILE1, createIssue(null, STATUS_OPEN, BLOCKER)); + underTest.onIssue(FILE1, createIssue(RESOLUTION_FIXED, STATUS_CLOSED, MAJOR)); + underTest.onIssue(FILE1, createIssue(RESOLUTION_FALSE_POSITIVE, STATUS_RESOLVED, MAJOR)); + underTest.onIssue(FILE1, createIssue(RESOLUTION_WONT_FIX, STATUS_CLOSED, MAJOR)); + underTest.afterComponent(FILE1); + + underTest.beforeComponent(FILE2); + underTest.onIssue(FILE2, createIssue(null, STATUS_CONFIRMED, BLOCKER)); + underTest.onIssue(FILE2, createIssue(null, STATUS_CONFIRMED, MAJOR)); + underTest.onIssue(FILE2, createIssue(RESOLUTION_WONT_FIX, STATUS_CLOSED, MAJOR)); + underTest.afterComponent(FILE2); + + underTest.beforeComponent(FILE3); + underTest.afterComponent(FILE3); + + underTest.beforeComponent(PROJECT); + underTest.afterComponent(PROJECT); + + assertThat(measureRepository.getRawMeasure(FILE1, ISSUES_METRIC).get().getIntValue()).isEqualTo(1); + assertThat(measureRepository.getRawMeasure(FILE1, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); + assertThat(measureRepository.getRawMeasure(FILE1, WONT_FIX_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); + + assertThat(measureRepository.getRawMeasure(FILE2, ISSUES_METRIC).get().getIntValue()).isEqualTo(2); + assertThat(measureRepository.getRawMeasure(FILE2, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(0); + assertThat(measureRepository.getRawMeasure(FILE2, WONT_FIX_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); + + assertThat(measureRepository.getRawMeasure(FILE3, ISSUES_METRIC).get().getIntValue()).isEqualTo(0); + + assertThat(measureRepository.getRawMeasure(PROJECT, FALSE_POSITIVE_ISSUES_METRIC).get().getIntValue()).isEqualTo(1); + assertThat(measureRepository.getRawMeasure(PROJECT, WONT_FIX_ISSUES_METRIC).get().getIntValue()).isEqualTo(2); + } + + @Test public void count_unresolved_issues_by_severity() { periodsHolder.setPeriods(); |