Skip to content

Commit aa3dd26

Browse files
authored
SONARJAVA-6234 Autoscan check filter silently removes custom file scanners (#5553)
1 parent c651ad5 commit aa3dd26

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSensor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ private UnaryOperator<List<JavaCheck>> createCheckFilter(boolean isAutoScanCheck
137137
autoScanCompatibleRules.addAll(sonarComponents.getAdditionalAutoScanCompatibleRuleKeys());
138138

139139
return checks -> checks.stream()
140-
.filter(check -> sonarComponents.getRuleKey(check).map(autoScanCompatibleRules::contains).orElse(false))
140+
.filter(check -> sonarComponents.getRuleKey(check).map(autoScanCompatibleRules::contains).orElse(true))
141141
.toList();
142142
} else {
143143
return UnaryOperator.identity();

sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.sonar.api.measures.FileLinesContext;
5353
import org.sonar.api.measures.FileLinesContextFactory;
5454
import org.sonar.api.rule.RuleKey;
55+
import org.sonar.api.rule.RuleScope;
5556
import org.sonar.api.rules.RuleAnnotationUtils;
5657
import org.sonar.api.testfixtures.log.LogTesterJUnit5;
5758
import org.sonar.api.utils.AnnotationUtils;
@@ -118,7 +119,7 @@ void test_toString() throws IOException {
118119
@Test
119120
void test_issues_creation_on_main_file() throws IOException {
120121
// Expected issues : the number of methods violating BadMethodName rule. Currently, 18 tests.
121-
testIssueCreation(InputFile.Type.MAIN, 15);
122+
testIssueCreation(InputFile.Type.MAIN, 16);
122123

123124
Map<String, String> telemetryMap = telemetry.toMap();
124125
assertThat(telemetryMap).containsOnlyKeys(
@@ -134,7 +135,7 @@ void test_issues_creation_on_main_file() throws IOException {
134135
"java.scanner_app");
135136
assertThat(telemetryMap.get("java.analysis.main.success.size_chars")).matches("\\d{5}");
136137
assertThat(telemetryMap.get("java.analysis.main.success.time_ms")).matches("\\d+");
137-
assertThat(telemetryMap).containsEntry("java.analysis.main.success.type_error_count", "199");
138+
assertThat(telemetryMap).containsEntry("java.analysis.main.success.type_error_count", "205");
138139
}
139140

140141
@Test
@@ -156,7 +157,7 @@ void test_issues_creation_on_test_file() throws IOException { // NOSONAR require
156157
"java.scanner_app");
157158
assertThat(telemetryMap.get("java.analysis.test.success.size_chars")).matches("\\d{5}");
158159
assertThat(telemetryMap.get("java.analysis.test.success.time_ms")).matches("\\d+");
159-
assertThat(telemetryMap).containsEntry("java.analysis.test.success.type_error_count", "199");
160+
assertThat(telemetryMap).containsEntry("java.analysis.test.success.type_error_count", "205");
160161
}
161162

162163
private static int lineNumberOfTheMethodWithNoSonar(FileSystem fs) throws IOException {
@@ -462,6 +463,55 @@ void filter_checks_when_autoscan_true() throws IOException {
462463
);
463464
}
464465

466+
@Test
467+
void custom_file_scanner_is_not_filtered_in_autoscan() throws IOException {
468+
MapSettings settings = new MapSettings();
469+
settings.setProperty("sonar.internal.analysis.autoscan", "true");
470+
471+
SensorContextTester context = SensorContextTester.create(new File("src/test/files").getAbsoluteFile())
472+
.setSettings(settings)
473+
.setRuntime(SonarRuntimeImpl.forSonarQube(Version.create(8, 7), SonarQubeSide.SCANNER, SonarEdition.COMMUNITY));
474+
475+
DefaultFileSystem fs = context.fileSystem();
476+
fs.setWorkDir(tmp.newFolder().toPath());
477+
478+
File mainFile = new File(fs.baseDir(), "CodeWithIssues.java");
479+
fs.add(new TestInputFileBuilder("", mainFile.getName()).setLanguage("java").setModuleBaseDir(fs.baseDirPath())
480+
.setType(InputFile.Type.MAIN).initMetadata(Files.readString(mainFile.toPath())).setCharset(UTF_8).build());
481+
482+
FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class);
483+
when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(mock(FileLinesContext.class));
484+
ClasspathForTest javaTestClasspath = new ClasspathForTest(context.config(), fs);
485+
ClasspathForMain javaClasspath = new ClasspathForMain(context.config(), fs);
486+
DefaultJavaResourceLocator resourceLocator = createDefaultJavaResourceLocator(context.config(), fs);
487+
488+
CustomFileScannerHook hook = new CustomFileScannerHook();
489+
CheckRegistrar[] checkRegistrars = new CheckRegistrar[] {new CustomRegistrar(), hook};
490+
491+
ActiveRulesBuilder activeRulesBuilder = new ActiveRulesBuilder();
492+
GeneratedCheckList.getChecks().stream()
493+
.map(check -> AnnotationUtils.getAnnotation(check, org.sonar.check.Rule.class).key())
494+
.map(key -> new NewActiveRule.Builder().setRuleKey(RuleKey.of("java", key)).build())
495+
.forEach(activeRulesBuilder::addRule);
496+
Stream.of("CustomMainCheck", "CustomJspCheck", "CustomTestCheck")
497+
.map(key -> new NewActiveRule.Builder().setRuleKey(RuleKey.of("CustomRepository", key)).build())
498+
.forEach(activeRulesBuilder::addRule);
499+
500+
CheckFactory specificCheckFactory = new CheckFactory(activeRulesBuilder.build());
501+
SonarComponents components = new SonarComponents(fileLinesContextFactory, fs,
502+
javaClasspath, javaTestClasspath, specificCheckFactory, context.activeRules(), checkRegistrars, null, null);
503+
504+
JavaSensor jss = new JavaSensor(components, fs, resourceLocator, context.config(), mock(NoSonarFilter.class), null, telemetry);
505+
jss.execute(context);
506+
507+
assertThat(hook.scanFileCount).as("Custom file scanner should be called even in autoscan mode").isPositive();
508+
509+
assertThat(context.allIssues())
510+
.extracting(issue -> issue.ruleKey().toString())
511+
.as("Rule-based autoscan filtering should still apply")
512+
.doesNotContain("CustomRepository:CustomMainCheck");
513+
}
514+
465515
@Test
466516
void test_describe_sensor() throws IOException {
467517
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
@@ -563,4 +613,18 @@ public void register(RegistrarContext registrarContext) {
563613
}
564614
}
565615

616+
public static class CustomFileScannerHook implements CheckRegistrar, JavaFileScanner {
617+
int scanFileCount;
618+
619+
@Override
620+
public void register(RegistrarContext registrarContext) {
621+
registrarContext.registerCustomFileScanner(RuleScope.ALL, this);
622+
}
623+
624+
@Override
625+
public void scanFile(JavaFileScannerContext context) {
626+
scanFileCount++;
627+
}
628+
}
629+
566630
}

0 commit comments

Comments
 (0)