123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*
- * SonarQube
- * Copyright (C) 2009-2019 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.sonar.ce.task.projectanalysis.issue;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Optional;
- import org.junit.Before;
- import org.junit.Test;
- import org.sonar.api.rule.RuleKey;
- import org.sonar.ce.task.projectanalysis.component.Component;
- import org.sonar.ce.task.projectanalysis.source.NewLinesRepository;
- import org.sonar.core.issue.DefaultIssue;
- import org.sonar.core.issue.tracking.BlockHashSequence;
- import org.sonar.core.issue.tracking.Input;
- import org.sonar.core.issue.tracking.LineHashSequence;
- import org.sonar.core.issue.tracking.Tracker;
- import org.sonar.core.issue.tracking.Tracking;
- import org.sonar.db.protobuf.DbCommons;
- import org.sonar.db.protobuf.DbIssues;
- import org.sonar.db.rule.RuleTesting;
-
- import static org.assertj.core.api.Assertions.assertThat;
- import static org.mockito.Mockito.mock;
- import static org.mockito.Mockito.when;
- import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
-
- public class PullRequestTrackerExecutionTest {
- private static final String FILE_UUID = "FILE_UUID";
- private static final String FILE_KEY = "FILE_KEY";
- private static final int FILE_REF = 2;
-
- private static final Component FILE = builder(Component.Type.FILE, FILE_REF)
- .setKey(FILE_KEY)
- .setUuid(FILE_UUID)
- .build();
-
- private TrackerRawInputFactory rawFactory = mock(TrackerRawInputFactory.class);
- private TrackerBaseInputFactory baseFactory = mock(TrackerBaseInputFactory.class);
- private NewLinesRepository newLinesRepository = mock(NewLinesRepository.class);
-
- private PullRequestTrackerExecution underTest;
-
- private List<DefaultIssue> rawIssues = new ArrayList<>();
- private List<DefaultIssue> baseIssues = new ArrayList<>();
-
- @Before
- public void setUp() {
- when(rawFactory.create(FILE)).thenReturn(createInput(rawIssues));
- when(baseFactory.create(FILE)).thenReturn(createInput(baseIssues));
-
- Tracker<DefaultIssue, DefaultIssue> tracker = new Tracker<>();
- underTest = new PullRequestTrackerExecution(baseFactory, rawFactory, tracker, newLinesRepository);
- }
-
- @Test
- public void simple_tracking_keep_only_issues_having_location_on_changed_lines() {
- final DefaultIssue issue1 = createIssue(2, RuleTesting.XOO_X1);
- issue1.setLocations(DbIssues.Locations.newBuilder()
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3)).build());
- rawIssues.add(issue1);
- final DefaultIssue issue2 = createIssue(2, RuleTesting.XOO_X1);
- issue2.setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2)).build());
- rawIssues.add(issue2);
-
- when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(1, 3))));
-
- Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
-
- assertThat(tracking.getUnmatchedBases()).isEmpty();
- assertThat(tracking.getMatchedRaws()).isEmpty();
- assertThat(tracking.getUnmatchedRaws()).containsOnly(issue1);
- }
-
- @Test
- public void simple_tracking_keep_also_issues_having_secondary_locations_on_changed_lines() {
- final DefaultIssue issueWithSecondaryLocationOnAChangedLine = createIssue(2, RuleTesting.XOO_X1);
- issueWithSecondaryLocationOnAChangedLine.setLocations(DbIssues.Locations.newBuilder()
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3))
- .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
- .setComponentId(FILE.getUuid())
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(6).setEndLine(8)).build()).build())
- .build());
- rawIssues.add(issueWithSecondaryLocationOnAChangedLine);
- final DefaultIssue issueWithNoLocationsOnChangedLines = createIssue(2, RuleTesting.XOO_X1);
- issueWithNoLocationsOnChangedLines.setLocations(DbIssues.Locations.newBuilder()
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2))
- .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
- .setComponentId(FILE.getUuid())
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(11).setEndLine(12)).build()).build())
- .build());
- rawIssues.add(issueWithNoLocationsOnChangedLines);
- final DefaultIssue issueWithALocationOnADifferentFile = createIssue(2, RuleTesting.XOO_X1);
- issueWithALocationOnADifferentFile.setLocations(DbIssues.Locations.newBuilder()
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3))
- .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
- .setComponentId("anotherUuid")
- .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(6).setEndLine(8)).build()).build())
- .build());
- rawIssues.add(issueWithALocationOnADifferentFile);
-
- when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(7, 10))));
-
- Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
-
- assertThat(tracking.getUnmatchedBases()).isEmpty();
- assertThat(tracking.getMatchedRaws()).isEmpty();
- assertThat(tracking.getUnmatchedRaws()).containsOnly(issueWithSecondaryLocationOnAChangedLine);
- }
-
- @Test
- public void track_and_ignore_issues_from_previous_analysis() {
- when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(1, 2, 3))));
-
- rawIssues.add(createIssue(1, RuleTesting.XOO_X1)
- .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(1).setEndLine(1)).build()));
- rawIssues.add(createIssue(2, RuleTesting.XOO_X2)
- .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2)).build()));
- rawIssues.add(createIssue(3, RuleTesting.XOO_X3)
- .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(3).setEndLine(3)).build()));
-
- baseIssues.add(rawIssues.get(0));
-
- Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
- assertThat(tracking.getMatchedRaws()).isEqualTo(Collections.singletonMap(rawIssues.get(0), rawIssues.get(0)));
- assertThat(tracking.getUnmatchedRaws()).containsOnly(rawIssues.get(2));
- }
-
- private DefaultIssue createIssue(int line, RuleKey ruleKey) {
- return new DefaultIssue()
- .setRuleKey(ruleKey)
- .setLine(line)
- .setMessage("msg" + line);
- }
-
- private Input<DefaultIssue> createInput(Collection<DefaultIssue> issues) {
- return new Input<DefaultIssue>() {
- @Override
- public LineHashSequence getLineHashSequence() {
- return LineHashSequence.createForLines(Arrays.asList("line1", "line2", "line3"));
- }
-
- @Override
- public BlockHashSequence getBlockHashSequence() {
- return BlockHashSequence.create(getLineHashSequence());
- }
-
- @Override
- public Collection<DefaultIssue> getIssues() {
- return issues;
- }
- };
- }
- }
|