5252import org .sonar .api .measures .FileLinesContext ;
5353import org .sonar .api .measures .FileLinesContextFactory ;
5454import org .sonar .api .rule .RuleKey ;
55+ import org .sonar .api .rule .RuleScope ;
5556import org .sonar .api .rules .RuleAnnotationUtils ;
5657import org .sonar .api .testfixtures .log .LogTesterJUnit5 ;
5758import 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