From 52467695b1534a8098e8936a3a849c02b2ff98c4 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Sat, 20 Mar 2021 13:09:59 +0100 Subject: build: Add support for aggregate code coverage results This change adds support for aggregating code coverage results from the different modules. --- simulator/build.gradle.kts | 1 + .../src/main/kotlin/jacoco-aggregation.gradle.kts | 26 ++++++++++------- .../src/main/kotlin/jacoco-conventions.gradle.kts | 33 ++++++++++++++++++++++ .../opendc-compute-simulator/build.gradle.kts | 1 + simulator/opendc-format/build.gradle.kts | 1 + simulator/opendc-harness/build.gradle.kts | 1 + .../opendc-simulator-compute/build.gradle.kts | 1 + .../opendc-workflow-service/build.gradle.kts | 1 + 8 files changed, 55 insertions(+), 10 deletions(-) diff --git a/simulator/build.gradle.kts b/simulator/build.gradle.kts index 6b0a9bf1..061d8fc3 100644 --- a/simulator/build.gradle.kts +++ b/simulator/build.gradle.kts @@ -22,6 +22,7 @@ plugins { `dokka-conventions` + `jacoco-aggregation` } allprojects { diff --git a/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts b/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts index 8c07fdea..3e8aa741 100644 --- a/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts +++ b/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts @@ -32,19 +32,25 @@ repositories { mavenCentral() } -task("jacocoTestReport") { +tasks.register("codeCoverageReport") { group = "Coverage reports" - description = "Generates an aggregate report from all subprojects" + description = "Generates an aggregate report based on all subprojects" - val jacocoReportTasks = subprojects.map { it.tasks.withType() } - dependsOn(jacocoReportTasks) - executionData(jacocoReportTasks) + reports { + xml.isEnabled = true + xml.destination = file("${buildDir}/reports/jacoco/report.xml") - subprojects.forEach { testedProject -> - val sourceSets = testedProject.convention.findPlugin(JavaPluginConvention::class)?.sourceSets ?: return@forEach + html.isEnabled = true + } - this@task.additionalSourceDirs.from(sourceSets["main"].allSource.srcDirs) - this@task.sourceDirectories.from(sourceSets["main"].allSource.srcDirs) - this@task.classDirectories.from(sourceSets["main"].output) + subprojects { + this@subprojects.plugins.withType().configureEach { + this@subprojects.tasks.matching { + it.extensions.findByType() != null } + .configureEach { + sourceSets(this@subprojects.the().named("main").get()) + executionData(this) + } + } } } diff --git a/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts b/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts index e0bc2ce4..d0534d4f 100644 --- a/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts +++ b/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts @@ -30,3 +30,36 @@ tasks.jacocoTestReport { html.isEnabled = true } } + +/* Share sources folder with other projects for aggregated JaCoCo reports */ +configurations.create("transitiveSourcesElements") { + isVisible = false + isCanBeResolved = false + isCanBeConsumed = true + extendsFrom(configurations.implementation.get()) + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("source-folders")) + } + sourceSets.main.get().java.srcDirs.forEach { + outgoing.artifact(it) + } +} + +/* Share the coverage data to be aggregated for the whole product */ +configurations.create("coverageDataElements") { + isVisible = false + isCanBeResolved = false + isCanBeConsumed = true + extendsFrom(configurations.implementation.get()) + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("jacoco-coverage-data")) + } + // This will cause the test task to run if the coverage data is requested by the aggregation task + outgoing.artifact(tasks.test.map { task -> + task.extensions.getByType().destinationFile!! + }) +} diff --git a/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts b/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts index 31fcda2f..1ad3f1c6 100644 --- a/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts +++ b/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts @@ -26,6 +26,7 @@ description = "Simulator for OpenDC Compute" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-format/build.gradle.kts b/simulator/opendc-format/build.gradle.kts index 385e556d..ea43275a 100644 --- a/simulator/opendc-format/build.gradle.kts +++ b/simulator/opendc-format/build.gradle.kts @@ -26,6 +26,7 @@ description = "Library for reading common data formats for topology simulation" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index f980853c..01b4ecd6 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -26,6 +26,7 @@ description = "Harness for defining repeatable experiments using OpenDC" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts b/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts index 66d7d9e5..0005928f 100644 --- a/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts +++ b/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts @@ -25,6 +25,7 @@ description = "Library for simulation of cloud computing components" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts b/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts index 12a54235..bec18ae9 100644 --- a/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts +++ b/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts @@ -26,6 +26,7 @@ description = "Workflow orchestration service for OpenDC" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { -- cgit v1.2.3