aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-09-20 10:17:09 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-09-21 09:54:23 +0200
commit1f99769fe121078178af3a7a8e1e540c6797e808 (patch)
treea0c9af644272dcbeb87f8205303c0e05bc24d838 /tests
parente4a4f742a5c70e7886fb53d76c0e3e44797b52dd (diff)
downloadsonarqube-1f99769fe121078178af3a7a8e1e540c6797e808.tar.gz
sonarqube-1f99769fe121078178af3a7a8e1e540c6797e808.zip
harden TechnicalDebtMeasure IT
Diffstat (limited to 'tests')
-rw-r--r--tests/src/test/java/org/sonarqube/tests/Category2Suite.java4
-rw-r--r--tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtAndIssueNewMeasuresTest.java355
-rw-r--r--tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtMeasureVariationTest.java154
3 files changed, 357 insertions, 156 deletions
diff --git a/tests/src/test/java/org/sonarqube/tests/Category2Suite.java b/tests/src/test/java/org/sonarqube/tests/Category2Suite.java
index 832da865d7b..c84781c885f 100644
--- a/tests/src/test/java/org/sonarqube/tests/Category2Suite.java
+++ b/tests/src/test/java/org/sonarqube/tests/Category2Suite.java
@@ -49,7 +49,7 @@ import org.sonarqube.tests.qualityModel.NewDebtRatioMeasureTest;
import org.sonarqube.tests.qualityModel.ReliabilityMeasureTest;
import org.sonarqube.tests.qualityModel.SecurityMeasureTest;
import org.sonarqube.tests.qualityModel.TechnicalDebtInIssueChangelogTest;
-import org.sonarqube.tests.qualityModel.TechnicalDebtMeasureVariationTest;
+import org.sonarqube.tests.qualityModel.TechnicalDebtAndIssueNewMeasuresTest;
import org.sonarqube.tests.qualityModel.TechnicalDebtTest;
import org.sonarqube.tests.scm.ScmTest;
import org.sonarqube.tests.test.CoverageTest;
@@ -95,7 +95,7 @@ import static util.ItUtils.xooPlugin;
ReliabilityMeasureTest.class,
SecurityMeasureTest.class,
TechnicalDebtInIssueChangelogTest.class,
- TechnicalDebtMeasureVariationTest.class,
+ TechnicalDebtAndIssueNewMeasuresTest.class,
TechnicalDebtTest.class,
// ui
IssuesPageTest.class,
diff --git a/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtAndIssueNewMeasuresTest.java b/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtAndIssueNewMeasuresTest.java
new file mode 100644
index 00000000000..fe8d6dfcb46
--- /dev/null
+++ b/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtAndIssueNewMeasuresTest.java
@@ -0,0 +1,355 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonarqube.tests.qualityModel;
+
+import com.sonar.orchestrator.Orchestrator;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonarqube.tests.Category2Suite;
+import util.ItUtils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static util.ItUtils.getLeakPeriodValue;
+import static util.ItUtils.setServerProperty;
+
+/**
+ * SONAR-4776
+ */
+public class TechnicalDebtAndIssueNewMeasuresTest {
+
+ private static final String DATE_31_DAYS_AGO = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now().minusDays(31));// "2013-01-01";
+
+ @ClassRule
+ public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR;
+
+ @AfterClass
+ public static void resetPeriod() throws Exception {
+ ItUtils.resetPeriod(orchestrator);
+ }
+
+ @Before
+ public void cleanUpAnalysisData() {
+ orchestrator.resetData();
+ }
+
+ @Test
+ public void new_technical_debt_measures_from_new_issues() throws Exception {
+ setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
+
+ // Execute an analysis in the past to have a past snapshot without any issues
+ provisionSampleProject();
+ setSampleProjectQualityProfile("empty");
+ runSampleProjectAnalysis("sonar.projectDate", DATE_31_DAYS_AGO);
+
+ // Second analysis -> issues will be created
+ defineQualityProfile("one-issue-per-line");
+ setSampleProjectQualityProfile("one-issue-per-line");
+
+ // New technical debt only comes from new issues
+ runSampleProjectAnalysis();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(17d);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(17d);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isEqualTo(17);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+
+ // Third analysis, with exactly the same profile -> no new issues so no new technical debt
+ runSampleProjectAnalysis();
+ // No variation => measure is 0 (best value)
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+ }
+
+ @Test
+ public void new_technical_debt_measures_from_technical_debt_update_since_previous_analysis() throws Exception {
+ setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
+
+ // Execute twice analysis
+ defineQualityProfile("one-issue-per-file");
+ provisionSampleProject();
+ setSampleProjectQualityProfile("one-issue-per-file");
+ runSampleProjectAnalysis();
+ runSampleProjectAnalysis();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+
+ // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(90);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+
+ // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+ }
+
+ @Test
+ public void new_technical_debt_measures_from_technical_debt_update_since_30_days_with_constant_effort() throws Exception {
+ setServerProperty(orchestrator, "sonar.leak.period", "30");
+
+ // Execute an analysis in the past to have a past snapshot without any issues
+ provisionSampleProject();
+ setSampleProjectQualityProfile("empty");
+ runSampleProjectAnalysis("sonar.projectDate", DATE_31_DAYS_AGO);
+
+ // Second analysis -> issues will be created
+ String profileXmlFile = "one-issue-per-file";
+ defineQualityProfile(profileXmlFile);
+ setSampleProjectQualityProfile("one-issue-per-file");
+ runSampleProjectAnalysis();
+
+ // no new issue and no change in debt but still one issue on the leak period (30d)
+ runSampleProjectAnalysis();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(10);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(10);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+
+ // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis but still since 30
+ // days
+ runSampleProjectAnalysis();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(10);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(10);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+ }
+
+ @Test
+ public void new_technical_debt_measures_from_technical_debt_update_since_30_days_with_effort_change() throws Exception {
+ setServerProperty(orchestrator, "sonar.leak.period", "30");
+
+ // Execute an analysis in the past to have a past snapshot without any issues
+ provisionSampleProject();
+ setSampleProjectQualityProfile("empty");
+ runSampleProjectAnalysis("sonar.projectDate", DATE_31_DAYS_AGO);
+
+ // Second analysis -> issues will be created
+ String profileXmlFile = "one-issue-per-file";
+ defineQualityProfile(profileXmlFile);
+ setSampleProjectQualityProfile("one-issue-per-file");
+ runSampleProjectAnalysis();
+
+ // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(100);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(100);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+
+ // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis but still since 30
+ // days
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_technical_debt")).isEqualTo(100);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample", "new_info_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(100);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_code_smells")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_bugs")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_vulnerabilities")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_blocker_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_critical_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_major_violations")).isZero();
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_minor_violations")).isEqualTo(1);
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_info_violations")).isZero();
+ }
+
+ /**
+ * SONAR-5059
+ */
+ @Test
+ public void new_technical_debt_measures_should_never_be_negative() throws Exception {
+ setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
+
+ // Execute an analysis with a big effort to fix
+ defineQualityProfile("one-issue-per-file");
+ provisionSampleProject();
+ setSampleProjectQualityProfile("one-issue-per-file");
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "100");
+
+ // Execute a second analysis with a smaller effort to fix -> Added technical debt should be 0, not negative
+ runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
+ assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
+ }
+
+ private void setSampleProjectQualityProfile(String qualityProfileKey) {
+ orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", qualityProfileKey);
+ }
+
+ private void provisionSampleProject() {
+ orchestrator.getServer().provisionProject("sample", "sample");
+ }
+
+ private void defineQualityProfile(String qualityProfileKey) {
+ ItUtils.restoreProfile(orchestrator, getClass().getResource("/measure/" + qualityProfileKey + ".xml"));
+ }
+
+ private void runSampleProjectAnalysis(String... properties) {
+ ItUtils.runVerboseProjectAnalysis(TechnicalDebtAndIssueNewMeasuresTest.orchestrator, "shared/xoo-sample", properties);
+ }
+
+}
diff --git a/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtMeasureVariationTest.java b/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtMeasureVariationTest.java
deleted file mode 100644
index 5ea52641e4c..00000000000
--- a/tests/src/test/java/org/sonarqube/tests/qualityModel/TechnicalDebtMeasureVariationTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonarqube.tests.qualityModel;
-
-import com.sonar.orchestrator.Orchestrator;
-import org.sonarqube.tests.Category2Suite;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import util.ItUtils;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static util.ItUtils.getLeakPeriodValue;
-import static util.ItUtils.setServerProperty;
-
-/**
- * SONAR-4776
- */
-public class TechnicalDebtMeasureVariationTest {
-
- @ClassRule
- public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR;
-
- @AfterClass
- public static void resetPeriod() throws Exception {
- ItUtils.resetPeriod(orchestrator);
- }
-
- @Before
- public void cleanUpAnalysisData() {
- orchestrator.resetData();
- }
-
- @Test
- public void new_technical_debt_measures_from_new_issues() throws Exception {
- setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
-
- // Execute an analysis in the past to have a past snapshot without any issues
- provisionSampleProject();
- setSampleProjectQualityProfile("empty");
- runSampleProjectAnalysis("sonar.projectDate", "2013-01-01");
-
- // Second analysis -> issues will be created
- defineQualityProfile("one-issue-per-line");
- setSampleProjectQualityProfile("one-issue-per-line");
- runSampleProjectAnalysis();
-
- // New technical debt only comes from new issues
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(17d);
-
- // Third analysis, with exactly the same profile -> no new issues so no new technical debt
- runSampleProjectAnalysis();
- // No variation => measure is 0 (best value)
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
- }
-
- @Test
- public void new_technical_debt_measures_from_technical_debt_update_since_previous_analysis() throws Exception {
- setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
-
- // Execute twice analysis
- defineQualityProfile("one-issue-per-file");
- provisionSampleProject();
- setSampleProjectQualityProfile("one-issue-per-file");
- runSampleProjectAnalysis();
- runSampleProjectAnalysis();
-
- // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90);
-
- // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
- }
-
- @Test
- public void new_technical_debt_measures_from_technical_debt_update_since_30_days() throws Exception {
- setServerProperty(orchestrator, "sonar.leak.period", "30");
-
- // Execute an analysis in the past to have a past snapshot without any issues
- provisionSampleProject();
- setSampleProjectQualityProfile("empty");
- runSampleProjectAnalysis("sonar.projectDate", "2013-01-01");
-
- // Second analysis -> issues will be created
- String profileXmlFile = "one-issue-per-file";
- defineQualityProfile(profileXmlFile);
- setSampleProjectQualityProfile("one-issue-per-file");
- runSampleProjectAnalysis();
-
- // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90);
-
- // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis but still since 30
- // days
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90);
- }
-
- /**
- * SONAR-5059
- */
- @Test
- public void new_technical_debt_measures_should_never_be_negative() throws Exception {
- setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis");
-
- // Execute an analysis with a big effort to fix
- defineQualityProfile("one-issue-per-file");
- provisionSampleProject();
- setSampleProjectQualityProfile("one-issue-per-file");
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "100");
-
- // Execute a second analysis with a smaller effort to fix -> Added technical debt should be 0, not negative
- runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10");
- assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero();
- }
-
- private void setSampleProjectQualityProfile(String qualityProfileKey) {
- orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", qualityProfileKey);
- }
-
- private void provisionSampleProject() {
- orchestrator.getServer().provisionProject("sample", "sample");
- }
-
- private void defineQualityProfile(String qualityProfileKey) {
- ItUtils.restoreProfile(orchestrator, getClass().getResource("/measure/" + qualityProfileKey + ".xml"));
- }
-
- private void runSampleProjectAnalysis(String... properties) {
- ItUtils.runVerboseProjectAnalysis(TechnicalDebtMeasureVariationTest.orchestrator, "shared/xoo-sample", properties);
- }
-
-}