]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10461 load branch even if project key in report is wrong
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 6 Mar 2018 10:39:36 +0000 (11:39 +0100)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 13 Mar 2018 08:11:10 +0000 (09:11 +0100)
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java

index 52d459ee2a5d7ad3ead2d4b3575baec89a29e0e7..a394db74c4a4504bcee7842c0f4c3c501508e590 100644 (file)
@@ -88,9 +88,10 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
 
     loadMetadata(reportMetadata);
     Organization organization = loadOrganization(reportMetadata);
-    loadProject(reportMetadata, organization);
+    Runnable projectValidation = loadProject(reportMetadata, organization);
     loadQualityProfiles(reportMetadata, organization);
     branchLoader.load(reportMetadata);
+    projectValidation.run();
   }
 
   private void loadMetadata(ScannerReport.Metadata reportMetadata) {
@@ -99,17 +100,33 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
     analysisMetadata.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated());
   }
 
-  private void loadProject(ScannerReport.Metadata reportMetadata, Organization organization) {
+  /**
+   * @return a {@link Runnable} to execute some checks on the project at the end of the step
+   */
+  private Runnable loadProject(ScannerReport.Metadata reportMetadata, Organization organization) {
     String reportProjectKey = projectKeyFromReport(reportMetadata);
-    checkProjectKeyConsistency(reportProjectKey);
-    ComponentDto dto = toProject(reportProjectKey);
-    if (!dto.getOrganizationUuid().equals(organization.getUuid())) {
-      throw MessageException.of(format("Project is not in the expected organization: %s", organization.getKey()));
-    }
-    if (dto.getMainBranchProjectUuid() != null) {
-      throw MessageException.of("Project should not reference a branch");
+    String componentKey = ceTask.getComponentKey();
+    if (componentKey == null) {
+      throw MessageException.of(format(
+        "Compute Engine task component key is null. Project with UUID %s must have been deleted since report was uploaded. Can not proceed.",
+        ceTask.getComponentUuid()));
     }
+    ComponentDto dto = toProject(reportProjectKey);
     analysisMetadata.setProject(new Project(dto.uuid(), dto.getDbKey(), dto.name()));
+    return () -> {
+      if (!componentKey.equals(reportProjectKey)) {
+        throw MessageException.of(format(
+          "ProjectKey in report (%s) is not consistent with projectKey under which the report has been submitted (%s)",
+          reportProjectKey,
+          componentKey));
+      }
+      if (!dto.getOrganizationUuid().equals(organization.getUuid())) {
+        throw MessageException.of(format("Project is not in the expected organization: %s", organization.getKey()));
+      }
+      if (dto.getMainBranchProjectUuid() != null) {
+        throw MessageException.of("Project should not reference a branch");
+      }
+    };
   }
 
   private Organization loadOrganization(ScannerReport.Metadata reportMetadata) {
@@ -164,21 +181,6 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
     }
   }
 
-  private void checkProjectKeyConsistency(String reportProjectKey) {
-    String componentKey = ceTask.getComponentKey();
-    if (componentKey == null) {
-      throw MessageException.of(format(
-        "Compute Engine task component key is null. Project with UUID %s must have been deleted since report was uploaded. Can not proceed.",
-        ceTask.getComponentUuid()));
-    }
-    if (!componentKey.equals(reportProjectKey)) {
-      throw MessageException.of(format(
-        "ProjectKey in report (%s) is not consistent with projectKey under which the report as been submitted (%s)",
-        reportProjectKey,
-        componentKey));
-    }
-  }
-
   private void checkOrganizationKeyConsistency(ScannerReport.Metadata reportMetadata, Organization organization) {
     String organizationKey = reportMetadata.getOrganizationKey();
     String resolveReportOrganizationKey = resolveReportOrganizationKey(organizationKey);
index 77fbfe6a9d42fe43602bf5b584283be71e39d61f..d6f575495c506ee4fdf6d1ec8ed70f1c16638c4a 100644 (file)
@@ -157,22 +157,42 @@ public class LoadReportAnalysisMetadataHolderStepTest {
 
   @Test
   public void execute_fails_with_MessageException_when_projectKey_in_report_is_different_from_componentKey_in_CE_task() {
+    OrganizationDto organization = db.organizations().insert();
+    ComponentDto otherProject = db.components().insertPublicProject(organization);
     reportReader.setMetadata(
       ScannerReport.Metadata.newBuilder()
-        .setProjectKey("some other key")
+        .setProjectKey(otherProject.getDbKey())
         .build());
 
     expectedException.expect(MessageException.class);
-    expectedException.expectMessage("ProjectKey in report (some other key) is not consistent with projectKey under which the report as been submitted (" + PROJECT_KEY + ")");
+    expectedException.expectMessage("ProjectKey in report (" + otherProject.getDbKey() + ") is not consistent with projectKey under which the report has been submitted (" + PROJECT_KEY + ")");
 
     underTest.execute();
   }
 
+  @Test
+  public void execute_sets_branch_even_if_MessageException_is_thrown_because_projectKey_in_report_is_different_from_componentKey_in_CE_task() {
+    OrganizationDto organization = db.organizations().insert();
+    ComponentDto otherProject = db.components().insertPublicProject(organization);
+    reportReader.setMetadata(
+      ScannerReport.Metadata.newBuilder()
+        .setProjectKey(otherProject.getDbKey())
+        .build());
+
+    try {
+      underTest.execute();
+    } catch (MessageException e) {
+      assertThat(analysisMetadataHolder.getBranch()).isNotNull();
+    }
+  }
+
   @Test
   public void execute_sets_analysis_date_even_if_MessageException_is_thrown_because_projectKey_is_different_from_componentKey_in_CE_task() {
+    OrganizationDto organization = db.organizations().insert();
+    ComponentDto otherProject = db.components().insertPublicProject(organization);
     reportReader.setMetadata(
       ScannerReport.Metadata.newBuilder()
-        .setProjectKey("some other key")
+        .setProjectKey(otherProject.getDbKey())
         .setAnalysisDate(ANALYSIS_DATE)
         .build());