/*
* 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.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.wsclient.services.Resource;
import org.sonar.wsclient.services.ResourceQuery;
import java.io.File;
import static org.assertj.core.api.Assertions.assertThat;
/**
* SONARJAVA-160
*/
public class JavaClasspathTest {
private static final String PROJECT_KEY_DIT = "org.example:dit-check";
private static final String PROJECT_KEY_AAR = "org.example:using-aar-dep";
@ClassRule
public static final Orchestrator ORCHESTRATOR = JavaTestSuite.ORCHESTRATOR;
@Rule
public final TemporaryFolder tmp = new TemporaryFolder();
private String guavaJarPath;
private String aarPath;
private String fakeGuavaJarPath;
@BeforeClass
public static void setUp() {
buildDitProject();
}
@Before
public void copyGuavaJar() {
MavenLocation guava = MavenLocation.of("com.google.guava", "guava", "10.0.1");
File subFolder = new File(tmp.getRoot(), "subFolder");
File subSubFolder = new File(subFolder, "subSubFolder");
new MavenLocator(ORCHESTRATOR.getConfiguration()).copyToDirectory(guava, subSubFolder);
aarPath = new File(new File(TestUtils.projectDir("using-aar-dep"), "lib"), "cache-1.3.0.aar").getAbsolutePath();
guavaJarPath = new File(subSubFolder.getAbsolutePath(), guava.getFilename()).getAbsolutePath();
fakeGuavaJarPath = new File(new File(TestUtils.projectDir("dit-check"), "lib"), "fake-guava-1.0.jar").getAbsolutePath();
}
@Before
public void deleteData() {
ORCHESTRATOR.resetData();
}
@Test
public void should_use_new_java_binaries_property() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/classes");
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(1);
}
@Test
public void invalid_binaries_dir_should_fail_analysis() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/dummy__Dir");
BuildResult buildResult = ORCHESTRATOR.executeBuildQuietly(scanner);
assertThat(buildResult.getStatus()).isNotEqualTo(0);
assertThat(buildResult.getLogs()).contains("No files nor directories matching 'target/dummy__Dir'");
}
@Test
public void relative_path_and_wildcard_for_binaries_should_be_supported() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/../target/clas**, ");
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(1);
}
@Test
public void should_use_aar_library() {
SonarScanner scanner = aarProjectSonarScanner();
scanner.setProperty("sonar.java.libraries", aarPath);
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_AAR)).isEqualTo(1);
}
@Test
public void should_use_new_java_libraries_property() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/classes");
scanner.setProperty("sonar.java.libraries", guavaJarPath);
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(2);
}
@Test
public void should_keep_order_libs() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/classes");
scanner.setProperty("sonar.java.libraries", guavaJarPath + "," + fakeGuavaJarPath);
scanner.setProperty("sonar.verbose", "true");
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(2);
ORCHESTRATOR.resetData();
scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.binaries", "target/classes");
scanner.setProperty("sonar.java.libraries", fakeGuavaJarPath + "," + guavaJarPath);
scanner.setProperty("sonar.verbose", "true");
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(1);
}
@Test
public void should_support_the_old_binaries_and_libraries_properties() {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.binaries", "target/classes");
scanner.setProperty("sonar.libraries", guavaJarPath);
BuildResult buildResult = ORCHESTRATOR.executeBuildQuietly(scanner);
assertThat(buildResult.getLogs()).contains("sonar.binaries and sonar.libraries are not supported since version 4.0 of sonar-java-plugin," +
" please use sonar.java.binaries and sonar.java.libraries instead");
assertThat(buildResult.isSuccess()).isFalse();
}
@Test
public void should_not_log_warnings_if_properties_not_set() {
SonarScanner scanner = ditProjectSonarScanner();
String logs = ORCHESTRATOR.executeBuild(scanner).getLogs();
assertThat(logs).doesNotContain("sonar.binaries and sonar.libraries are not supported since version 4.0 of sonar-java-plugin," +
" please use sonar.java.binaries and sonar.java.libraries instead");
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(0);
}
@Test
public void directory_of_classes_in_library_should_be_supported() throws Exception {
SonarScanner scanner = ditProjectSonarScanner();
scanner.setProperty("sonar.java.libraries", "target/classes");
ORCHESTRATOR.executeBuild(scanner);
assertThat(getNumberOfViolations(PROJECT_KEY_DIT)).isEqualTo(1);
}
private static void buildDitProject() {
mavenOnDitProject("clean package");
}
private static void mavenOnDitProject(String goal) {
MavenBuild build = MavenBuild.create(TestUtils.projectPom("dit-check"))
.setGoals(goal)
.setProperty("sonar.profile", "dit-check")
.setProperty("sonar.dynamicAnalysis", "false");
ORCHESTRATOR.executeBuild(build);
}
private static SonarScanner aarProjectSonarScanner() {
return SonarScanner.create(TestUtils.projectDir("using-aar-dep"))
.setProperty("sonar.projectKey", PROJECT_KEY_AAR)
.setProperty("sonar.projectName", "using-aar-dep")
.setProperty("sonar.projectVersion", "1.0-SNAPSHOT")
.setProperty("sonar.profile", "using-aar-dep")
.setProperty("sonar.sources", "src/main/java");
}
private static SonarScanner ditProjectSonarScanner() {
return SonarScanner.create(TestUtils.projectDir("dit-check"))
.setProperty("sonar.projectKey", PROJECT_KEY_DIT)
.setProperty("sonar.projectName", "dit-check")
.setProperty("sonar.projectVersion", "1.0-SNAPSHOT")
.setProperty("sonar.profile", "dit-check")
.setProperty("sonar.sources", "src/main/java");
}
private int getNumberOfViolations(String projectKey) {
Resource resource = ORCHESTRATOR.getServer().getWsClient().find(ResourceQuery.createForMetrics(projectKey, "violations"));
return resource != null ? resource.getMeasure("violations").getValue().intValue() : -1;
}
}