/*
* SonarQube Java
* Copyright (C) 2013-2016 SonarSource SA
* mailto:contact 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 com.sonar.it.java.suite;
import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.build.BuildResult;
import com.sonar.orchestrator.build.MavenBuild;
import com.sonar.orchestrator.build.SonarScanner;
import com.sonar.orchestrator.locator.MavenLocation;
import com.sonar.orchestrator.locator.MavenLocator;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueClient;
import org.sonar.wsclient.issue.IssueQuery;
import org.sonar.wsclient.services.Measure;
import org.sonar.wsclient.services.Resource;
import org.sonar.wsclient.services.ResourceQuery;
import java.io.File;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class JavaTest {
@ClassRule
public static Orchestrator orchestrator = JavaTestSuite.ORCHESTRATOR;
@Rule
public final TemporaryFolder tmp = new TemporaryFolder();
@Before
public void deleteData() {
orchestrator.resetData();
}
/**
* See SONAR-1865
*/
@Test
public void shouldAcceptFilenamesWithDollar() {
MavenBuild build = MavenBuild.create(TestUtils.projectPom("dollar-in-names"))
.setCleanPackageSonarGoals()
.setProperty("sonar.dynamicAnalysis", "false");
orchestrator.executeBuild(build);
Resource file = orchestrator.getServer().getWsClient()
.find(ResourceQuery.createForMetrics(JavaTestSuite.keyFor("org.sonar.it.core:dollar-in-names", "dollars/", "FilenameWith$Dollar.java"), "files"));
assertThat(file).isNotNull();
assertThat(file.getLongName()).contains("FilenameWith$Dollar");
}
/**
* Since 2.13 commented-out code lines not saved as measure for Java - see SONAR-3093
*/
@Test
public void shouldDetectCommentedOutCode() {
MavenBuild build = MavenBuild.create()
.setPom(TestUtils.projectPom("commented-out-java-code"))
.setCleanSonarGoals()
.setProperty("sonar.dynamicAnalysis", "false");
orchestrator.executeBuild(build);
Resource project = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics("com.sonarsource.it.samples:commented-out-java-code",
"commented_out_code_lines", "ncloc"));
assertThat(project.getMeasureIntValue("ncloc")).isEqualTo(7);
assertThat(project.getMeasureIntValue("commented_out_code_lines")).isNull();
}
/**
* SONARJAVA-444
*/
@Test
public void shouldFailIfInvalidJavaPackage() {
MavenBuild build = MavenBuild.create()
.setPom(TestUtils.projectPom("invalid-java-package"))
.setCleanSonarGoals();
BuildResult buildResult = orchestrator.executeBuildQuietly(build);
assertThat(buildResult.getStatus()).isEqualTo(0);
}
@Test
public void measures_on_directory() {
MavenBuild build = MavenBuild.create()
.setPom(TestUtils.projectPom("measures-on-directory"))
.setCleanPackageSonarGoals();
BuildResult result = orchestrator.executeBuildQuietly(build);
// since sonar-java 2.1 does not fail if multiple package in same directory.
assertThat(result.getStatus()).isEqualTo(0);
}
@Test
public void multiple_package_in_directory_should_not_fail() throws Exception {
MavenBuild inspection = MavenBuild.create()
.setPom(TestUtils.projectPom("multiple-packages-in-directory"))
.setCleanPackageSonarGoals();
BuildResult result = orchestrator.executeBuildQuietly(inspection);
assertThat(result.getStatus()).isEqualTo(0);
inspection = MavenBuild.create()
.setPom(TestUtils.projectPom("multiple-packages-in-directory"))
.setProperty("sonar.skipPackageDesign", "true")
.setGoals("sonar:sonar");
result = orchestrator.executeBuildQuietly(inspection);
assertThat(result.getStatus()).isEqualTo(0);
}
/**
* SONARJAVA-1615
*/
@Test
public void filtered_issues() throws Exception {
MavenBuild build = MavenBuild.create(TestUtils.projectPom("filtered-issues"))
.setCleanPackageSonarGoals()
.setProperty("sonar.profile", "filtered-issues");
orchestrator.executeBuild(build);
assertThat(getMeasure("org.example:example", "violations").getValue()).isEqualTo(2);
IssueClient issueClient = orchestrator.getServer().wsClient().issueClient();
List<Issue> issues = issueClient.find(IssueQuery.create().components("org.example:example:src/main/java/EclispeI18NFiltered.java")).list();
assertThat(issues).hasSize(2);
for (Issue issue : issues) {
assertThat(issue.ruleKey()).matches(value -> "squid:S1444".equals(value) || "squid:ClassVariableVisibilityCheck".equals(value));
assertThat(issue.line()).isEqualTo(17);
}
}
private static Measure getMeasure(String resourceKey, String metricKey) {
Resource resource = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics(resourceKey, metricKey));
return resource != null ? resource.getMeasure(metricKey) : null;
}
/**
* SONAR-4768
*/
@Test
public void support_jav_file_extension() {
SonarScanner scan = SonarScanner.create(TestUtils.projectDir("jav-file-extension"))
.setProperty("sonar.projectKey", "jav-file-extension")
.setProperty("sonar.projectName", "jav-file-extension")
.setProperty("sonar.projectVersion", "1.0-SNAPSHOT")
.setProperty("sonar.sources", "src");
orchestrator.executeBuild(scan);
Resource project = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics("jav-file-extension", "files", "ncloc"));
assertThat(project.getMeasureIntValue("files")).isEqualTo(1);
assertThat(project.getMeasureIntValue("ncloc")).isGreaterThan(0);
}
@Test
public void support_change_of_extension_property() {
SonarScanner scan = SonarScanner.create(TestUtils.projectDir("jav-file-extension"))
.setProperty("sonar.projectKey", "jav-file-extension")
.setProperty("sonar.projectName", "jav-file-extension")
.setProperty("sonar.projectVersion", "1.0-SNAPSHOT")
.setProperty("sonar.java.file.suffixes", ".txt,.foo")
.setProperty("sonar.sources", "src");
orchestrator.executeBuild(scan);
Resource project = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics("jav-file-extension", "files", "ncloc"));
assertThat(project.getMeasureIntValue("files")).isEqualTo(2);
assertThat(project.getMeasureIntValue("ncloc")).isGreaterThan(0);
}
@Test
public void should_execute_rule_on_test() throws Exception {
MavenLocation junit_4_11 = MavenLocation.of("junit", "junit", "4.11");
new MavenLocator(orchestrator.getConfiguration()).copyToDirectory(junit_4_11, tmp.getRoot());
MavenBuild build = MavenBuild.create()
.setPom(TestUtils.projectPom("java-inner-classes"))
.setProperty("sonar.profile", "ignored-test-check")
.setProperty("sonar.java.test.binaries", "target/test-classes")
.setProperty("sonar.java.test.libraries", new File(tmp.getRoot(), junit_4_11.getFilename()).getAbsolutePath())
.setCleanPackageSonarGoals();
orchestrator.executeBuild(build);
Resource project = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics("com.sonarsource.it.samples:java-inner-classes", "violations"));
assertThat(project.getMeasureIntValue("violations")).isEqualTo(1);
}
@Test
public void java_aware_visitor_rely_on_java_version() {
String sonarJavaSource = "sonar.java.source";
MavenBuild build = MavenBuild.create(TestUtils.projectPom("java-version-aware-visitor"))
.setCleanSonarGoals()
.setProperty("sonar.profile", "java-version-aware-visitor");
// no java version specified. maven scanner gets maven default version : java 5.
orchestrator.executeBuild(build);
assertThat(getMeasure("org.example:example", "violations").getValue()).isEqualTo(0);
// invalid java version. got issue on java 7 code
build.setProperty(sonarJavaSource, "jdk_1.6");
BuildResult buildResult = orchestrator.executeBuild(build);
// build should not fail
assertThat(buildResult.getStatus()).isEqualTo(0);
// build logs should contains warning related to sources
assertThat(buildResult.getLogs()).contains("Invalid java version");
assertThat(getMeasure("org.example:example", "violations").getValue()).isEqualTo(1);
// upper version. got issue on java 7 code
build.setProperty(sonarJavaSource, "1.8");
orchestrator.executeBuild(build);
assertThat(getMeasure("org.example:example", "violations").getValue()).isEqualTo(1);
// lower version. no issue on java 7 code
build.setProperty(sonarJavaSource, "1.6");
orchestrator.executeBuild(build);
assertThat(getMeasure("org.example:example", "violations").getValue()).isEqualTo(0);
SonarScanner scan = SonarScanner.create(TestUtils.projectDir("java-version-aware-visitor"))
.setProperty("sonar.projectKey", "org.example:example-scanner")
.setProperty("sonar.projectName", "example")
.setProperty("sonar.projectVersion", "1.0-SNAPSHOT")
.setProperty("sonar.profile", "java-version-aware-visitor")
.setProperty("sonar.sources", "src/main/java");
orchestrator.executeBuild(scan);
// no java version specified, got issue on java 7 code
assertThat(getMeasure("org.example:example-scanner", "violations").getValue()).isEqualTo(1);
}
}