summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-03-20 16:51:05 +0100
committerGitHub <noreply@github.com>2021-03-20 16:51:05 +0100
commit0862f8489b1122671cefa5c5bd59f677b56a3712 (patch)
tree9256a835306601fa522476d02be4c38e0bf001c9
parent592d60d6d2ef51923eebd844888930b07892da39 (diff)
parentfce499eaafa0afecee5c14346ff7d75e2fe999b6 (diff)
Add support for code coverage tracking via Codecov
This pull request enables aggregate code coverage reports via Jacoco and adds support for coverage tracking via Codecov.
-rw-r--r--.github/workflows/build-api.yml23
-rw-r--r--.github/workflows/build-frontend.yml3
-rw-r--r--.github/workflows/build-simulator.yml29
-rw-r--r--api/.gitignore2
-rw-r--r--api/pytest.ini1
-rw-r--r--api/requirements.txt1
-rw-r--r--codecov.yml7
-rw-r--r--simulator/build.gradle.kts1
-rw-r--r--simulator/buildSrc/build.gradle.kts2
-rw-r--r--simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts26
-rw-r--r--simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts33
-rw-r--r--simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts9
-rw-r--r--simulator/gradle.properties8
-rw-r--r--simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts1
-rw-r--r--simulator/opendc-format/build.gradle.kts1
-rw-r--r--simulator/opendc-harness/build.gradle.kts1
-rw-r--r--simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts1
-rw-r--r--simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts1
18 files changed, 117 insertions, 33 deletions
diff --git a/.github/workflows/build-api.yml b/.github/workflows/build-api.yml
index 5bbc30c4..4ae261db 100644
--- a/.github/workflows/build-api.yml
+++ b/.github/workflows/build-api.yml
@@ -1,9 +1,6 @@
name: Build API
on:
- push:
- paths:
- - 'api/**'
pull_request:
branches: [master]
@@ -29,8 +26,20 @@ jobs:
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Lint with pylint
- run: |
- ./check.sh
+ run: ./check.sh
- name: Test with pytest
- run: |
- pytest opendc
+ run: pytest --cov=opendc/ --junitxml=.junit-report.xml
+ - name: Publish report
+ if: always()
+ uses: mikepenz/action-junit-report@v2
+ with:
+ check_name: test (Python ${{ matrix.python }})
+ report_paths: '**/.junit-report.xml'
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Upload code coverage
+ uses: codecov/codecov-action@v1
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./api/.coverage
+ flags: api
+
diff --git a/.github/workflows/build-frontend.yml b/.github/workflows/build-frontend.yml
index 73ab49d5..7c1b95a7 100644
--- a/.github/workflows/build-frontend.yml
+++ b/.github/workflows/build-frontend.yml
@@ -1,9 +1,6 @@
name: Build Frontend
on:
- push:
- paths:
- - 'frontend/**'
pull_request:
branches: [master]
diff --git a/.github/workflows/build-simulator.yml b/.github/workflows/build-simulator.yml
index 57e8b46d..1bee19bc 100644
--- a/.github/workflows/build-simulator.yml
+++ b/.github/workflows/build-simulator.yml
@@ -1,9 +1,6 @@
name: Build Simulator
on:
- push:
- paths:
- - 'simulator/**'
pull_request:
branches: [master]
@@ -21,6 +18,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
+ - name: Validate Gradle wrapper
+ uses: gradle/wrapper-validation-action@v1
- name: Set up JDK
uses: actions/setup-java@v1
with:
@@ -36,4 +35,26 @@ jobs:
- name: Build with Gradle
run: ./gradlew assemble
- name: Check with Gradle
- run: ./gradlew check --info
+ run: ./gradlew check codeCoverageReport
+ - name: Publish report
+ if: always()
+ uses: mikepenz/action-junit-report@v2
+ with:
+ check_name: test (Java ${{ matrix.java }})
+ report_paths: '**/build/test-results/test/TEST-*.xml'
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Upload artifacts
+ if: always()
+ uses: actions/upload-artifact@v2
+ with:
+ name: reports-${{ matrix.os }}-jdk${{ matrix.java }}
+ path: |
+ ./**/build/reports/**/*
+ ./**/build/test-results/**/*
+ retention-days: 5
+ - name: Upload code coverage
+ uses: codecov/codecov-action@v1
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./simulator/build/reports/jacoco/report.xml
+ flags: simulator
diff --git a/api/.gitignore b/api/.gitignore
index 0e4f0a70..b0390689 100644
--- a/api/.gitignore
+++ b/api/.gitignore
@@ -14,3 +14,5 @@ _mailinglist
config.json
test.json
.env*
+.coverage
+.junit-report.xml
diff --git a/api/pytest.ini b/api/pytest.ini
index 8c28be16..8e7964ba 100644
--- a/api/pytest.ini
+++ b/api/pytest.ini
@@ -2,3 +2,4 @@
env =
OPENDC_FLASK_TESTING=True
OPENDC_FLASK_SECRET=Secret
+junit_family = xunit2
diff --git a/api/requirements.txt b/api/requirements.txt
index 9bf69b8f..8d0a283a 100644
--- a/api/requirements.txt
+++ b/api/requirements.txt
@@ -30,6 +30,7 @@ pylint==2.5.3
pymongo==3.10.1
pyparsing==2.4.7
pytest==5.4.3
+pytest-cov==2.11.1
pytest-env==0.6.2
pytest-mock==3.2.0
python-dotenv==0.14.0
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 00000000..6b69e117
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,7 @@
+flags:
+ simulator:
+ paths:
+ - simulator/
+ api:
+ paths:
+ - api/
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/build.gradle.kts b/simulator/buildSrc/build.gradle.kts
index 4cc1958a..be071d0c 100644
--- a/simulator/buildSrc/build.gradle.kts
+++ b/simulator/buildSrc/build.gradle.kts
@@ -33,7 +33,7 @@ repositories {
}
dependencies {
- implementation(kotlin("gradle-plugin", version = "1.4.30"))
+ implementation(kotlin("gradle-plugin", version = "1.4.31"))
implementation("org.jlleitschuh.gradle:ktlint-gradle:10.0.0")
implementation("org.jetbrains.dokka:dokka-gradle-plugin:0.10.1")
}
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<JacocoReport>("jacocoTestReport") {
+tasks.register<JacocoReport>("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<JacocoReport>() }
- 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<JacocoPlugin>().configureEach {
+ this@subprojects.tasks.matching {
+ it.extensions.findByType<JacocoTaskExtension>() != null }
+ .configureEach {
+ sourceSets(this@subprojects.the<SourceSetContainer>().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<JacocoTaskExtension>().destinationFile!!
+ })
+}
diff --git a/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts b/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts
index 566b765f..f129c282 100644
--- a/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts
+++ b/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts
@@ -1,7 +1,3 @@
-import org.gradle.kotlin.dsl.`java-library`
-import org.gradle.kotlin.dsl.kotlin
-import org.gradle.platform.base.Library
-
/*
* Copyright (c) 2021 AtLarge Research
*
@@ -30,6 +26,11 @@ plugins {
tasks.test {
useJUnitPlatform()
+
+ reports {
+ html.isEnabled = true
+ junitXml.isEnabled = true
+ }
}
dependencies {
diff --git a/simulator/gradle.properties b/simulator/gradle.properties
index 930be6b5..8d41408c 100644
--- a/simulator/gradle.properties
+++ b/simulator/gradle.properties
@@ -21,12 +21,12 @@
#
# Dependencies
-kotlinx-coroutines.version = 1.4.2
+kotlinx-coroutines.version = 1.4.3
# Dependencies (Logging)
-kotlin-logging.version = 2.0.4
+kotlin-logging.version = 2.0.6
slf4j.version = 1.7.30
-log4j.version = 2.14.0
+log4j.version = 2.14.1
# Dependencies (CLI)
clikt.version = 3.1.0
@@ -45,4 +45,4 @@ classgraph.version = 4.8.102
# Dependencies (Testing)
junit-jupiter.version = 5.7.1
junit-platform.version = 1.7.1
-mockk.version = 1.10.5
+mockk.version = 1.11.0
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 {