]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6386 New modules should inherit parent settings
authorJulien HENRY <julien.henry@sonarsource.com>
Mon, 5 Oct 2015 08:20:02 +0000 (10:20 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Mon, 5 Oct 2015 12:27:50 +0000 (14:27 +0200)
it/it-tests/src/test/java/batch/BatchTest.java
sonar-batch/src/main/java/org/sonar/batch/repository/ProjectRepositories.java
sonar-batch/src/main/java/org/sonar/batch/scan/ModuleSettings.java
sonar-batch/src/test/java/org/sonar/batch/scan/ModuleSettingsTest.java

index b7bc903fd5ceddfca9d020b3a0508d4a8cf0bc89..f64b9dd8b49f4df8b6204eff600fea048fd6f7f5 100644 (file)
@@ -74,7 +74,7 @@ public class BatchTest {
     Resource branch = sonar.find(new ResourceQuery("com.sonarsource.it.samples:multi-modules-sample:branch/0.x"));
     assertThat(branch.getName()).isEqualTo("Sonar :: Integration Tests :: Multi-modules Sample branch/0.x");
   }
-  
+
   @Test
   public void use_sonar_profile_without_provisioning_project() {
     scan("shared/xoo-multi-modules-sample",
@@ -116,7 +116,6 @@ public class BatchTest {
   @Test
   public void module_should_load_own_settings_from_database() {
     orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Sonar :: Integration Tests :: Multi-modules Sample");
-    orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-line");
 
     Sonar sonar = orchestrator.getServer().getAdminWsClient();
     String propKey = "myFakeProperty";
@@ -147,6 +146,27 @@ public class BatchTest {
     assertThat(result.getLogs()).contains(moduleBKey + ":" + propKey + " = moduleB");
   }
 
+  // SONAR-4680
+  @Test
+  public void module_should_load_settings_from_parent() {
+    orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Sonar :: Integration Tests :: Multi-modules Sample");
+
+    Sonar sonar = orchestrator.getServer().getAdminWsClient();
+    String propKey = "myFakeProperty";
+    String rootModuleKey = "com.sonarsource.it.samples:multi-modules-sample";
+    String moduleBKey = rootModuleKey + ":module_b";
+
+    // Set property on provisionned project
+    sonar.update(new PropertyUpdateQuery(propKey, "project", rootModuleKey));
+    sonar.delete(new PropertyDeleteQuery(propKey, moduleBKey));
+
+    BuildResult result = scan("shared/xoo-multi-modules-sample", "sonar.showSettings", propKey);
+
+    assertThat(result.getLogs()).contains(rootModuleKey + ":" + propKey + " = project");
+    // Module should inherit from parent
+    assertThat(result.getLogs()).contains(moduleBKey + ":" + propKey + " = project");
+  }
+
   /**
    * SONAR-3116
    */
index 4c12eb40886e6afe45a01d22e11a3cf3a7db48a2..2ce2759d7d4dbd73d75c09690e405d0571eae98d 100644 (file)
@@ -21,12 +21,10 @@ package org.sonar.batch.repository;
 
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
 import java.util.Date;
 import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 
 public class ProjectRepositories {
   private final Table<String, String, String> settingsByModule;
@@ -61,6 +59,10 @@ public class ProjectRepositories {
     return fileDataByModuleAndPath;
   }
 
+  public boolean moduleExists(String moduleKey) {
+    return settingsByModule.containsRow(moduleKey);
+  }
+
   public Map<String, String> settings(String moduleKey) {
     return settingsByModule.row(moduleKey);
   }
index 96f085d76b2779c178bccf43b7de25aac24583cb..d2719574e877b4978723a80b55eebb84e4e450a9 100644 (file)
@@ -35,13 +35,13 @@ import org.sonar.batch.repository.ProjectRepositories;
  */
 public class ModuleSettings extends Settings {
 
-  private final ProjectRepositories projectSettingsRepo;
+  private final ProjectRepositories projectRepos;
   private final DefaultAnalysisMode analysisMode;
 
   public ModuleSettings(GlobalSettings batchSettings, ProjectDefinition moduleDefinition, ProjectRepositories projectSettingsRepo,
     DefaultAnalysisMode analysisMode, AnalysisContextReportPublisher contextReportPublisher) {
     super(batchSettings.getDefinitions());
-    this.projectSettingsRepo = projectSettingsRepo;
+    this.projectRepos = projectSettingsRepo;
     this.analysisMode = analysisMode;
     getEncryption().setPathToSecretKey(batchSettings.getString(CoreProperties.ENCRYPTION_SECRET_KEY_PATH));
 
@@ -57,7 +57,14 @@ public class ModuleSettings extends Settings {
 
   private void addProjectProperties(ProjectDefinition moduleDefinition, GlobalSettings batchSettings) {
     addProperties(batchSettings.getProperties());
-    addProperties(projectSettingsRepo.settings(moduleDefinition.getKeyWithBranch()));
+    ProjectDefinition def = moduleDefinition;
+    do {
+      if (projectRepos.moduleExists(def.getKeyWithBranch())) {
+        addProperties(projectRepos.settings(def.getKeyWithBranch()));
+        break;
+      }
+      def = def.getParent();
+    } while (def != null);
   }
 
   private void addBuildProperties(ProjectDefinition project) {
index ab85aa3e5c731e75de548424e407a35a84d37333..1bbd3949539ceee8cb77e955a894bb2b77ac67c1 100644 (file)
  */
 package org.sonar.batch.scan;
 
-import org.sonar.batch.repository.FileData;
-
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableTable;
 import com.google.common.collect.Table;
-
 import java.util.List;
 import java.util.Map;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -39,7 +35,9 @@ import org.sonar.api.utils.MessageException;
 import org.sonar.batch.analysis.DefaultAnalysisMode;
 import org.sonar.batch.bootstrap.GlobalSettings;
 import org.sonar.batch.report.AnalysisContextReportPublisher;
+import org.sonar.batch.repository.FileData;
 import org.sonar.batch.repository.ProjectRepositories;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -82,17 +80,17 @@ public class ModuleSettingsTest {
 
   @Test
   public void test_loading_of_module_settings() {
-    GlobalSettings batchSettings = mock(GlobalSettings.class);
-    when(batchSettings.getDefinitions()).thenReturn(new PropertyDefinitions());
-    when(batchSettings.getProperties()).thenReturn(ImmutableMap.of(
+    GlobalSettings globalSettings = mock(GlobalSettings.class);
+    when(globalSettings.getDefinitions()).thenReturn(new PropertyDefinitions());
+    when(globalSettings.getProperties()).thenReturn(ImmutableMap.of(
       "overridding", "batch",
       "on-batch", "true"));
 
-    ProjectRepositories projSettingsRepo = createSettings("struts-core", ImmutableMap.of("on-module", "true", "overridding", "module"));
+    ProjectRepositories projRepos = createSettings("struts-core", ImmutableMap.of("on-module", "true", "overridding", "module"));
 
     ProjectDefinition module = ProjectDefinition.create().setKey("struts-core");
 
-    ModuleSettings moduleSettings = new ModuleSettings(batchSettings, module, projSettingsRepo, mode, mock(AnalysisContextReportPublisher.class));
+    ModuleSettings moduleSettings = new ModuleSettings(globalSettings, module, projRepos, mode, mock(AnalysisContextReportPublisher.class));
 
     assertThat(moduleSettings.getString("overridding")).isEqualTo("module");
     assertThat(moduleSettings.getString("on-batch")).isEqualTo("true");
@@ -100,6 +98,27 @@ public class ModuleSettingsTest {
 
   }
 
+  // SONAR-6386
+  @Test
+  public void test_loading_of_parent_module_settings_for_new_module() {
+    GlobalSettings globalSettings = mock(GlobalSettings.class);
+    when(globalSettings.getDefinitions()).thenReturn(new PropertyDefinitions());
+    when(globalSettings.getProperties()).thenReturn(ImmutableMap.of(
+      "overridding", "batch",
+      "on-batch", "true"));
+
+    ProjectRepositories projRepos = createSettings("struts", ImmutableMap.of("on-module", "true", "overridding", "module"));
+
+    ProjectDefinition module = ProjectDefinition.create().setKey("struts-core");
+    ProjectDefinition.create().setKey("struts").addSubProject(module);
+
+    ModuleSettings moduleSettings = new ModuleSettings(globalSettings, module, projRepos, mode, mock(AnalysisContextReportPublisher.class));
+
+    assertThat(moduleSettings.getString("overridding")).isEqualTo("module");
+    assertThat(moduleSettings.getString("on-batch")).isEqualTo("true");
+    assertThat(moduleSettings.getString("on-module")).isEqualTo("true");
+  }
+
   @Test
   public void should_not_fail_when_accessing_secured_properties() {
     GlobalSettings batchSettings = mock(GlobalSettings.class);
@@ -137,7 +156,7 @@ public class ModuleSettingsTest {
     thrown.expect(MessageException.class);
     thrown
       .expectMessage(
-      "Access to the secured property 'sonar.foo.secured' is not possible in issues mode. The SonarQube plugin which requires this property must be deactivated in issues mode.");
+        "Access to the secured property 'sonar.foo.secured' is not possible in issues mode. The SonarQube plugin which requires this property must be deactivated in issues mode.");
     moduleSettings.getString("sonar.foo.secured");
   }
 }