if (shouldCopyServerIssues(component)) {
// raw issues should be empty, we just need to deal with server issues (SONAR-6931)
- copyServerIssues(serverIssues, trackedIssues);
+ copyServerIssues(serverIssues, trackedIssues, component.key());
} else {
SourceHashHolder sourceHashHolder = loadSourceHashes(component);
Tracking<TrackedIssue, ServerIssueFromWs> track = tracker.track(rawIssues, baseIssues);
- addUnmatchedFromServer(track.getUnmatchedBases(), trackedIssues);
+ addUnmatchedFromServer(track.getUnmatchedBases(), trackedIssues, component.key());
mergeMatched(track, trackedIssues, rIssues);
addUnmatchedFromReport(track.getUnmatchedRaws(), trackedIssues, analysisDate);
}
if (hasServerAnalysis && componentTree.getParent(component) == null) {
Preconditions.checkState(component instanceof InputModule, "Object without parent is of type: " + component.getClass());
// issues that relate to deleted components
- addIssuesOnDeletedComponents(trackedIssues);
+ addIssuesOnDeletedComponents(trackedIssues, component.key());
}
return trackedIssues;
return false;
}
- private void copyServerIssues(Collection<ServerIssueFromWs> serverIssues, List<TrackedIssue> trackedIssues) {
+ private void copyServerIssues(Collection<ServerIssueFromWs> serverIssues, List<TrackedIssue> trackedIssues, String componentKey) {
for (ServerIssueFromWs serverIssue : serverIssues) {
org.sonar.scanner.protocol.input.ScannerInput.ServerIssue unmatchedPreviousIssue = serverIssue.getDto();
- TrackedIssue unmatched = IssueTransformer.toTrackedIssue(unmatchedPreviousIssue);
+ TrackedIssue unmatched = IssueTransformer.toTrackedIssue(unmatchedPreviousIssue, componentKey);
ActiveRule activeRule = activeRules.find(unmatched.getRuleKey());
unmatched.setNew(false);
}
}
- private void addUnmatchedFromServer(Iterable<ServerIssueFromWs> unmatchedIssues, Collection<TrackedIssue> mergeTo) {
+ private void addUnmatchedFromServer(Iterable<ServerIssueFromWs> unmatchedIssues, Collection<TrackedIssue> mergeTo, String componentKey) {
for (ServerIssueFromWs unmatchedIssue : unmatchedIssues) {
org.sonar.scanner.protocol.input.ScannerInput.ServerIssue unmatchedPreviousIssue = unmatchedIssue.getDto();
- TrackedIssue unmatched = IssueTransformer.toTrackedIssue(unmatchedPreviousIssue);
+ TrackedIssue unmatched = IssueTransformer.toTrackedIssue(unmatchedPreviousIssue, componentKey);
updateUnmatchedIssue(unmatched);
mergeTo.add(unmatched);
}
}
}
- private void addIssuesOnDeletedComponents(Collection<TrackedIssue> issues) {
+ private void addIssuesOnDeletedComponents(Collection<TrackedIssue> issues, String componentKey) {
for (org.sonar.scanner.protocol.input.ScannerInput.ServerIssue previous : serverIssueRepository.issuesOnMissingComponents()) {
- TrackedIssue dead = IssueTransformer.toTrackedIssue(previous);
+ TrackedIssue dead = IssueTransformer.toTrackedIssue(previous, componentKey);
updateUnmatchedIssue(dead);
issues.add(dead);
}
import java.nio.file.Paths;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Date;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.assertj.core.api.Condition;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import org.sonar.api.CoreProperties;
import org.sonar.api.batch.fs.internal.FileMetadata;
import org.sonar.api.utils.log.LogTester;
import org.sonar.scanner.mediumtest.ScannerMediumTester;
import org.sonar.scanner.issue.tracking.TrackedIssue;
import org.sonar.scanner.mediumtest.TaskResult;
+import org.sonar.scanner.mediumtest.ScannerMediumTester.TaskBuilder;
import org.sonar.scanner.protocol.Constants.Severity;
import org.sonar.scanner.protocol.input.ScannerInput.ServerIssue;
import org.sonar.scanner.repository.FileData;
import static org.assertj.core.api.Assertions.assertThat;
+@RunWith(Parameterized.class)
public class ScanOnlyChangedTest {
- @org.junit.Rule
+ private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
+
+ /*
+ * Run with branch too to reproduce SONAR-9141 and SONAR-9160
+ */
+ @Parameters(name = "branch enabled:{0} projectKey: {1}")
+ public static Collection<Object[]> data() {
+ return Arrays.asList(new Object[][] {
+ {false, "sample"}, {true, "sample:branch"}, {false, "sample:project"}
+ });
+ }
+
+ @Parameter(0)
+ public boolean branch;
+
+ @Parameter(1)
+ public String projectKey;
+
+ @Rule
public TemporaryFolder temp = new TemporaryFolder();
- @org.junit.Rule
+ @Rule
public LogTester logTester = new LogTester();
- private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
-
private ScannerMediumTester tester;
- private static Long date(String date) {
- try {
- return sdf.parse(date).getTime();
- } catch (ParseException e) {
- throw new IllegalStateException(e);
- }
- }
-
@Before
public void prepare() throws IOException, URISyntaxException {
String filePath = "xources/hello/HelloJava.xoo";
Path path = Paths.get(Resources.getResource("mediumtest/xoo/sample/" + filePath).toURI());
- String hash = new FileMetadata()
+ String md5sum = new FileMetadata()
.readMetadata(Files.newInputStream(path), StandardCharsets.UTF_8, filePath)
.hash();
.addActiveRule("xoo", "OneIssueOnDirPerFile", null, "OneIssueOnDirPerFile", "MAJOR", null, "xoo")
.addActiveRule("xoo", "OneIssuePerModule", null, "OneIssuePerModule", "MAJOR", null, "xoo")
// this will cause the file to have status==SAME
- .addFileData("sample", filePath, new FileData(hash, null))
+ .addFileData(projectKey, filePath, new FileData(md5sum, null))
.setPreviousAnalysisDate(new Date())
// Existing issue that is copied
.mockServerIssue(ServerIssue.newBuilder().setKey("xyz")
- .setModuleKey("sample")
+ .setModuleKey(projectKey)
.setMsg("One issue per Line copied")
.setPath("xources/hello/HelloJava.xoo")
.setRuleRepository("xoo")
.build())
// Existing issue on project that is still detected
.mockServerIssue(ServerIssue.newBuilder().setKey("resolved-on-project")
- .setModuleKey("sample")
+ .setModuleKey(projectKey)
.setRuleRepository("xoo")
.setRuleKey("OneIssuePerModule")
.setSeverity(Severity.CRITICAL)
return projectDir;
}
- @Test
- public void testScanAll() throws Exception {
- File projectDir = copyProject("/mediumtest/xoo/sample");
-
- TaskResult result = tester
- .newScanTask(new File(projectDir, "sonar-project.properties"))
- .property("sonar.scanAllFiles", "true")
- .start();
-
- assertNumberIssues(result, 16, 2, 0);
-
- /*
- * 8 new per line
- */
- assertNumberIssuesOnFile(result, "HelloJava.xoo", 8);
- }
-
@Test
public void testScanOnlyChangedFiles() throws Exception {
File projectDir = copyProject("/mediumtest/xoo/sample");
- TaskResult result = tester
+ TaskBuilder taskBuilder = tester
.newScanTask(new File(projectDir, "sonar-project.properties"))
- .start();
+ .property("sonar.report.export.path", "report.json");
+ if (branch) {
+ taskBuilder.property("sonar.branch", "branch");
+ } else {
+ taskBuilder.property("sonar.projectKey", projectKey);
+ }
+ TaskResult result = taskBuilder.start();
/*
* We have:
* 6 new issues per line (open) in helloscala.xoo
assertNumberIssuesOnFile(result, "HelloJava.xoo", 1);
}
+ @Test
+ public void testScanAll() throws Exception {
+ File projectDir = copyProject("/mediumtest/xoo/sample");
+
+ TaskBuilder taskBuilder = tester
+ .newScanTask(new File(projectDir, "sonar-project.properties"))
+ .property("sonar.scanAllFiles", "true");
+ if (branch) {
+ taskBuilder.property("sonar.branch", "branch");
+ } else {
+ taskBuilder.property("sonar.projectKey", projectKey);
+ }
+
+ TaskResult result = taskBuilder.start();
+
+ assertNumberIssues(result, 16, 2, 0);
+
+ /*
+ * 8 new per line
+ */
+ assertNumberIssuesOnFile(result, "HelloJava.xoo", 8);
+ }
+
private static void assertNumberIssuesOnFile(TaskResult result, final String fileNameEndsWith, int issues) {
assertThat(result.trackedIssues()).haveExactly(issues, new Condition<TrackedIssue>() {
@Override
assertThat(openIssues).isEqualTo(expectedOpen);
assertThat(resolvedIssue).isEqualTo(expectedResolved);
}
+
+ private static Long date(String date) {
+ try {
+ return sdf.parse(date).getTime();
+ } catch (ParseException e) {
+ throw new IllegalStateException(e);
+ }
+ }
}