From: Duarte Meneses Date: Wed, 18 Apr 2018 11:22:47 +0000 (+0200) Subject: SONAR-10543 Add ITs X-Git-Tag: 7.5~1311 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ec13da45f7f3c3e228dafc0478ea52a2900129a5;p=sonarqube.git SONAR-10543 Add ITs --- diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/RulesService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/RulesService.java index 86375753153..298c5e136c1 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/RulesService.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/RulesService.java @@ -143,6 +143,7 @@ public class RulesService extends BaseService { .setParam("facets", request.getFacets() == null ? null : request.getFacets().stream().collect(Collectors.joining(","))) .setParam("inheritance", request.getInheritance() == null ? null : request.getInheritance().stream().collect(Collectors.joining(","))) .setParam("is_template", request.getIsTemplate()) + .setParam("is_external", request.getIsExternal()) .setParam("languages", request.getLanguages() == null ? null : request.getLanguages().stream().collect(Collectors.joining(","))) .setParam("organization", request.getOrganization()) .setParam("p", request.getP()) diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/SearchRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/SearchRequest.java index bb974145015..38d9d4dac01 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/SearchRequest.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/rules/SearchRequest.java @@ -39,6 +39,7 @@ public class SearchRequest { private List f; private List facets; private List inheritance; + private String isExternal; private String isTemplate; private List languages; private String organization; @@ -237,6 +238,24 @@ public class SearchRequest { public String getIsTemplate() { return isTemplate; } + + /** + * Possible values: + *
    + *
  • "true"
  • + *
  • "false"
  • + *
  • "yes"
  • + *
  • "no"
  • + *
+ */ + public SearchRequest setIsExternal(String isExternal) { + this.isExternal = isExternal; + return this; + } + + public String getIsExternal() { + return isExternal; + } /** * Example value: "java,js" diff --git a/tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java b/tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java new file mode 100644 index 00000000000..cfa467775a7 --- /dev/null +++ b/tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java @@ -0,0 +1,96 @@ +/* + * SonarQube + * Copyright (C) 2009-2018 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonarqube.tests.issue; + +import com.sonar.orchestrator.build.SonarScanner; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.sonarqube.qa.util.Tester; +import org.sonarqube.ws.Common.RuleScope; +import org.sonarqube.ws.Common.RuleType; +import org.sonarqube.ws.Common.Severity; +import org.sonarqube.ws.Issues.Issue; +import org.sonarqube.ws.client.issues.SearchRequest; +import util.ItUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ExternalIssueTest extends AbstractIssueTest { + private static final String PROJECT_KEY = "project"; + + @Rule + public Tester tester = new Tester(ORCHESTRATOR); + + @Before + public void setUp() { + ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); + ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/ExternalIssueTest/no-rules.xml")); + ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "no-rules"); + } + + @Test + public void should_import_external_issues_and_create_external_rules() { + noExternalRuleAndNoIssues(); + + SonarScanner sonarScanner = ItUtils.runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample", + "sonar.oneExternalIssuePerLine.activate", "true"); + List issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList(); + assertThat(issuesList).hasSize(17); + + assertThat(issuesList).allMatch(issue -> "external_xoo:OneExternalIssuePerLine".equals(issue.getRule())); + assertThat(issuesList).allMatch(issue -> "This issue is generated on each line".equals(issue.getMessage())); + assertThat(issuesList).allMatch(issue -> "This issue is generated on each line".equals(issue.getMessage())); + assertThat(issuesList).allMatch(issue -> Severity.MAJOR.equals(issue.getSeverity())); + assertThat(issuesList).allMatch(issue -> RuleType.CODE_SMELL.equals(issue.getType())); + assertThat(issuesList).allMatch(issue -> "sample:src/main/xoo/sample/Sample.xoo".equals(issue.getComponent())); + assertThat(issuesList).allMatch(issue -> "OPEN".equals(issue.getStatus())); + assertThat(issuesList).allMatch(issue -> Boolean.TRUE.equals(issue.getFromExternalRule())); + + List rulesList = tester.wsClient().rules() + .search(new org.sonarqube.ws.client.rules.SearchRequest().setIsExternal(Boolean.toString(true))).getRulesList(); + List externalRules = rulesList.stream().filter(rule -> rule.getIsExternal()).collect(Collectors.toList()); + + assertThat(externalRules).hasSize(1); + assertThat(externalRules.get(0).getKey()).isEqualTo("external_xoo:OneExternalIssuePerLine"); + assertThat(externalRules.get(0).getIsTemplate()).isFalse(); + assertThat(externalRules.get(0).getIsExternal()).isTrue(); + assertThat(externalRules.get(0).getTags().getTagsCount()).isEqualTo(0); + assertThat(externalRules.get(0).getScope()).isEqualTo(RuleScope.ALL); + + // second analysis, issue tracking should work + sonarScanner = ItUtils.runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample", + "sonar.oneExternalIssuePerLine.activate", "true"); + issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList(); + assertThat(issuesList).hasSize(17); + } + + private void noExternalRuleAndNoIssues() { + List rulesList = tester.wsClient().rules() + .search(new org.sonarqube.ws.client.rules.SearchRequest().setIsExternal(Boolean.toString(true))).getRulesList(); + assertThat(rulesList).noneMatch(rule -> rule.getIsExternal()); + + List issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList(); + assertThat(issuesList).isEmpty(); + } + +} diff --git a/tests/src/test/java/org/sonarqube/tests/issue/IssueSuite.java b/tests/src/test/java/org/sonarqube/tests/issue/IssueSuite.java index cc6a0097e41..8afe1a764ea 100644 --- a/tests/src/test/java/org/sonarqube/tests/issue/IssueSuite.java +++ b/tests/src/test/java/org/sonarqube/tests/issue/IssueSuite.java @@ -33,6 +33,7 @@ import static util.ItUtils.xooPlugin; AutoAssignTest.class, CommonRulesTest.class, CustomRulesTest.class, + ExternalIssueTest.class, IssueActionTest.class, IssueBulkChangeTest.class, IssueChangelogTest.class, diff --git a/tests/src/test/java/util/ItUtils.java b/tests/src/test/java/util/ItUtils.java index 13f268a4697..189eb59a048 100644 --- a/tests/src/test/java/util/ItUtils.java +++ b/tests/src/test/java/util/ItUtils.java @@ -27,7 +27,7 @@ import com.google.gson.reflect.TypeToken; import com.sonar.orchestrator.Orchestrator; import com.sonar.orchestrator.OrchestratorBuilder; import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarRunner; +import com.sonar.orchestrator.build.SonarScanner; import com.sonar.orchestrator.container.Server; import com.sonar.orchestrator.locator.FileLocation; import java.io.File; @@ -253,21 +253,21 @@ public class ItUtils { assertThat(countExisting).isEqualTo(existingIssues); } - public static SonarRunner runVerboseProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { + public static SonarScanner runVerboseProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { return runProjectAnalysis(orchestrator, projectRelativePath, true, properties); } - public static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { + public static SonarScanner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { return runProjectAnalysis(orchestrator, projectRelativePath, false, properties); } - private static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, boolean enableDebugLogs, String... properties) { - SonarRunner sonarRunner = SonarRunner.create(projectDir(projectRelativePath)); + private static SonarScanner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, boolean enableDebugLogs, String... properties) { + SonarScanner sonarScanner = SonarScanner.create(projectDir(projectRelativePath)); ImmutableMap.Builder builder = ImmutableMap.builder(); for (int i = 0; i < properties.length; i += 2) { builder.put(properties[i], properties[i + 1]); } - SonarRunner scan = sonarRunner.setDebugLogs(enableDebugLogs).setProperties(builder.build()); + SonarScanner scan = sonarScanner.setDebugLogs(enableDebugLogs).setProperties(builder.build()); orchestrator.executeBuild(scan); return scan; } diff --git a/tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml b/tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml new file mode 100644 index 00000000000..5fca1542ffe --- /dev/null +++ b/tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml @@ -0,0 +1,6 @@ + + no-rules + xoo + + +