2020package org .sonar .plugins .python .coverage ;
2121
2222import java .io .File ;
23+ import java .util .ArrayList ;
2324import java .util .HashMap ;
2425import java .util .HashSet ;
2526import java .util .List ;
3334import org .sonar .api .batch .fs .FileSystem ;
3435import org .sonar .api .batch .fs .InputFile ;
3536import org .sonar .api .batch .sensor .SensorContext ;
36- import org .sonar .api .batch .sensor .coverage .CoverageType ;
3737import org .sonar .api .batch .sensor .coverage .NewCoverage ;
3838import org .sonar .api .config .Settings ;
3939import org .sonar .plugins .python .EmptyReportException ;
@@ -53,105 +53,73 @@ public class PythonCoverageSensor {
5353 public static final String OVERALL_DEFAULT_REPORT_PATH = "coverage-reports/overall-coverage-*.xml" ;
5454 public static final String FORCE_ZERO_COVERAGE_KEY = "sonar.python.coverage.forceZeroCoverage" ;
5555
56- private CoberturaParser parser = new CoberturaParser ();
57-
5856 public void execute (SensorContext context , Map <InputFile , Set <Integer >> linesOfCode ) {
5957 String baseDir = context .fileSystem ().baseDir ().getPath ();
6058 Settings settings = context .settings ();
6159
62- LOG .info ("Python unit test coverage" );
63- List <File > reports = getReports (settings , baseDir , REPORT_PATH_KEY , DEFAULT_REPORT_PATH );
64- Map <InputFile , NewCoverage > coverageMeasures = parseReports (reports , context );
65- HashSet <InputFile > filesCoveredByUT = new HashSet <>();
66- saveMeasures (coverageMeasures , filesCoveredByUT , CoverageType .UNIT );
67-
68- LOG .info ("Python integration test coverage" );
69- List <File > itReports = getReports (settings , baseDir , IT_REPORT_PATH_KEY , IT_DEFAULT_REPORT_PATH );
70- Map <InputFile , NewCoverage > itCoverageMeasures = parseReports (itReports , context );
71- HashSet <InputFile > filesCoveredByIT = new HashSet <>();
72- saveMeasures (itCoverageMeasures , filesCoveredByIT , CoverageType .IT );
73-
74- LOG .info ("Python overall test coverage" );
75- List <File > overallReports = getReports (settings , baseDir , OVERALL_REPORT_PATH_KEY , OVERALL_DEFAULT_REPORT_PATH );
76- Map <InputFile , NewCoverage > overallCoverageMeasures = parseReports (overallReports , context );
77- HashSet <InputFile > filesCoveredOverall = new HashSet <>();
78- saveMeasures (overallCoverageMeasures , filesCoveredOverall , CoverageType .OVERALL );
79-
60+ HashSet <InputFile > filesCovered = new HashSet <>();
61+ List <File > reports = new ArrayList <>();
62+ reports .addAll (getReports (settings , baseDir , REPORT_PATH_KEY , DEFAULT_REPORT_PATH ));
63+ reports .addAll (getReports (settings , baseDir , IT_REPORT_PATH_KEY , IT_DEFAULT_REPORT_PATH ));
64+ reports .addAll (getReports (settings , baseDir , OVERALL_REPORT_PATH_KEY , OVERALL_DEFAULT_REPORT_PATH ));
65+ if (!reports .isEmpty ()) {
66+ LOG .info ("Python test coverage" );
67+ for (File report : reports ) {
68+ Map <InputFile , NewCoverage > coverageMeasures = parseReport (report , context );
69+ saveMeasures (coverageMeasures , filesCovered );
70+ }
71+ }
8072 if (settings .getBoolean (FORCE_ZERO_COVERAGE_KEY )) {
8173 LOG .debug ("Zeroing coverage information for untouched files" );
82- zeroMeasuresWithoutReports (context , filesCoveredByUT , filesCoveredByIT , filesCoveredOverall , linesOfCode );
74+ zeroMeasuresWithoutReports (context , filesCovered , linesOfCode );
8375 }
8476 }
8577
86- private static void zeroMeasuresWithoutReports (
87- SensorContext context ,
88- HashSet <InputFile > filesCoveredByUT ,
89- HashSet <InputFile > filesCoveredByIT ,
90- HashSet <InputFile > filesCoveredOverall ,
91- Map <InputFile , Set <Integer >> linesOfCode
92- ) {
78+ private static void zeroMeasuresWithoutReports (SensorContext context , HashSet <InputFile > filesCovered , Map <InputFile , Set <Integer >> linesOfCode ) {
9379 FileSystem fileSystem = context .fileSystem ();
9480 FilePredicates p = fileSystem .predicates ();
9581 Iterable <InputFile > inputFiles = fileSystem .inputFiles (p .and (p .hasType (InputFile .Type .MAIN ), p .hasLanguage (Python .KEY )));
9682 for (InputFile inputFile : inputFiles ) {
97- Set <Integer > linesOfCodeForFile = linesOfCode .get (inputFile );
98-
99- if (!filesCoveredByUT .contains (inputFile )) {
100- saveZeroValueForResource (inputFile , context , CoverageType .UNIT , linesOfCodeForFile );
101- }
102-
103- if (!filesCoveredByIT .contains (inputFile )) {
104- saveZeroValueForResource (inputFile , context , CoverageType .IT , linesOfCodeForFile );
105- }
106-
107- if (!filesCoveredOverall .contains (inputFile )) {
108- saveZeroValueForResource (inputFile , context , CoverageType .OVERALL , linesOfCodeForFile );
83+ if (!filesCovered .contains (inputFile )) {
84+ saveZeroValueForResource (inputFile , context , linesOfCode .get (inputFile ));
10985 }
11086 }
11187 }
11288
113- private static void saveZeroValueForResource (InputFile inputFile , SensorContext context , CoverageType ctype , @ Nullable Set <Integer > linesOfCode ) {
89+ private static void saveZeroValueForResource (InputFile inputFile , SensorContext context , @ Nullable Set <Integer > linesOfCode ) {
11490 if (linesOfCode != null ) {
11591 if (LOG .isDebugEnabled ()) {
116- LOG .debug ("Zeroing {} coverage measures for file '{}'" , ctype , inputFile .relativePath ());
92+ LOG .debug ("Zeroing coverage measures for file '{}'" , inputFile .relativePath ());
11793 }
118-
11994 NewCoverage newCoverage = context .newCoverage ()
120- .onFile (inputFile )
121- .ofType (ctype );
95+ .onFile (inputFile );
12296 linesOfCode .forEach ((Integer line ) -> newCoverage .lineHits (line , 0 ));
12397 newCoverage .save ();
12498 }
12599 }
126100
127-
128- private Map <InputFile , NewCoverage > parseReports (List <File > reports , SensorContext context ) {
101+ private static Map <InputFile , NewCoverage > parseReport (File report , SensorContext context ) {
129102 Map <InputFile , NewCoverage > coverageMeasures = new HashMap <>();
130- for (File report : reports ) {
131- try {
132- parser .parseReport (report , context , coverageMeasures );
133- } catch (EmptyReportException e ) {
134- LOG .warn ("The report '{}' seems to be empty, ignoring. '{}'" , report , e );
135- } catch (XMLStreamException e ) {
136- throw new IllegalStateException ("Error parsing the report '" + report + "'" , e );
137- }
103+ try {
104+ CoberturaParser parser = new CoberturaParser ();
105+ parser .parseReport (report , context , coverageMeasures );
106+ } catch (EmptyReportException e ) {
107+ LOG .warn ("The report '{}' seems to be empty, ignoring. '{}'" , report , e );
108+ } catch (XMLStreamException e ) {
109+ throw new IllegalStateException ("Error parsing the report '" + report + "'" , e );
138110 }
139111 return coverageMeasures ;
140112 }
141113
142- private static void saveMeasures (Map <InputFile , NewCoverage > coverageMeasures , HashSet <InputFile > coveredFiles , CoverageType coverageType ) {
114+ private static void saveMeasures (Map <InputFile , NewCoverage > coverageMeasures , HashSet <InputFile > coveredFiles ) {
143115 for (Map .Entry <InputFile , NewCoverage > entry : coverageMeasures .entrySet ()) {
144116 InputFile inputFile = entry .getKey ();
145117 coveredFiles .add (inputFile );
146-
147118 if (LOG .isDebugEnabled ()) {
148119 LOG .debug ("Saving coverage measures for file '{}'" , inputFile .relativePath ());
149120 }
150-
151121 entry .getValue ()
152- .ofType (coverageType )
153122 .save ();
154-
155123 }
156124 }
157125}
0 commit comments