From 368cfd19508e128b68741ce6810a04547638522a Mon Sep 17 00:00:00 2001 From: Janos Gyerik Date: Wed, 13 Mar 2019 15:49:24 +0100 Subject: [PATCH] SONAR-11631 Add sonar.buildString to scanner report --- .../java/org/sonar/api/CoreProperties.java | 1 + .../java/org/sonar/scanner/ProjectInfo.java | 24 ++++++++++++----- .../scanner/report/MetadataPublisher.java | 1 + .../org/sonar/scanner/ProjectInfoTest.java | 13 +++++++++ .../scanner/report/MetadataPublisherTest.java | 27 +++++++++++++++++++ .../scan/ProjectReactorValidatorTest.java | 18 +++++++++++++ .../src/main/protobuf/scanner_report.proto | 1 + 7 files changed, 78 insertions(+), 7 deletions(-) diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java b/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java index 583ccde340a..368072b7eff 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java @@ -147,6 +147,7 @@ public interface CoreProperties { String PROJECT_BRANCH_PROPERTY = "sonar.branch"; String PROJECT_VERSION_PROPERTY = "sonar.projectVersion"; String CODE_PERIOD_VERSION_PROPERTY = "sonar.codePeriodVersion"; + String BUILD_STRING_PROPERTY = "sonar.buildString"; /** * @since 2.6 diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/ProjectInfo.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/ProjectInfo.java index 3ae78266298..6c00301f473 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/ProjectInfo.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/ProjectInfo.java @@ -31,6 +31,7 @@ import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.MessageException; import static java.lang.String.format; +import static org.sonar.api.CoreProperties.BUILD_STRING_PROPERTY; import static org.sonar.api.CoreProperties.CODE_PERIOD_VERSION_PROPERTY; import static org.sonar.api.CoreProperties.PROJECT_VERSION_PROPERTY; @@ -46,6 +47,7 @@ public class ProjectInfo implements Startable { private Date analysisDate; private String projectVersion; private String codePeriodVersion; + private String buildString; public ProjectInfo(Configuration settings, Clock clock) { this.settings = settings; @@ -64,6 +66,10 @@ public class ProjectInfo implements Startable { return Optional.ofNullable(codePeriodVersion); } + public Optional getBuildString() { + return Optional.ofNullable(buildString); + } + private Date loadAnalysisDate() { Optional value = settings.get(CoreProperties.PROJECT_DATE_PROPERTY); if (!value.isPresent()) { @@ -88,19 +94,23 @@ public class ProjectInfo implements Startable { this.analysisDate = loadAnalysisDate(); this.projectVersion = settings.get(PROJECT_VERSION_PROPERTY) .map(StringUtils::trimToNull) - .filter(validateVersion("project")) + .filter(validateLengthLimit("project version")) .orElse(null); this.codePeriodVersion = settings.get(CODE_PERIOD_VERSION_PROPERTY) .map(StringUtils::trimToNull) - .filter(validateVersion("codePeriod")) + .filter(validateLengthLimit("codePeriod version")) .orElse(projectVersion); + this.buildString = settings.get(BUILD_STRING_PROPERTY) + .map(StringUtils::trimToNull) + .filter(validateLengthLimit("buildString")) + .orElse(null); } - private static Predicate validateVersion(String versionLabel) { - return version -> { - if (version.length() > 100) { - throw MessageException.of(format("\"%s\" is not a valid %s version. " + - "The maximum length is 100 characters.", version, versionLabel)); + private static Predicate validateLengthLimit(String label) { + return value -> { + if (value.length() > 100) { + throw MessageException.of(format("\"%s\" is not a valid %s. " + + "The maximum length is 100 characters.", value, label)); } return true; }; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java index c5fabaed1c9..ae97aedbf7a 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java @@ -90,6 +90,7 @@ public class MetadataPublisher implements ReportPublisherStep { .setRootComponentRef(rootProject.scannerId()); projectInfo.getProjectVersion().ifPresent(builder::setProjectVersion); projectInfo.getCodePeriodVersion().ifPresent(builder::setCodePeriodVersion); + projectInfo.getBuildString().ifPresent(builder::setBuildString); properties.organizationKey().ifPresent(builder::setOrganizationKey); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java index 7bdc75c20b7..6786709a6b7 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java @@ -98,6 +98,19 @@ public class ProjectInfoTest { underTest.start(); } + @Test + public void fail_with_too_long_buildString() { + String buildString = randomAlphabetic(101); + settings.setProperty(CoreProperties.PROJECT_DATE_PROPERTY, "2017-01-01"); + settings.setProperty(CoreProperties.BUILD_STRING_PROPERTY, buildString); + + expectedException.expect(MessageException.class); + expectedException.expectMessage("\"" + buildString + "\" is not a valid buildString. " + + "The maximum length is 100 characters."); + + underTest.start(); + } + @Test @UseDataProvider("projectVersions") public void getCodePeriodVersion_has_value_of_projectVersion_if_property_is_unset(@Nullable String projectVersion) { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java index cf46878a7dd..75043c9997d 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java @@ -242,6 +242,33 @@ public class MetadataPublisherTest { }; } + @Test + @UseDataProvider("buildStrings") + public void write_buildString(@Nullable String buildString, String expected) throws Exception { + when(projectInfo.getBuildString()).thenReturn(Optional.ofNullable(buildString)); + when(properties.organizationKey()).thenReturn(Optional.of("SonarSource")); + + File outputDir = temp.newFolder(); + ScannerReportWriter writer = new ScannerReportWriter(outputDir); + + underTest.publish(writer); + + ScannerReportReader reader = new ScannerReportReader(outputDir); + ScannerReport.Metadata metadata = reader.readMetadata(); + assertThat(metadata.getBuildString()).isEqualTo(expected); + } + + @DataProvider + public static Object[][] buildStrings() { + String randomBuildString = randomAlphabetic(15); + return new Object[][] { + {null, ""}, + {"", ""}, + {"5.6.3", "5.6.3"}, + {randomBuildString, randomBuildString} + }; + } + @Test public void write_long_lived_branch_info() throws Exception { String branchName = "long-lived"; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java index e91ddfa31fb..90ec4d316d3 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java @@ -248,6 +248,24 @@ public class ProjectReactorValidatorTest { }; } + @Test + @UseDataProvider("validBuildStrings") + public void not_fail_with_valid_buildString(String validBuildString) { + when(projectInfo.getBuildString()).thenReturn(Optional.ofNullable(validBuildString)); + + underTest.validate(createProjectReactor("foo")); + } + + @DataProvider + public static Object[][] validBuildStrings() { + return new Object[][] { + {null}, + {"1.0"}, + {"2017-10-16"}, + {randomAscii(100)} + }; + } + private ProjectReactor createProjectReactor(String projectKey, String branch) { return createProjectReactor(projectKey, def -> def .setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, branch)); diff --git a/sonar-scanner-protocol/src/main/protobuf/scanner_report.proto b/sonar-scanner-protocol/src/main/protobuf/scanner_report.proto index 19181f1faf7..b809619222a 100644 --- a/sonar-scanner-protocol/src/main/protobuf/scanner_report.proto +++ b/sonar-scanner-protocol/src/main/protobuf/scanner_report.proto @@ -51,6 +51,7 @@ message Metadata { string projectVersion = 16; string codePeriodVersion = 17; + string buildString = 18; message QProfile { string key = 1; -- 2.39.5