diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2015-10-29 16:37:29 +0100 |
---|---|---|
committer | Duarte Meneses <duarte.meneses@sonarsource.com> | 2015-11-03 10:14:38 +0100 |
commit | 3e5cbb0098adc6b59313fd501d395272edfe2e64 (patch) | |
tree | c4b832fd10b176b1766b30c931ff46714b30749c | |
parent | d5d4548ee4f0c13360ca4f28ff751f927daef663 (diff) | |
download | sonarqube-3e5cbb0098adc6b59313fd501d395272edfe2e64.tar.gz sonarqube-3e5cbb0098adc6b59313fd501d395272edfe2e64.zip |
SONAR-6211 Skip project key validation in issues mode
5 files changed, 70 insertions, 5 deletions
diff --git a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java b/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java index f598908ca47..1c60a13c84b 100644 --- a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java +++ b/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java @@ -86,6 +86,18 @@ public class IssuesModeTest { } @Test + public void project_key_with_slash() throws IOException { + restoreProfile("one-issue-per-line.xml"); + setDefaultQualityProfile("xoo", "one-issue-per-line"); + + SonarRunner runner = configureRunner("shared/xoo-sample"); + runner.setProjectKey("sample/project"); + runner.setProperty("sonar.analysis.mode", "issues"); + BuildResult result = orchestrator.executeBuild(runner); + assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(17); + } + + @Test public void non_associated_mode() throws IOException { restoreProfile("one-issue-per-line.xml"); setDefaultQualityProfile("xoo", "one-issue-per-line"); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java index a856b44b894..e9fbe316420 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java @@ -19,10 +19,15 @@ */ package org.sonar.batch.scan; +import org.sonar.batch.analysis.DefaultAnalysisMode; + import com.google.common.base.Joiner; + import java.util.ArrayList; import java.util.List; + import javax.annotation.Nullable; + import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; import org.sonar.api.batch.bootstrap.ProjectDefinition; @@ -38,20 +43,25 @@ public class ProjectReactorValidator { private static final String SONAR_PHASE = "sonar.phase"; private final Settings settings; + private final DefaultAnalysisMode mode; - public ProjectReactorValidator(Settings settings) { + public ProjectReactorValidator(Settings settings, DefaultAnalysisMode mode) { this.settings = settings; + this.mode = mode; } public void validate(ProjectReactor reactor) { String branch = settings.getString(CoreProperties.PROJECT_BRANCH_PROPERTY); - String rootProjectKey = ComponentKeys.createKey(reactor.getRoot().getKey(), branch); List<String> validationMessages = new ArrayList<>(); checkDeprecatedProperties(validationMessages); for (ProjectDefinition moduleDef : reactor.getProjects()) { - validateModule(moduleDef, validationMessages, branch, rootProjectKey); + if (mode.isIssues()) { + validateModuleIssuesMode(moduleDef, validationMessages); + } else { + validateModule(moduleDef, validationMessages); + } } validateBranch(validationMessages, branch); @@ -61,7 +71,14 @@ public class ProjectReactorValidator { } } - private static void validateModule(ProjectDefinition moduleDef, List<String> validationMessages, @Nullable String branch, String rootProjectKey) { + private static void validateModuleIssuesMode(ProjectDefinition moduleDef, List<String> validationMessages) { + if (!ComponentKeys.isValidModuleKeyIssuesMode(moduleDef.getKey())) { + validationMessages.add(String.format("\"%s\" is not a valid project or module key. " + + "Allowed characters in issues mode are alphanumeric, '-', '_', '.', '/' and ':', with at least one non-digit.", moduleDef.getKey())); + } + } + + private static void validateModule(ProjectDefinition moduleDef, List<String> validationMessages) { if (!ComponentKeys.isValidModuleKey(moduleDef.getKey())) { validationMessages.add(String.format("\"%s\" is not a valid project or module key. " + "Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit.", moduleDef.getKey())); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java index 1cb70ff6dcb..761c608c8cd 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java @@ -19,6 +19,8 @@ */ package org.sonar.batch.scan; +import static org.mockito.Mockito.when; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -27,6 +29,8 @@ import org.sonar.api.CoreProperties; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.batch.bootstrap.ProjectReactor; import org.sonar.api.config.Settings; +import org.sonar.batch.analysis.DefaultAnalysisMode; +import static org.mockito.Mockito.mock; public class ProjectReactorValidatorTest { @@ -35,11 +39,13 @@ public class ProjectReactorValidatorTest { private ProjectReactorValidator validator; private Settings settings; + private DefaultAnalysisMode mode; @Before public void prepare() { + mode = mock(DefaultAnalysisMode.class); settings = new Settings(); - validator = new ProjectReactorValidator(settings); + validator = new ProjectReactorValidator(settings, mode); } @Test @@ -54,6 +60,17 @@ public class ProjectReactorValidatorTest { validator.validate(createProjectReactor("3-3")); validator.validate(createProjectReactor("-:")); } + + @Test + public void allow_slash_issues_mode() { + when(mode.isIssues()).thenReturn(true); + validator.validate(createProjectReactor("project/key")); + + when(mode.isIssues()).thenReturn(false); + thrown.expect(IllegalStateException.class); + thrown.expectMessage("is not a valid project or module key"); + validator.validate(createProjectReactor("project/key")); + } @Test public void not_fail_with_alphanumeric_key() { diff --git a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java index a427b165afb..70a40d084b1 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java +++ b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java @@ -34,6 +34,8 @@ public final class ComponentKeys { * Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit */ private static final String VALID_MODULE_KEY_REGEXP = "[\\p{Alnum}\\-_.:]*[\\p{Alpha}\\-_.:]+[\\p{Alnum}\\-_.:]*"; + + private static final String VALID_MODULE_KEY_ISSUES_MODE_REGEXP = "[\\p{Alnum}\\-_.:/]*[\\p{Alpha}\\-_.:/]+[\\p{Alnum}\\-_.:/]*"; /* * Allowed characters are alphanumeric, '-', '_', '.' and '/' */ @@ -95,6 +97,13 @@ public final class ComponentKeys { } /** + * Same as {@link #isValidModuleKey(String)}, but allows additionally '/'. + */ + public static boolean isValidModuleKeyIssuesMode(String keyCandidate) { + return keyCandidate.matches(VALID_MODULE_KEY_ISSUES_MODE_REGEXP); + } + + /** * <p>Test if given parameter is valid for a branch. Valid format is:</p> * <ul> * <li>Allowed characters: diff --git a/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java b/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java index 85d64836846..b2eb18a9d4d 100644 --- a/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java +++ b/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java @@ -57,6 +57,16 @@ public class ComponentKeysTest { assertThat(ComponentKeys.isValidModuleKey("ab_12")).isTrue(); assertThat(ComponentKeys.isValidModuleKey("ab/12")).isFalse(); } + + @Test + public void isValidModuleKeyIssuesMode() { + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("")).isFalse(); + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("abc")).isTrue(); + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("0123")).isFalse(); + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab 12")).isFalse(); + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab_12")).isTrue(); + assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab/12")).isTrue(); + } @Test public void isValidBranchKey() { |