diff --git a/Makefile b/Makefile index f66cfce775..4ed3732751 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -.PHONY: all clean compile javadocs dryRelease update stop checkFormat format api assembleBenchmarkTestRelease assembleUiTestRelease +.PHONY: all clean compile javadocs dryRelease update stop checkFormat format api assembleBenchmarkTestRelease assembleUiTestRelease createCoverageReports -all: stop clean javadocs compile +all: stop clean javadocs compile createCoverageReports assembleBenchmarks: stop clean assembleBenchmarkTestRelease assembleUiTests: stop clean assembleUiTestRelease @@ -50,3 +50,10 @@ assembleBenchmarkTestRelease: assembleUiTestRelease: ./gradlew :sentry-android-integration-tests:sentry-uitest-android:assembleRelease ./gradlew :sentry-android-integration-tests:sentry-uitest-android:assembleAndroidTest -DtestBuildType=release + +# Create coverage reports +# - Jacoco for Java & Android modules +# - Kover for KMP modules e.g sentry-compose +createCoverageReports: + ./gradlew jacocoTestReport + ./gradlew koverXmlReportRelease diff --git a/build.gradle.kts b/build.gradle.kts index 8c4cd4fd38..c3e6eb98eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,7 @@ import com.vanniktech.maven.publish.MavenPublishPlugin import com.vanniktech.maven.publish.MavenPublishPluginExtension import groovy.util.Node import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import kotlinx.kover.gradle.plugin.dsl.KoverReportExtension import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent @@ -14,6 +15,8 @@ plugins { id(Config.QualityPlugins.detekt) version Config.QualityPlugins.detektVersion `maven-publish` id(Config.QualityPlugins.binaryCompatibilityValidator) version Config.QualityPlugins.binaryCompatibilityValidatorVersion + id(Config.QualityPlugins.jacocoAndroid) version Config.QualityPlugins.jacocoAndroidVersion apply false + id(Config.QualityPlugins.kover) version Config.QualityPlugins.koverVersion apply false } buildscript { @@ -97,6 +100,44 @@ allprojects { } subprojects { + val jacocoAndroidModules = listOf( + "sentry-android-core", + "sentry-android-fragment", + "sentry-android-navigation", + "sentry-android-ndk", + "sentry-android-okhttp", + "sentry-android-sqlite", + "sentry-android-timber" + ) + if (jacocoAndroidModules.contains(name)) { + afterEvaluate { + jacoco { + toolVersion = "0.8.10" + } + + tasks.withType { + configure { + isIncludeNoLocationClasses = true + excludes = listOf("jdk.internal.*") + } + } + } + } + + val koverKmpModules = listOf("sentry-compose") + if (koverKmpModules.contains(name)) { + afterEvaluate { + configure { + androidReports("release") { + xml { + // Change the report file name so the Codecov Github action can find it + setReportFile(file("$buildDir/reports/kover/report.xml")) + } + } + } + } + } + plugins.withId(Config.QualityPlugins.detektPlugin) { configure { buildUponDefaultConfig = true diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index be82ce3c3a..eda3873d81 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -1,3 +1,4 @@ + import java.math.BigDecimal object Config { @@ -205,6 +206,10 @@ object Config { val binaryCompatibilityValidatorVersion = "0.13.0" val binaryCompatibilityValidatorPlugin = "org.jetbrains.kotlinx:binary-compatibility-validator:$binaryCompatibilityValidatorVersion" val binaryCompatibilityValidator = "org.jetbrains.kotlinx.binary-compatibility-validator" + val jacocoAndroid = "com.mxalbert.gradle.jacoco-android" + val jacocoAndroidVersion = "0.2.0" + val kover = "org.jetbrains.kotlinx.kover" + val koverVersion = "0.7.3" } object Sentry { diff --git a/sentry-android-core/build.gradle.kts b/sentry-android-core/build.gradle.kts index d7478786fe..4ab0aec423 100644 --- a/sentry-android-core/build.gradle.kts +++ b/sentry-android-core/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.errorProne) id(Config.QualityPlugins.gradleVersions) } @@ -64,12 +65,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - tasks.withType().configureEach { options.errorprone { check("NullAway", net.ltgt.gradle.errorprone.CheckSeverity.ERROR) diff --git a/sentry-android-fragment/build.gradle.kts b/sentry-android-fragment/build.gradle.kts index c0a212a98f..14fb3ff9c1 100644 --- a/sentry-android-fragment/build.gradle.kts +++ b/sentry-android-fragment/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) } @@ -54,12 +55,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - kotlin { explicitApi() } diff --git a/sentry-android-navigation/build.gradle.kts b/sentry-android-navigation/build.gradle.kts index 6ae30766e1..d46c7e2b84 100644 --- a/sentry-android-navigation/build.gradle.kts +++ b/sentry-android-navigation/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) } @@ -55,12 +56,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - kotlin { explicitApi() } diff --git a/sentry-android-ndk/build.gradle.kts b/sentry-android-ndk/build.gradle.kts index 16315c80e4..f6564cd97f 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.NativePlugins.nativeBundleExport) id(Config.QualityPlugins.gradleVersions) } @@ -96,12 +97,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - dependencies { api(projects.sentry) api(projects.sentryAndroidCore) diff --git a/sentry-android-okhttp/build.gradle.kts b/sentry-android-okhttp/build.gradle.kts index ae80ad068e..0f98011fac 100644 --- a/sentry-android-okhttp/build.gradle.kts +++ b/sentry-android-okhttp/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) } @@ -56,12 +57,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - kotlin { explicitApi() } diff --git a/sentry-android-sqlite/build.gradle.kts b/sentry-android-sqlite/build.gradle.kts index 11b895f385..6de1b1ab30 100644 --- a/sentry-android-sqlite/build.gradle.kts +++ b/sentry-android-sqlite/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) } @@ -56,12 +57,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - kotlin { explicitApi() } diff --git a/sentry-android-timber/build.gradle.kts b/sentry-android-timber/build.gradle.kts index dfebefd93c..a2a999da4a 100644 --- a/sentry-android-timber/build.gradle.kts +++ b/sentry-android-timber/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.android.library") kotlin("android") jacoco + id(Config.QualityPlugins.jacocoAndroid) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) } @@ -59,12 +60,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - kotlin { explicitApi() } diff --git a/sentry-compose/build.gradle.kts b/sentry-compose/build.gradle.kts index 7da32ec1f6..1291ea1696 100644 --- a/sentry-compose/build.gradle.kts +++ b/sentry-compose/build.gradle.kts @@ -8,7 +8,7 @@ plugins { kotlin("multiplatform") id("com.android.library") id("org.jetbrains.compose") - jacoco + id(Config.QualityPlugins.kover) id(Config.QualityPlugins.gradleVersions) id(Config.QualityPlugins.detektPlugin) id(Config.BuildPlugins.dokkaPluginAlias) @@ -113,12 +113,6 @@ android { } } -tasks.withType { - configure { - isIncludeNoLocationClasses = false - } -} - tasks.withType { // Target version of the generated JVM bytecode. It is used for type resolution. jvmTarget = JavaVersion.VERSION_1_8.toString()