From 36619d7c9a56bef27d2430b77685e7a4f65abb55 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 5 Jan 2016 16:44:14 +0100 Subject: [PATCH] SONAR-7093 Allow projects to define their leak period --- .../DifferentialPeriodsTest.java | 60 ++++++++++++++++--- it/it-tests/src/test/java/util/ItUtils.java | 13 +++- .../define-leak-period-on-project.html | 49 +++++++++++++++ .../core/config/CorePropertyDefinitions.java | 1 + 4 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 it/it-tests/src/test/resources/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html diff --git a/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java b/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java index c1e9606ab4e..9bf64ac8fc4 100644 --- a/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java +++ b/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java @@ -5,6 +5,7 @@ import com.sonar.orchestrator.build.SonarRunner; import com.sonar.orchestrator.locator.FileLocation; import com.sonar.orchestrator.selenium.Selenese; import it.Category1Suite; +import java.util.Date; import java.util.List; import org.junit.After; import org.junit.Before; @@ -14,13 +15,18 @@ import org.sonar.wsclient.services.Measure; import org.sonar.wsclient.services.Resource; import org.sonar.wsclient.services.ResourceQuery; import util.ItUtils; +import util.selenium.SeleneseTest; +import static org.apache.commons.lang.time.DateUtils.addDays; import static org.assertj.core.api.Assertions.assertThat; +import static util.ItUtils.formatDate; import static util.ItUtils.projectDir; import static util.ItUtils.setServerProperty; public class DifferentialPeriodsTest { + static final String PROJECT_KEY = "sample"; + @ClassRule public static final Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; @@ -46,18 +52,18 @@ public class DifferentialPeriodsTest { */ @Test public void ensure_differential_period_4_and_5_defined_at_project_level_is_taken_into_account() throws Exception { - setServerProperty(orchestrator, "sonar.timemachine.period4", "30"); - setServerProperty(orchestrator, "sonar.timemachine.period5", "previous_analysis"); + orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); + setServerProperty(orchestrator, PROJECT_KEY, "sonar.timemachine.period4", "30"); + setServerProperty(orchestrator, PROJECT_KEY, "sonar.timemachine.period5", "previous_analysis"); // Execute an analysis in the past to have a past snapshot without any issues - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "empty"); + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "empty"); orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.projectDate", "2013-01-01")); + .setProperty("sonar.projectDate", formatDate(addDays(new Date(), -60)))); // Second analysis -> issues will be created orchestrator.getServer().restoreProfile(FileLocation.ofClasspath("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line"); orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample"))); // New technical debt only comes from new issues @@ -68,7 +74,7 @@ public class DifferentialPeriodsTest { assertThat(measures.get(0).getVariation5()).isEqualTo(17); // Third analysis, with exactly the same profile -> no new issues so no new technical debt - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line"); orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample"))); newTechnicalDebt = orchestrator.getServer().getWsClient().find( @@ -79,13 +85,49 @@ public class DifferentialPeriodsTest { assertThat(newTechnicalDebt).isNull(); } + /** + * SONAR-7093 + */ + @Test + public void ensure_leak_period_defined_at_project_level_is_taken_into_account() throws Exception { + orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); + + // Set a global property and a project property to ensure project property is used + setServerProperty(orchestrator, "sonar.timemachine.period1", "previous_analysis"); + setServerProperty(orchestrator, PROJECT_KEY, "sonar.timemachine.period1", "30"); + + // Execute an analysis in the past to have a past snapshot without any issues + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "empty"); + orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample")) + .setProperty("sonar.projectDate", formatDate(addDays(new Date(), -15)))); + + // Second analysis -> issues will be created + orchestrator.getServer().restoreProfile(FileLocation.ofClasspath("/measureHistory/one-issue-per-line-profile.xml")); + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line"); + orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample"))); + + // Third analysis -> There's no new issue from previous analysis + orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample"))); + + // Project should have 17 new issues for period 1 + Resource newTechnicalDebt = orchestrator.getServer().getWsClient() + .find(ResourceQuery.createForMetrics(PROJECT_KEY, "violations").setIncludeTrends(true)); + List measures = newTechnicalDebt.getMeasures(); + assertThat(measures.get(0).getVariation1()).isEqualTo(17); + + // Check on ui that it's possible to define leak period on project + new SeleneseTest(Selenese.builder().setHtmlTestsInClasspath("define-leak-period-on-project", + "/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html" + ).build()).runOn(orchestrator); + } + /** * SONAR-4700 */ @Test public void not_display_periods_selection_dropdown_on_first_analysis() { - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "empty"); + orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); + orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "empty"); orchestrator.executeBuild(SonarRunner.create(projectDir("shared/xoo-sample"))); // Use old way to execute Selenium because 'assertSelectOptions' action is not supported by SeleneseTest diff --git a/it/it-tests/src/test/java/util/ItUtils.java b/it/it-tests/src/test/java/util/ItUtils.java index 6270b999363..c5f6e0d06dc 100644 --- a/it/it-tests/src/test/java/util/ItUtils.java +++ b/it/it-tests/src/test/java/util/ItUtils.java @@ -201,10 +201,14 @@ public class ItUtils { } public static void setServerProperty(Orchestrator orchestrator, String key, @Nullable String value) { + setServerProperty(orchestrator, null, key, value); + } + + public static void setServerProperty(Orchestrator orchestrator, @Nullable String componentKey, String key, @Nullable String value) { if (value == null) { - orchestrator.getServer().getAdminWsClient().delete(new PropertyDeleteQuery(key)); + orchestrator.getServer().getAdminWsClient().delete(new PropertyDeleteQuery(key).setResourceKeyOrId(componentKey)); } else { - orchestrator.getServer().getAdminWsClient().update(new PropertyUpdateQuery().setKey(key).setValue(value)); + orchestrator.getServer().getAdminWsClient().update(new PropertyUpdateQuery().setKey(key).setResourceKeyOrId(componentKey).setValue(value)); } } @@ -248,4 +252,9 @@ public class ItUtils { } } + public static String formatDate(Date d) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(d); + } + } diff --git a/it/it-tests/src/test/resources/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html b/it/it-tests/src/test/resources/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html new file mode 100644 index 00000000000..1d426c899f0 --- /dev/null +++ b/it/it-tests/src/test/resources/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html @@ -0,0 +1,49 @@ + + + + + + display-added-files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
should_display_added_files_in_differential_drilldown
open/sonar/sessions/logout
open/sonar/project/settings?id=sample&category=general&subcategory=differentialviews
typeid=loginadmin
typeid=passwordadmin
clickAndWaitname=commit
assertTextproperties*Leak Period*
+ + diff --git a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java index 30f06ad2e7c..e785dc2ccff 100644 --- a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java +++ b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java @@ -237,6 +237,7 @@ public class CorePropertyDefinitions { .defaultValue(TIMEMACHINE_DEFAULT_PERIOD_1) .category(CoreProperties.CATEGORY_GENERAL) .subCategory(CoreProperties.SUBCATEGORY_DIFFERENTIAL_VIEWS) + .onQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW) .build(), PropertyDefinition.builder(TIMEMACHINE_PERIOD_PREFIX + 2) -- 2.39.5