]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7093 Allow projects to define their leak period 704/head
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 5 Jan 2016 15:44:14 +0000 (16:44 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 6 Jan 2016 11:41:22 +0000 (12:41 +0100)
it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java
it/it-tests/src/test/java/util/ItUtils.java
it/it-tests/src/test/resources/measureHistory/DifferentialPeriodsTest/define-leak-period-on-project.html [new file with mode: 0644]
sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java

index c1e9606ab4ea25290b2516e0a9a64232983cbbf7..9bf64ac8fc42e7fd904defd7f8150610459f64be 100644 (file)
@@ -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<Measure> 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
index 6270b999363c3d6ef1b3551ac5f13848a8917e9a..c5f6e0d06dc651929f1f3e68f65d139097d2aa78 100644 (file)
@@ -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 (file)
index 0000000..1d426c8
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+  <title>display-added-files</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+  <thead>
+  <tr>
+    <td rowspan="1" colspan="3">should_display_added_files_in_differential_drilldown</td>
+  </tr>
+  </thead>
+  <tbody>
+  <tr>
+       <td>open</td>
+       <td>/sonar/sessions/logout</td>
+       <td></td>
+</tr>
+<tr>
+       <td>open</td>
+       <td>/sonar/project/settings?id=sample&amp;category=general&amp;subcategory=differentialviews</td>
+       <td></td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>id=login</td>
+       <td>admin</td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>id=password</td>
+       <td>admin</td>
+</tr>
+<tr>
+       <td>clickAndWait</td>
+       <td>name=commit</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertText</td>
+       <td>properties</td>
+       <td>*Leak Period*</td>
+</tr>
+</tbody>
+</table>
+</body>
+</html>
index 30f06ad2e7c9707896444436d33069ca7c254c46..e785dc2ccffcccbb1011a1189ec05526fb7f4cd5 100644 (file)
@@ -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)