Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQ Plugin: Remove deprecated import of integration test coverage from plugins #9561

Merged
merged 2 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,26 +47,20 @@ public class CoverageReportImportSensor implements ProjectSensor {
private final WildcardPatternFileProvider wildcardPatternFileProvider = new WildcardPatternFileProvider(BASE_DIR);
private final CoverageConfiguration coverageConf;
private final CoverageAggregator coverageAggregator;
private final boolean isIntegrationTest;
private final String languageKey;
private final String languageName;

public CoverageReportImportSensor(CoverageConfiguration coverageConf, CoverageAggregator coverageAggregator,
String languageKey, String languageName, boolean isIntegrationTest) {
String languageKey, String languageName) {
this.coverageConf = coverageConf;
this.coverageAggregator = coverageAggregator;
this.isIntegrationTest = isIntegrationTest;
this.languageKey = languageKey;
this.languageName = languageName;
}

@Override
public void describe(SensorDescriptor descriptor) {
if (this.isIntegrationTest) {
descriptor.name("[Deprecated] " + this.languageName + " Integration Tests Coverage Report Import");
} else {
descriptor.name(this.languageName + " Tests Coverage Report Import");
}
descriptor.name(this.languageName + " Tests Coverage Report Import");
descriptor.onlyWhenConfiguration(c -> coverageAggregator.hasCoverageProperty(c::hasKey));
descriptor.onlyOnLanguage(this.languageKey);
}
Expand All @@ -77,12 +71,6 @@ public void execute(SensorContext context) {
LOG.debug("No coverage property. Skip Sensor");
return;
}

if (this.isIntegrationTest) {
LOG.warn("Starting with SonarQube 6.2 separation between Unit Tests and Integration Tests Coverage" +
" reports is deprecated. Please move all reports specified from *.it.reportPaths into *.reportPaths.");
}

analyze(context, new Coverage());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ public class CodeCoverageProvider {

private final DotNetPluginMetadata pluginMetadata;
private final CoverageConfiguration coverageConf;
private final CoverageConfiguration itCoverageConf;

public CodeCoverageProvider(DotNetPluginMetadata pluginMetadata) {
this.pluginMetadata = pluginMetadata;
Expand All @@ -52,22 +51,15 @@ public CodeCoverageProvider(DotNetPluginMetadata pluginMetadata) {
SONAR_PROPERTY_PREFIX + languageKey + ".opencover.reportsPaths",
SONAR_PROPERTY_PREFIX + languageKey + ".dotcover.reportsPaths",
SONAR_PROPERTY_PREFIX + languageKey + ".vscoveragexml.reportsPaths");

itCoverageConf = new CoverageConfiguration(
languageKey,
SONAR_PROPERTY_PREFIX + languageKey + ".ncover3.it.reportsPaths",
SONAR_PROPERTY_PREFIX + languageKey + ".opencover.it.reportsPaths",
SONAR_PROPERTY_PREFIX + languageKey + ".dotcover.it.reportsPaths",
SONAR_PROPERTY_PREFIX + languageKey + ".vscoveragexml.it.reportsPaths");
}

public List<Object> extensions() {
String category = pluginMetadata.shortLanguageName();

return Arrays.asList(
this,
UnitTestCoverageAggregator.class, IntegrationTestCoverageAggregator.class,
UnitTestCoverageReportImportSensor.class, IntegrationTestCoverageReportImportSensor.class,
UnitTestCoverageAggregator.class,
UnitTestCoverageReportImportSensor.class,

PropertyDefinition.builder(coverageConf.ncover3PropertyKey())
.name("NCover3 Unit Tests Reports Paths")
Expand All @@ -77,14 +69,6 @@ public List<Object> extensions() {
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(itCoverageConf.ncover3PropertyKey())
.name("NCover3 Integration Tests Reports Paths")
.description("Example: \"report.nccov\", \"report1.nccov,report2.nccov\" or \"C:/report.nccov\"")
.category(category)
.subCategory(SUBCATEGORY)
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(coverageConf.openCoverPropertyKey())
.name("OpenCover Unit Tests Reports Paths")
.description("Example: \"report.xml\", \"report1.xml,report2.xml\" or \"C:/report.xml\"")
Expand All @@ -93,14 +77,6 @@ public List<Object> extensions() {
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(itCoverageConf.openCoverPropertyKey())
.name("OpenCover Integration Tests Reports Paths")
.description("Example: \"report.xml\", \"report1.xml,report2.xml\" or \"C:/report.xml\"")
.category(category)
.subCategory(SUBCATEGORY)
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(coverageConf.dotCoverPropertyKey())
.name("dotCover Unit Tests (HTML) Reports Paths")
.description("Example: \"report.html\", \"report1.html,report2.html\" or \"C:/report.html\"")
Expand All @@ -109,29 +85,13 @@ public List<Object> extensions() {
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(itCoverageConf.dotCoverPropertyKey())
.name("dotCover Integration Tests (HTML) Reports Paths")
.description("Example: \"report.html\", \"report1.html,report2.html\" or \"C:/report.html\"")
.category(category)
.subCategory(SUBCATEGORY)
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(coverageConf.visualStudioCoverageXmlPropertyKey())
.name("Visual Studio Unit Tests (XML) Reports Paths")
.description("Example: \"report.coveragexml\", \"report1.coveragexml,report2.coveragexml\" or \"C:/report.coveragexml\"")
.category(category)
.subCategory(SUBCATEGORY)
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build(),
PropertyDefinition.builder(itCoverageConf.visualStudioCoverageXmlPropertyKey())
.name("Visual Studio Integration Tests (XML) Reports Paths")
.description("Example: \"report.coveragexml\", \"report1.coveragexml,report2.coveragexml\" or \"C:/report.coveragexml\"")
.category(category)
.subCategory(SUBCATEGORY)
.onlyOnQualifiers(Qualifiers.PROJECT)
.multiValues(true)
.build());
}

Expand All @@ -150,29 +110,8 @@ public UnitTestCoverageAggregator(Configuration configuration, FileSystem fileSy
public class UnitTestCoverageReportImportSensor extends CoverageReportImportSensor {

public UnitTestCoverageReportImportSensor(UnitTestCoverageAggregator coverageAggregator) {
super(coverageConf, coverageAggregator, pluginMetadata.languageKey(), pluginMetadata.languageName(), false);
}

}

public class IntegrationTestCoverageAggregator extends CoverageAggregator {

public IntegrationTestCoverageAggregator(Configuration configuration, FileSystem fileSystem,
AnalysisWarnings analysisWarnings) {
super(itCoverageConf,
configuration,
new ScannerFileService(coverageConf.languageKey(), fileSystem),
analysisWarnings);
}

}

public class IntegrationTestCoverageReportImportSensor extends CoverageReportImportSensor {

public IntegrationTestCoverageReportImportSensor(IntegrationTestCoverageAggregator coverageAggregator) {
super(itCoverageConf, coverageAggregator, pluginMetadata.languageKey(), pluginMetadata.languageName(), true);
super(coverageConf, coverageAggregator, pluginMetadata.languageKey(), pluginMetadata.languageName());
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -300,32 +300,6 @@ public void when_UnitTestCoverageAggregator_is_created_from_CodeCoverageProvider
);
}

// this method needs to be here as the test needs to be in the same package with CoverageAggregator
@Test
public void when_IntegrationTestCoverageAggregator_is_created_from_CodeCoverageProvider_calls_uses_properties() {
// setup
CodeCoverageProvider provider = createTestProvider();
CoverageAggregator sut = provider.new IntegrationTestCoverageAggregator(
mock(Configuration.class),
mock(FileSystem.class),
mock(AnalysisWarnings.class)
);

// act
Predicate<String> mockPredicate = mock(Predicate.class);
sut.hasCoverageProperty(mockPredicate);

// verify
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mockPredicate, times(4)).test(argument.capture());
assertThat(argument.getAllValues()).containsExactlyInAnyOrder(
"sonar.KEY.ncover3.it.reportsPaths",
"sonar.KEY.opencover.it.reportsPaths",
"sonar.KEY.dotcover.it.reportsPaths",
"sonar.KEY.vscoveragexml.it.reportsPaths"
);
}

private static CodeCoverageProvider createTestProvider() {
DotNetPluginMetadata pluginMetadata = mock(DotNetPluginMetadata.class);
when(pluginMetadata.languageKey()).thenReturn("KEY");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,20 +71,12 @@ public void setUp() throws IOException {

@Test
public void describe_unit_test() {
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.describe(descriptor);

assertThat(descriptor.name()).isEqualTo("C# Tests Coverage Report Import");
}

@Test
public void describe_integration_test() {
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", true)
.describe(descriptor);

assertThat(descriptor.name()).isEqualTo("[Deprecated] C# Integration Tests Coverage Report Import");
}

@Test
public void isProjectSensor() {
assertThat(ProjectSensor.class.isAssignableFrom(CoverageReportImportSensor.class)).isTrue();
Expand All @@ -102,7 +94,7 @@ public void describe_execute_only_when_key_present() {
return pr.test("expectedKey");
});

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.describe(descriptor);

assertThat(descriptor.configurationPredicate()).accepts(configWithKey);
Expand All @@ -111,45 +103,22 @@ public void describe_execute_only_when_key_present() {

@Test
public void execute_no_coverage_property() throws Exception {
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.execute(context);

assertThat(logTester.logs(Level.INFO)).isEmpty();
assertThat(logTester.logs(Level.DEBUG)).containsOnly("No coverage property. Skip Sensor");
}

@Test
public void execute_warn_about_deprecated_integration_tests() throws IOException {
when(coverageAggregator.hasCoverageProperty()).thenReturn(true);

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", true)
.execute(context);

assertThat(logTester.logs(Level.INFO)).isEmpty();
assertThat(logTester.logs(Level.WARN)).containsOnly("Starting with SonarQube 6.2 separation between Unit Tests and Integration Tests "
+ "Coverage reports is deprecated. Please move all reports specified from *.it.reportPaths into *.reportPaths.");
}

@Test
public void analyze() throws Exception {
SensorContextTester context = computeCoverageMeasures(false);
assertThat(context.lineHits("foo:Foo.cs", 2)).isEqualTo(1);
assertThat(context.lineHits("foo:Foo.cs", 4)).isZero();
assertThat(context.coveredConditions("foo:Foo.cs", 1)).isNull();
assertThat(context.coveredConditions("foo:Foo.cs", 4)).isNull();
assertThat(context.coveredConditions("foo:Foo.cs", 5)).isEqualTo(1);
assertThat(context.coveredConditions("foo:Foo.cs", 6)).isEqualTo(2);
}

@Test
public void analyzeIntegrationTests() throws Exception {
SensorContextTester context = computeCoverageMeasures(true);
assertThat(context.lineHits("foo:Foo.cs", 2)).isEqualTo(1);
assertThat(context.lineHits("foo:Foo.cs", 4)).isZero();
assertThat(context.coveredConditions("foo:Foo.cs", 1)).isNull();
assertThat(context.coveredConditions("foo:Foo.cs", 4)).isNull();
assertThat(context.coveredConditions("foo:Foo.cs", 5)).isEqualTo(1);
assertThat(context.coveredConditions("foo:Foo.cs", 6)).isEqualTo(2);
SensorContextTester localContext = computeCoverageMeasures();
assertThat(localContext.lineHits("foo:Foo.cs", 2)).isEqualTo(1);
assertThat(localContext.lineHits("foo:Foo.cs", 4)).isZero();
assertThat(localContext.coveredConditions("foo:Foo.cs", 1)).isNull();
assertThat(localContext.coveredConditions("foo:Foo.cs", 4)).isNull();
assertThat(localContext.coveredConditions("foo:Foo.cs", 5)).isEqualTo(1);
assertThat(localContext.coveredConditions("foo:Foo.cs", 6)).isEqualTo(2);
}

@Test
Expand All @@ -161,7 +130,7 @@ public void execute_coverage_no_main_file() throws IOException {
context.fileSystem().add(new TestInputFileBuilder("foo", "Foo.cs").setLanguage("cs")
.setType(Type.TEST).build());

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.analyze(context, coverage);

assertThat(logTester.logs(Level.INFO)).containsOnly("Coverage Report Statistics: " +
Expand All @@ -185,7 +154,7 @@ public void execute_coverage_main_file_no_coverage_for_file() throws IOException
context.fileSystem().add(new TestInputFileBuilder("foo", "Foo.cs").setLanguage("cs")
.setType(Type.MAIN).build());

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.analyze(context, coverage);

assertThat(logTester.logs(Level.INFO)).containsOnly("Coverage Report Statistics: " +
Expand All @@ -208,7 +177,7 @@ public void execute_coverage_not_indexed_file() throws IOException {
String fooPath = new File(baseDir, "Foo.cs").getCanonicalPath();
when(coverage.files()).thenReturn(new HashSet<>(Collections.singletonList(fooPath)));

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.analyze(context, coverage);

assertThat(logTester.logs(Level.INFO)).containsOnly("Coverage Report Statistics: " +
Expand All @@ -231,7 +200,7 @@ public void computeCoverageLoggingOutOfRange() {
context.fileSystem().add(new TestInputFileBuilder("foo", "Foo.cs").setLanguage("cs")
.setType(Type.MAIN).build());

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", false)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.analyze(context, coverage);

assertThat(logTester.logs(Level.DEBUG)).contains(
Expand All @@ -241,7 +210,7 @@ public void computeCoverageLoggingOutOfRange() {
"Invalid data found in the coverage report, please check the debug logs for more details and raise an issue on the coverage tool being used.");
}

private SensorContextTester computeCoverageMeasures(boolean isIntegrationTest) {
private SensorContextTester computeCoverageMeasures() {
Coverage coverage = mock(Coverage.class);
String fooPath = new File(baseDir, "Foo.cs").getAbsolutePath();
String bazPath = new File(baseDir, "Baz.java").getAbsolutePath();
Expand All @@ -263,7 +232,7 @@ private SensorContextTester computeCoverageMeasures(boolean isIntegrationTest) {
context.fileSystem().add(inputFile);
context.fileSystem().add(new TestInputFileBuilder("foo", "Baz.java").setLanguage("java").build());

new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#", isIntegrationTest)
new CoverageReportImportSensor(coverageConf, coverageAggregator, "cs", "C#")
.analyze(context, coverage);

verify(coverageAggregator).aggregate(Mockito.any(WildcardPatternFileProvider.class), Mockito.eq(coverage));
Expand Down
Loading
Loading