diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2021-03-11 17:04:42 -0600 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2021-03-17 20:08:34 +0000 |
commit | 398550aef256c12cd680795699890038af2dbf8d (patch) | |
tree | a0043bb86c3a3bfcf9357e8d5dbdb3ac68fd5859 /sonar-scanner-engine/src/test/java | |
parent | 4e76eae61a9cc708dde1e71d1895dfbb810f63ce (diff) | |
download | sonarqube-398550aef256c12cd680795699890038af2dbf8d.tar.gz sonarqube-398550aef256c12cd680795699890038af2dbf8d.zip |
SONAR-14192 Deprecating rule keys may break users' exclusion settings
Diffstat (limited to 'sonar-scanner-engine/src/test/java')
7 files changed, 118 insertions, 62 deletions
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java index 5391760024d..c28628d5b51 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java @@ -20,6 +20,7 @@ package org.sonar.scanner.issue.ignore; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import java.io.IOException; import org.junit.Before; import org.junit.Rule; @@ -27,6 +28,8 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.fs.InputComponent; import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import org.sonar.api.batch.rule.internal.DefaultActiveRules; +import org.sonar.api.batch.rule.internal.NewActiveRule; import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.IssueFilterChain; @@ -34,10 +37,11 @@ import org.sonar.scanner.issue.DefaultFilterableIssue; import org.sonar.scanner.issue.ignore.pattern.IssueInclusionPatternInitializer; import org.sonar.scanner.issue.ignore.pattern.IssuePattern; +import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class EnforceIssuesFilterTest { @@ -45,59 +49,74 @@ public class EnforceIssuesFilterTest { @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); - private IssueInclusionPatternInitializer exclusionPatternInitializer; + private final IssueInclusionPatternInitializer exclusionPatternInitializer = mock(IssueInclusionPatternInitializer.class); + private final DefaultFilterableIssue issue = mock(DefaultFilterableIssue.class); + private final IssueFilterChain chain = mock(IssueFilterChain.class); + private final AnalysisWarnings analysisWarnings = mock(AnalysisWarnings.class); private EnforceIssuesFilter ignoreFilter; - private DefaultFilterableIssue issue; - private IssueFilterChain chain; @Before public void init() { - exclusionPatternInitializer = mock(IssueInclusionPatternInitializer.class); - issue = mock(DefaultFilterableIssue.class); - chain = mock(IssueFilterChain.class); when(chain.accept(issue)).thenReturn(true); } @Test public void shouldPassToChainIfNoConfiguredPatterns() { - ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, mock(AnalysisWarnings.class)); + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); assertThat(ignoreFilter.accept(issue, chain)).isTrue(); verify(chain).accept(issue); } @Test public void shouldPassToChainIfRuleDoesNotMatch() { - String rule = "rule"; - RuleKey ruleKey = mock(RuleKey.class); - when(ruleKey.toString()).thenReturn(rule); + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); + RuleKey ruleKey = RuleKey.of("repo", "rule"); when(issue.ruleKey()).thenReturn(ruleKey); - IssuePattern matching = mock(IssuePattern.class); - when(matching.matchRule(ruleKey)).thenReturn(false); + IssuePattern matching = new IssuePattern("**", "unknown"); when(exclusionPatternInitializer.getMulticriteriaPatterns()).thenReturn(ImmutableList.of(matching)); - ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, mock(AnalysisWarnings.class)); + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); assertThat(ignoreFilter.accept(issue, chain)).isTrue(); verify(chain).accept(issue); } @Test public void shouldAcceptIssueIfFullyMatched() { - String rule = "rule"; + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); String path = "org/sonar/api/Issue.java"; - RuleKey ruleKey = mock(RuleKey.class); - when(ruleKey.toString()).thenReturn(rule); + RuleKey ruleKey = RuleKey.of("repo", "rule"); when(issue.ruleKey()).thenReturn(ruleKey); - IssuePattern matching = mock(IssuePattern.class); - when(matching.matchRule(ruleKey)).thenReturn(true); - when(matching.matchFile(path)).thenReturn(true); + IssuePattern matching = new IssuePattern(path, ruleKey.toString()); when(exclusionPatternInitializer.getMulticriteriaPatterns()).thenReturn(ImmutableList.of(matching)); when(issue.getComponent()).thenReturn(createComponentWithPath(path)); - ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, mock(AnalysisWarnings.class)); + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); assertThat(ignoreFilter.accept(issue, chain)).isTrue(); - verifyZeroInteractions(chain); + verifyNoInteractions(chain); + } + + @Test + public void shouldAcceptIssueIfMatchesDeprecatedRuleKey() { + RuleKey ruleKey = RuleKey.of("repo", "rule"); + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of(new NewActiveRule.Builder() + .setRuleKey(ruleKey) + .setDeprecatedKeys(singleton(RuleKey.of("repo2", "deprecated"))) + .build())); + String path = "org/sonar/api/Issue.java"; + when(issue.ruleKey()).thenReturn(ruleKey); + + IssuePattern matching = new IssuePattern("org/**", "repo2:deprecated"); + when(exclusionPatternInitializer.getMulticriteriaPatterns()).thenReturn(ImmutableList.of(matching)); + when(issue.getComponent()).thenReturn(createComponentWithPath(path)); + + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); + assertThat(ignoreFilter.accept(issue, chain)).isTrue(); + verify(analysisWarnings) + .addUnique("The issue multicriteria pattern 'repo2:deprecated' matches a rule key that has been changed. The pattern should be updated to 'repo:rule'"); + verifyNoInteractions(chain); } private InputComponent createComponentWithPath(String path) { @@ -106,42 +125,35 @@ public class EnforceIssuesFilterTest { @Test public void shouldRefuseIssueIfRuleMatchesButNotPath() { - String rule = "rule"; + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); String path = "org/sonar/api/Issue.java"; String componentKey = "org.sonar.api.Issue"; - RuleKey ruleKey = mock(RuleKey.class); - when(ruleKey.toString()).thenReturn(rule); + RuleKey ruleKey = RuleKey.of("repo", "rule"); when(issue.ruleKey()).thenReturn(ruleKey); when(issue.componentKey()).thenReturn(componentKey); - IssuePattern matching = mock(IssuePattern.class); - when(matching.matchRule(ruleKey)).thenReturn(true); - when(matching.matchFile(path)).thenReturn(false); + IssuePattern matching = new IssuePattern("no match", "repo:rule"); when(exclusionPatternInitializer.getMulticriteriaPatterns()).thenReturn(ImmutableList.of(matching)); when(issue.getComponent()).thenReturn(createComponentWithPath(path)); - ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, mock(AnalysisWarnings.class)); + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); assertThat(ignoreFilter.accept(issue, chain)).isFalse(); - verifyZeroInteractions(chain); + verifyNoInteractions(chain, analysisWarnings); } @Test public void shouldRefuseIssueIfRuleMatchesAndNotFile() throws IOException { - String rule = "rule"; + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); String path = "org/sonar/api/Issue.java"; - String componentKey = "org.sonar.api.Issue"; - RuleKey ruleKey = mock(RuleKey.class); - when(ruleKey.toString()).thenReturn(rule); + RuleKey ruleKey = RuleKey.of("repo", "key"); when(issue.ruleKey()).thenReturn(ruleKey); - IssuePattern matching = mock(IssuePattern.class); - when(matching.matchRule(ruleKey)).thenReturn(true); - when(matching.matchFile(path)).thenReturn(true); + IssuePattern matching = new IssuePattern(path, ruleKey.toString()); when(exclusionPatternInitializer.getMulticriteriaPatterns()).thenReturn(ImmutableList.of(matching)); when(issue.getComponent()).thenReturn(TestInputFileBuilder.newDefaultInputProject("foo", tempFolder.newFolder())); - ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, mock(AnalysisWarnings.class)); + ignoreFilter = new EnforceIssuesFilter(exclusionPatternInitializer, analysisWarnings, activeRules); assertThat(ignoreFilter.accept(issue, chain)).isFalse(); - verifyZeroInteractions(chain); + verifyNoInteractions(chain, analysisWarnings); } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java index 3e10340146f..1db66e55f5d 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java @@ -19,27 +19,38 @@ */ package org.sonar.scanner.issue.ignore; +import com.google.common.collect.ImmutableSet; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.sonar.api.batch.fs.internal.DefaultInputFile; +import org.sonar.api.batch.rule.internal.DefaultActiveRules; +import org.sonar.api.batch.rule.internal.NewActiveRule; +import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.api.utils.WildcardPattern; -import org.sonar.api.batch.fs.internal.DefaultInputFile; +import org.sonar.api.utils.log.LogTester; import org.sonar.scanner.issue.DefaultFilterableIssue; +import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class IgnoreIssuesFilterTest { + @Rule + public LogTester logTester = new LogTester(); + + private final DefaultFilterableIssue issue = mock(DefaultFilterableIssue.class); + private final IssueFilterChain chain = mock(IssueFilterChain.class); + private final AnalysisWarnings analysisWarnings = mock(AnalysisWarnings.class); + private final RuleKey ruleKey = RuleKey.of("foo", "bar"); - private DefaultFilterableIssue issue = mock(DefaultFilterableIssue.class); - private IssueFilterChain chain = mock(IssueFilterChain.class); - private IgnoreIssuesFilter underTest = new IgnoreIssuesFilter(); private DefaultInputFile component; - private RuleKey ruleKey = RuleKey.of("foo", "bar"); @Before public void prepare() { @@ -50,6 +61,9 @@ public class IgnoreIssuesFilterTest { @Test public void shouldPassToChainIfMatcherHasNoPatternForIssue() { + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); + IgnoreIssuesFilter underTest = new IgnoreIssuesFilter(activeRules, analysisWarnings); + when(chain.accept(issue)).thenReturn(true); assertThat(underTest.accept(issue, chain)).isTrue(); verify(chain).accept(any()); @@ -57,15 +71,39 @@ public class IgnoreIssuesFilterTest { @Test public void shouldRejectIfRulePatternMatches() { + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); + IgnoreIssuesFilter underTest = new IgnoreIssuesFilter(activeRules, analysisWarnings); + WildcardPattern pattern = mock(WildcardPattern.class); when(pattern.match(ruleKey.toString())).thenReturn(true); underTest.addRuleExclusionPatternForComponent(component, pattern); assertThat(underTest.accept(issue, chain)).isFalse(); + verifyNoInteractions(analysisWarnings); + } + + @Test + public void shouldRejectIfRulePatternMatchesDeprecatedRule() { + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of(new NewActiveRule.Builder() + .setRuleKey(ruleKey) + .setDeprecatedKeys(singleton(RuleKey.of("repo", "rule"))) + .build())); + IgnoreIssuesFilter underTest = new IgnoreIssuesFilter(activeRules, analysisWarnings); + + WildcardPattern pattern = WildcardPattern.create("repo:rule"); + underTest.addRuleExclusionPatternForComponent(component, pattern); + assertThat(underTest.accept(issue, chain)).isFalse(); + + verify(analysisWarnings).addUnique("The issue multicriteria pattern 'repo:rule' matches a rule key that has been changed. The pattern should be updated to 'foo:bar'"); + assertThat(logTester.logs()) + .contains("The issue multicriteria pattern 'repo:rule' matches a rule key that has been changed. The pattern should be updated to 'foo:bar'"); } @Test public void shouldAcceptIfRulePatternDoesNotMatch() { + DefaultActiveRules activeRules = new DefaultActiveRules(ImmutableSet.of()); + IgnoreIssuesFilter underTest = new IgnoreIssuesFilter(activeRules, analysisWarnings); + WildcardPattern pattern = mock(WildcardPattern.class); when(pattern.match(ruleKey.toString())).thenReturn(false); underTest.addRuleExclusionPatternForComponent(component, pattern); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssuePatternTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssuePatternTest.java index c9cd8be9833..7e9e3bcab41 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssuePatternTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssuePatternTest.java @@ -57,4 +57,9 @@ public class IssuePatternTest { assertThat(new IssuePattern("*", "*:Foo*IllegalRegexp").matchRule(rule)).isFalse(); } + @Test + public void toString_should_include_all_fields() { + assertThat(new IssuePattern("*", "*:Foo*IllegalRegexp").toString()).isEqualTo("IssuePattern{filePattern=*, rulePattern=*:Foo*IllegalRegexp}"); + } + } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java index d70abb58dcc..2cdab7cea2c 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java @@ -79,6 +79,8 @@ import org.sonarqube.ws.NewCodePeriods; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; import org.sonarqube.ws.Rules.ListResponse.Rule; +import static java.util.Collections.emptySet; + /** * Main utility class for writing scanner medium tests. */ @@ -209,6 +211,7 @@ public class ScannerMediumTester extends ExternalResource { r.setTemplateRuleKey(templateRuleKey); r.setLanguage(language); r.setSeverity(severity); + r.setDeprecatedKeys(emptySet()); activeRules.addActiveRule(r); return this; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java index bc65e15d45f..591286dd5e6 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java @@ -30,14 +30,15 @@ import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.api.rule.RuleKey; -import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.mediumtest.AnalysisResult; +import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.protocol.output.ScannerReport.Issue; -import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.xoo.XooPlugin; import org.sonar.xoo.rule.XooRulesDefinition; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -98,6 +99,7 @@ public class ChecksMediumTest { r.setTemplateRuleKey(templateRuleKey); r.setLanguage(languag); r.setSeverity(severity); + r.setDeprecatedKeys(emptySet()); Map<String, String> params = new HashMap<>(); params.put(paramKey, paramValue); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java index f27fd55be55..5a584bd275d 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java @@ -28,19 +28,20 @@ import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; -import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.mediumtest.AnalysisResult; +import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.protocol.output.ScannerReport.ExternalIssue; import org.sonar.scanner.protocol.output.ScannerReport.Issue; -import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.xoo.XooPlugin; import org.sonar.xoo.rule.HasTagSensor; import org.sonar.xoo.rule.OneExternalIssuePerLineSensor; import org.sonar.xoo.rule.XooRulesDefinition; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -385,6 +386,8 @@ public class IssuesMediumTest { r.setName("TODO"); r.setLanguage("xoo"); r.setSeverity("MAJOR"); + r.setDeprecatedKeys(emptySet() + ); r.setParams(ImmutableMap.of("tag", "TODO")); tester.activateRule(r); } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java index 0f1aef9124d..6d5c502e447 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java @@ -26,33 +26,24 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; import org.assertj.core.groups.Tuple; -import org.junit.Before; import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.rule.LoadedActiveRule; +import org.sonar.api.batch.rule.internal.DefaultActiveRules; import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.DateUtils; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; public class ActiveRulesProviderTest { - private ActiveRulesProvider provider; - - @Mock - private DefaultActiveRulesLoader loader; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - provider = new ActiveRulesProvider(); - } + private final ActiveRulesProvider provider = new ActiveRulesProvider(); + private final DefaultActiveRulesLoader loader = mock(DefaultActiveRulesLoader.class); @Test public void testCombinationOfRules() { @@ -69,7 +60,7 @@ public class ActiveRulesProviderTest { when(loader.load(eq("qp3"))).thenReturn(qp3Rules); QualityProfiles profiles = mockProfiles("qp1", "qp2", "qp3"); - ActiveRules activeRules = provider.provide(loader, profiles); + DefaultActiveRules activeRules = provider.provide(loader, profiles); assertThat(activeRules.findAll()).hasSize(3); assertThat(activeRules.findAll()).extracting("ruleKey").containsOnly( @@ -78,6 +69,8 @@ public class ActiveRulesProviderTest { verify(loader).load(eq("qp1")); verify(loader).load(eq("qp2")); verify(loader).load(eq("qp3")); + + assertThat(activeRules.getDeprecatedRuleKeys(RuleKey.of("rule1", "rule1"))).containsOnly("rule1old:rule1old"); verifyNoMoreInteractions(loader); } |