Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

PullRequestTrackerExecutionTest.java 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.ce.task.projectanalysis.issue;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.Collection;
  24. import java.util.Collections;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Optional;
  28. import org.junit.Before;
  29. import org.junit.Test;
  30. import org.sonar.api.rule.RuleKey;
  31. import org.sonar.ce.task.projectanalysis.component.Component;
  32. import org.sonar.ce.task.projectanalysis.source.NewLinesRepository;
  33. import org.sonar.core.issue.DefaultIssue;
  34. import org.sonar.core.issue.tracking.BlockHashSequence;
  35. import org.sonar.core.issue.tracking.Input;
  36. import org.sonar.core.issue.tracking.LineHashSequence;
  37. import org.sonar.core.issue.tracking.Tracker;
  38. import org.sonar.core.issue.tracking.Tracking;
  39. import org.sonar.db.protobuf.DbCommons;
  40. import org.sonar.db.protobuf.DbIssues;
  41. import org.sonar.db.rule.RuleTesting;
  42. import static org.assertj.core.api.Assertions.assertThat;
  43. import static org.mockito.Mockito.mock;
  44. import static org.mockito.Mockito.when;
  45. import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
  46. public class PullRequestTrackerExecutionTest {
  47. private static final String FILE_UUID = "FILE_UUID";
  48. private static final String FILE_KEY = "FILE_KEY";
  49. private static final int FILE_REF = 2;
  50. private static final Component FILE = builder(Component.Type.FILE, FILE_REF)
  51. .setKey(FILE_KEY)
  52. .setUuid(FILE_UUID)
  53. .build();
  54. private TrackerRawInputFactory rawFactory = mock(TrackerRawInputFactory.class);
  55. private TrackerBaseInputFactory baseFactory = mock(TrackerBaseInputFactory.class);
  56. private NewLinesRepository newLinesRepository = mock(NewLinesRepository.class);
  57. private PullRequestTrackerExecution underTest;
  58. private List<DefaultIssue> rawIssues = new ArrayList<>();
  59. private List<DefaultIssue> baseIssues = new ArrayList<>();
  60. @Before
  61. public void setUp() {
  62. when(rawFactory.create(FILE)).thenReturn(createInput(rawIssues));
  63. when(baseFactory.create(FILE)).thenReturn(createInput(baseIssues));
  64. Tracker<DefaultIssue, DefaultIssue> tracker = new Tracker<>();
  65. underTest = new PullRequestTrackerExecution(baseFactory, rawFactory, tracker, newLinesRepository);
  66. }
  67. @Test
  68. public void simple_tracking_keep_only_issues_having_location_on_changed_lines() {
  69. final DefaultIssue issue1 = createIssue(2, RuleTesting.XOO_X1);
  70. issue1.setLocations(DbIssues.Locations.newBuilder()
  71. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3)).build());
  72. rawIssues.add(issue1);
  73. final DefaultIssue issue2 = createIssue(2, RuleTesting.XOO_X1);
  74. issue2.setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2)).build());
  75. rawIssues.add(issue2);
  76. when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(1, 3))));
  77. Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
  78. assertThat(tracking.getUnmatchedBases()).isEmpty();
  79. assertThat(tracking.getMatchedRaws()).isEmpty();
  80. assertThat(tracking.getUnmatchedRaws()).containsOnly(issue1);
  81. }
  82. @Test
  83. public void simple_tracking_keep_also_issues_having_secondary_locations_on_changed_lines() {
  84. final DefaultIssue issueWithSecondaryLocationOnAChangedLine = createIssue(2, RuleTesting.XOO_X1);
  85. issueWithSecondaryLocationOnAChangedLine.setLocations(DbIssues.Locations.newBuilder()
  86. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3))
  87. .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
  88. .setComponentId(FILE.getUuid())
  89. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(6).setEndLine(8)).build()).build())
  90. .build());
  91. rawIssues.add(issueWithSecondaryLocationOnAChangedLine);
  92. final DefaultIssue issueWithNoLocationsOnChangedLines = createIssue(2, RuleTesting.XOO_X1);
  93. issueWithNoLocationsOnChangedLines.setLocations(DbIssues.Locations.newBuilder()
  94. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2))
  95. .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
  96. .setComponentId(FILE.getUuid())
  97. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(11).setEndLine(12)).build()).build())
  98. .build());
  99. rawIssues.add(issueWithNoLocationsOnChangedLines);
  100. final DefaultIssue issueWithALocationOnADifferentFile = createIssue(2, RuleTesting.XOO_X1);
  101. issueWithALocationOnADifferentFile.setLocations(DbIssues.Locations.newBuilder()
  102. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(3))
  103. .addFlow(DbIssues.Flow.newBuilder().addLocation(DbIssues.Location.newBuilder()
  104. .setComponentId("anotherUuid")
  105. .setTextRange(DbCommons.TextRange.newBuilder().setStartLine(6).setEndLine(8)).build()).build())
  106. .build());
  107. rawIssues.add(issueWithALocationOnADifferentFile);
  108. when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(7, 10))));
  109. Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
  110. assertThat(tracking.getUnmatchedBases()).isEmpty();
  111. assertThat(tracking.getMatchedRaws()).isEmpty();
  112. assertThat(tracking.getUnmatchedRaws()).containsOnly(issueWithSecondaryLocationOnAChangedLine);
  113. }
  114. @Test
  115. public void track_and_ignore_issues_from_previous_analysis() {
  116. when(newLinesRepository.getNewLines(FILE)).thenReturn(Optional.of(new HashSet<>(Arrays.asList(1, 2, 3))));
  117. rawIssues.add(createIssue(1, RuleTesting.XOO_X1)
  118. .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(1).setEndLine(1)).build()));
  119. rawIssues.add(createIssue(2, RuleTesting.XOO_X2)
  120. .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(2).setEndLine(2)).build()));
  121. rawIssues.add(createIssue(3, RuleTesting.XOO_X3)
  122. .setLocations(DbIssues.Locations.newBuilder().setTextRange(DbCommons.TextRange.newBuilder().setStartLine(3).setEndLine(3)).build()));
  123. baseIssues.add(rawIssues.get(0));
  124. Tracking<DefaultIssue, DefaultIssue> tracking = underTest.track(FILE);
  125. assertThat(tracking.getMatchedRaws()).isEqualTo(Collections.singletonMap(rawIssues.get(0), rawIssues.get(0)));
  126. assertThat(tracking.getUnmatchedRaws()).containsOnly(rawIssues.get(2));
  127. }
  128. private DefaultIssue createIssue(int line, RuleKey ruleKey) {
  129. return new DefaultIssue()
  130. .setRuleKey(ruleKey)
  131. .setLine(line)
  132. .setMessage("msg" + line);
  133. }
  134. private Input<DefaultIssue> createInput(Collection<DefaultIssue> issues) {
  135. return new Input<DefaultIssue>() {
  136. @Override
  137. public LineHashSequence getLineHashSequence() {
  138. return LineHashSequence.createForLines(Arrays.asList("line1", "line2", "line3"));
  139. }
  140. @Override
  141. public BlockHashSequence getBlockHashSequence() {
  142. return BlockHashSequence.create(getLineHashSequence());
  143. }
  144. @Override
  145. public Collection<DefaultIssue> getIssues() {
  146. return issues;
  147. }
  148. };
  149. }
  150. }