diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cb7502e773..94fcf31e70 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,10 +9,9 @@ plugins { id("com.google.gms.google-services") id("com.google.firebase.crashlytics") id("android-app-dependencies") + id("jacoco-app-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - repositories { mavenCentral() google() diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index cff5e2d34f..719175d1a0 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -5,10 +5,7 @@ object Libs { const val kotlin = "1.9.10" - const val platformBom = "org.jetbrains.kotlin:kotlin-bom" const val stdlibJdk8 = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin" - const val test = "org.jetbrains.kotlin:kotlin-test:$kotlin" - const val testJunit5 = "org.jetbrains.kotlin:kotlin-test-junit5" const val reflect = "org.jetbrains.kotlin:kotlin-reflect:$kotlin" } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index f90a3d5a98..7eacef9f80 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -14,4 +14,5 @@ object Versions { const val wearTargetSdk = 29 val javaVersion = JavaVersion.VERSION_11 + const val jacoco = "0.8.11" } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/jacoco-app-dependencies.gradle.kts b/buildSrc/src/main/kotlin/jacoco-app-dependencies.gradle.kts new file mode 100644 index 0000000000..db9a293e9e --- /dev/null +++ b/buildSrc/src/main/kotlin/jacoco-app-dependencies.gradle.kts @@ -0,0 +1,207 @@ +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.NodeChild +import java.io.File +import java.util.Locale +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.register +import org.gradle.testing.jacoco.tasks.JacocoReport +import kotlin.math.roundToInt + +plugins { + id("com.android.application") + id("jacoco") +} + +private val limits = mutableMapOf( + "instruction" to 0.0, + "branch" to 0.0, + "line" to 0.0, + "complexity" to 0.0, + "method" to 0.0, + "class" to 0.0 +) + +extra.set("limits", limits) + +dependencies { + "implementation"("org.jacoco:org.jacoco.core:${Versions.jacoco}") +} + +project.afterEvaluate { + val buildTypes = android.buildTypes.map { type -> type.name } + var productFlavors = android.productFlavors.map { flavor -> flavor.name } + + if (productFlavors.isEmpty()) { + productFlavors = productFlavors + "" + } + + productFlavors.forEach { flavorName -> + buildTypes.forEach { buildTypeName -> + val sourceName: String + val sourcePath: String + + if (flavorName.isEmpty()) { + sourceName = buildTypeName + sourcePath = buildTypeName + } else { + sourceName = "${flavorName}${buildTypeName.replaceFirstChar(Char::titlecase)}" + sourcePath = "${flavorName}/${buildTypeName}" + } + + val testTaskName = "test${sourceName.replaceFirstChar(Char::titlecase)}UnitTest" + //println("Task -> $testTaskName") + + registerCodeCoverageTask( + testTaskName = testTaskName, + sourceName = sourceName, + sourcePath = sourcePath, + flavorName = flavorName, + buildTypeName = buildTypeName + ) + } + } +} + +val excludedFiles = mutableSetOf( + // data binding + "android/databinding/**/*.class", + "**/android/databinding/*Binding.class", + "**/android/databinding/*", + "**/androidx/databinding/*", + "**/BR.*", + // android + "**/R.class", + "**/R$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*Test*.*", + "android/**/*.*", + // kotlin + "**/*MapperImpl*.*", + "**/*\$ViewInjector*.*", + "**/*\$ViewBinder*.*", + "**/BuildConfig.*", + "**/*Component*.*", + "**/*BR*.*", + "**/Manifest*.*", + "**/*\$Lambda\$*.*", + "**/*Companion*.*", + "**/*Module*.*", + "**/*Dagger*.*", + "**/*Hilt*.*", + "**/*MembersInjector*.*", + "**/*_MembersInjector.class", + "**/*_Factory*.*", + "**/*_Provide*Factory*.*", + "**/*Extensions*.*", + // sealed and data classes + "**/*\$Result.*", + "**/*\$Result\$*.*", + // adapters generated by moshi + "**/*JsonAdapter.*" +) + +fun Project.registerCodeCoverageTask( + testTaskName: String, + sourceName: String, + sourcePath: String, + flavorName: String, + buildTypeName: String +) { + tasks.register("${testTaskName}Coverage") { + dependsOn(testTaskName) + group = "Reporting" + description = "Generate Jacoco coverage reports on the ${sourceName.replaceFirstChar(Char::titlecase)} build." + + val javaDirectories = fileTree( + "${project.buildDir}/intermediates/classes/${sourcePath}" + ) { exclude(excludedFiles) } + + val kotlinDirectories = fileTree( + "${project.buildDir}/tmp/kotlin-classes/${sourcePath}" + ) { exclude(excludedFiles) } + + val coverageSrcDirectories = listOf( + "src/main/java", + "src/main/kotlin", + "src/$flavorName/java", + "src/$flavorName/kotlin", + "src/$buildTypeName/java", + "src/$buildTypeName/kotlin" + ) + + classDirectories.setFrom(files(javaDirectories, kotlinDirectories)) + additionalClassDirs.setFrom(files(coverageSrcDirectories)) + sourceDirectories.setFrom(files(coverageSrcDirectories)) + executionData.setFrom( + files("${project.buildDir}/jacoco/${testTaskName}.exec") + ) + + reports { + xml.required.set(true) + html.required.set(true) + } + + doLast { + jacocoTestReport("${testTaskName}Coverage") + } + } +} + +@Suppress("UNCHECKED_CAST") +fun Project.jacocoTestReport(testTaskName: String) { + val reportsDirectory = jacoco.reportsDirectory.asFile.get() + val report = file("$reportsDirectory/${testTaskName}/${testTaskName}.xml") + + logger.lifecycle("Checking coverage results: $report") + + val metrics = report.extractTestsCoveredByType() + val limits = project.extra["limits"] as Map + + val failures = metrics.filter { entry -> + entry.value < limits[entry.key]!! + }.map { entry -> + "- ${entry.key} coverage rate is: ${entry.value}%, minimum is ${limits[entry.key]}%" + } + + if (failures.isNotEmpty()) { + logger.quiet("------------------ Code Coverage Failed -----------------------") + failures.forEach { logger.quiet(it) } + logger.quiet("---------------------------------------------------------------") + throw GradleException("Code coverage failed") + } + + logger.quiet("------------------ Code Coverage Success -----------------------") + metrics.forEach { entry -> + logger.quiet("- ${entry.key} coverage rate is: ${entry.value}%") + } + logger.quiet("---------------------------------------------------------------") +} + +@Suppress("UNCHECKED_CAST") +fun File.extractTestsCoveredByType(): Map { + val xmlReader = XmlSlurper().apply { + setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) + setFeature("http://apache.org/xml/features/disallow-doctype-decl", false) + } + + val counterNodes: List = xmlReader + .parse(this).parent() + .children() + .filter { + (it as NodeChild).name() == "counter" + } as List + + return counterNodes.associate { nodeChild -> + val type = nodeChild.attributes()["type"].toString().lowercase(Locale.ENGLISH) + + val covered = nodeChild.attributes()["covered"].toString().toDouble() + val missed = nodeChild.attributes()["missed"].toString().toDouble() + val percentage = ((covered / (covered + missed)) * 10000.0).roundToInt() / 100.0 + + Pair(type, percentage) + } +} diff --git a/buildSrc/src/main/kotlin/jacoco-module-dependencies.gradle.kts b/buildSrc/src/main/kotlin/jacoco-module-dependencies.gradle.kts new file mode 100644 index 0000000000..e199e8ff78 --- /dev/null +++ b/buildSrc/src/main/kotlin/jacoco-module-dependencies.gradle.kts @@ -0,0 +1,207 @@ +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.NodeChild +import java.io.File +import java.util.Locale +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.register +import org.gradle.testing.jacoco.tasks.JacocoReport +import kotlin.math.roundToInt + +plugins { + id("com.android.library") + id("jacoco") +} + +private val limits = mutableMapOf( + "instruction" to 0.0, + "branch" to 0.0, + "line" to 0.0, + "complexity" to 0.0, + "method" to 0.0, + "class" to 0.0 +) + +extra.set("limits", limits) + +dependencies { + "implementation"("org.jacoco:org.jacoco.core:${Versions.jacoco}") +} + +project.afterEvaluate { + val buildTypes = android.buildTypes.map { type -> type.name } + var productFlavors = android.productFlavors.map { flavor -> flavor.name } + + if (productFlavors.isEmpty()) { + productFlavors = productFlavors + "" + } + + productFlavors.forEach { flavorName -> + buildTypes.forEach { buildTypeName -> + val sourceName: String + val sourcePath: String + + if (flavorName.isEmpty()) { + sourceName = buildTypeName + sourcePath = buildTypeName + } else { + sourceName = "${flavorName}${buildTypeName.replaceFirstChar(Char::titlecase)}" + sourcePath = "${flavorName}/${buildTypeName}" + } + + val testTaskName = "test${sourceName.replaceFirstChar(Char::titlecase)}UnitTest" + //println("Task -> $testTaskName") + + registerCodeCoverageTask( + testTaskName = testTaskName, + sourceName = sourceName, + sourcePath = sourcePath, + flavorName = flavorName, + buildTypeName = buildTypeName + ) + } + } +} + +val excludedFiles = mutableSetOf( + // data binding + "android/databinding/**/*.class", + "**/android/databinding/*Binding.class", + "**/android/databinding/*", + "**/androidx/databinding/*", + "**/BR.*", + // android + "**/R.class", + "**/R$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*Test*.*", + "android/**/*.*", + // kotlin + "**/*MapperImpl*.*", + "**/*\$ViewInjector*.*", + "**/*\$ViewBinder*.*", + "**/BuildConfig.*", + "**/*Component*.*", + "**/*BR*.*", + "**/Manifest*.*", + "**/*\$Lambda\$*.*", + "**/*Companion*.*", + "**/*Module*.*", + "**/*Dagger*.*", + "**/*Hilt*.*", + "**/*MembersInjector*.*", + "**/*_MembersInjector.class", + "**/*_Factory*.*", + "**/*_Provide*Factory*.*", + "**/*Extensions*.*", + // sealed and data classes + "**/*\$Result.*", + "**/*\$Result\$*.*", + // adapters generated by moshi + "**/*JsonAdapter.*" +) + +fun Project.registerCodeCoverageTask( + testTaskName: String, + sourceName: String, + sourcePath: String, + flavorName: String, + buildTypeName: String +) { + tasks.register("${testTaskName}Coverage") { + dependsOn(testTaskName) + group = "Reporting" + description = "Generate Jacoco coverage reports on the ${sourceName.replaceFirstChar(Char::titlecase)} build." + + val javaDirectories = fileTree( + "${project.buildDir}/intermediates/classes/${sourcePath}" + ) { exclude(excludedFiles) } + + val kotlinDirectories = fileTree( + "${project.buildDir}/tmp/kotlin-classes/${sourcePath}" + ) { exclude(excludedFiles) } + + val coverageSrcDirectories = listOf( + "src/main/java", + "src/main/kotlin", + "src/$flavorName/java", + "src/$flavorName/kotlin", + "src/$buildTypeName/java", + "src/$buildTypeName/kotlin" + ) + + classDirectories.setFrom(files(javaDirectories, kotlinDirectories)) + additionalClassDirs.setFrom(files(coverageSrcDirectories)) + sourceDirectories.setFrom(files(coverageSrcDirectories)) + executionData.setFrom( + files("${project.buildDir}/jacoco/${testTaskName}.exec") + ) + + reports { + xml.required.set(true) + html.required.set(true) + } + + doLast { + jacocoTestReport("${testTaskName}Coverage") + } + } +} + +@Suppress("UNCHECKED_CAST") +fun Project.jacocoTestReport(testTaskName: String) { + val reportsDirectory = jacoco.reportsDirectory.asFile.get() + val report = file("$reportsDirectory/${testTaskName}/${testTaskName}.xml") + + logger.lifecycle("Checking coverage results: $report") + + val metrics = report.extractTestsCoveredByType() + val limits = project.extra["limits"] as Map + + val failures = metrics.filter { entry -> + entry.value < limits[entry.key]!! + }.map { entry -> + "- ${entry.key} coverage rate is: ${entry.value}%, minimum is ${limits[entry.key]}%" + } + + if (failures.isNotEmpty()) { + logger.quiet("------------------ Code Coverage Failed -----------------------") + failures.forEach { logger.quiet(it) } + logger.quiet("---------------------------------------------------------------") + throw GradleException("Code coverage failed") + } + + logger.quiet("------------------ Code Coverage Success -----------------------") + metrics.forEach { entry -> + logger.quiet("- ${entry.key} coverage rate is: ${entry.value}%") + } + logger.quiet("---------------------------------------------------------------") +} + +@Suppress("UNCHECKED_CAST") +fun File.extractTestsCoveredByType(): Map { + val xmlReader = XmlSlurper().apply { + setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) + setFeature("http://apache.org/xml/features/disallow-doctype-decl", false) + } + + val counterNodes: List = xmlReader + .parse(this).parent() + .children() + .filter { + (it as NodeChild).name() == "counter" + } as List + + return counterNodes.associate { nodeChild -> + val type = nodeChild.attributes()["type"].toString().lowercase(Locale.ENGLISH) + + val covered = nodeChild.attributes()["covered"].toString().toDouble() + val missed = nodeChild.attributes()["missed"].toString().toDouble() + val percentage = ((covered / (covered + missed)) * 10000.0).roundToInt() / 100.0 + + Pair(type, percentage) + } +} diff --git a/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts b/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts index 87209655de..ed3ccac3b6 100644 --- a/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts +++ b/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts @@ -7,7 +7,7 @@ plugins { } dependencies { - testImplementation(Libs.Kotlin.test) + testImplementation(kotlin("test")) testImplementation(Libs.JUnit.jupiter) testImplementation(Libs.JUnit.jupiterApi) testImplementation(Libs.json) diff --git a/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts b/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts index bd895eef5d..f3c04f1680 100644 --- a/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts +++ b/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts @@ -7,7 +7,7 @@ plugins { } dependencies { - testImplementation(Libs.Kotlin.test) + testImplementation(kotlin("test")) testImplementation(Libs.JUnit.jupiter) testImplementation(Libs.JUnit.jupiterApi) testImplementation(Libs.json) diff --git a/core/interfaces/build.gradle.kts b/core/interfaces/build.gradle.kts index 6454e6befb..4e62e26615 100644 --- a/core/interfaces/build.gradle.kts +++ b/core/interfaces/build.gradle.kts @@ -6,10 +6,9 @@ plugins { id("kotlinx-serialization") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.core.interfaces" diff --git a/core/main/build.gradle.kts b/core/main/build.gradle.kts index 48aef57a52..8968e8631d 100644 --- a/core/main/build.gradle.kts +++ b/core/main/build.gradle.kts @@ -6,10 +6,9 @@ plugins { id("android-module-dependencies") id("all-open-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.core.main" } diff --git a/core/main/jacoco_global.gradle b/core/main/jacoco_global.gradle deleted file mode 100644 index bad27e4fe7..0000000000 --- a/core/main/jacoco_global.gradle +++ /dev/null @@ -1,95 +0,0 @@ -project.afterEvaluate { project -> - setupAndroidReporting() -} - -def setupAndroidReporting() { - tasks.withType(Test) { - // Whether or not classes without source location should be instrumented - jacoco.includeNoLocationClasses = true - jacoco.excludes = ['jdk.internal.*'] - } - - def buildTypes = ["debug", "fullDebug"] - - def productFlavors = android.productFlavors.collect { flavor -> - flavor.name - } - // When no product flavors defined, use empty - if (!productFlavors) productFlavors.add('') - productFlavors.each { productFlavorName -> - buildTypes.each { buildTypeName -> - def sourceName, sourcePath - if (!productFlavorName) { - sourceName = sourcePath = "${buildTypeName}" - } else { - sourceName = "${productFlavorName}${buildTypeName.capitalize()}" - sourcePath = "${productFlavorName}/${buildTypeName}" - } - def testTaskName = "test${sourceName.capitalize()}UnitTest" - // System.out.println("Task -> $testTaskName") - - // Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest' - task "${testTaskName}Coverage"(type: JacocoReport, dependsOn: "$testTaskName") { - group = "Reporting" - description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build." - - def fileFilter = [ - // data binding - 'android/databinding/**/*.class', - '**/android/databinding/*Binding.class', - '**/android/databinding/*', - '**/androidx/databinding/*', - '**/BR.*', - // android - '**/R.class', - '**/R$*.class', - '**/BuildConfig.*', - '**/Manifest*.*', - '**/*Test*.*', - 'android/**/*.*', - // kotlin - '**/*MapperImpl*.*', - '**/*$ViewInjector*.*', - '**/*$ViewBinder*.*', - '**/BuildConfig.*', - '**/*Component*.*', - '**/*BR*.*', - '**/Manifest*.*', - '**/*$Lambda$*.*', - '**/*Companion*.*', - '**/*Module*.*', - '**/*Dagger*.*', - '**/*Hilt*.*', - '**/*MembersInjector*.*', - '**/*_MembersInjector.class', - '**/*_Factory*.*', - '**/*_Provide*Factory*.*', - '**/*Extensions*.*', - // sealed and data classes - '**/*$Result.*', - '**/*$Result$*.*', - // adapters generated by moshi - '**/*JsonAdapter.*', - ] - - def javaTree = fileTree(dir: "${project.buildDir}/intermediates/javac/$sourceName/classes", excludes: fileFilter) - def kotlinTree = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/$sourceName", excludes: fileFilter) - classDirectories.from = files([javaTree], [kotlinTree]) - executionData.from = files("${project.buildDir}/jacoco/${testTaskName}.exec") - def coverageSourceDirs = ["src/main/java", - "src/$productFlavorName/java", - "src/$buildTypeName/java"] - - sourceDirectories.setFrom(files(coverageSourceDirs)) - additionalSourceDirs.setFrom(files(coverageSourceDirs)) - - reports { - csv.required = false - xml.required = true - html.required = true - } - } - } - } -} - diff --git a/core/utils/build.gradle.kts b/core/utils/build.gradle.kts index 71d7d96f7c..f5366c8fd6 100644 --- a/core/utils/build.gradle.kts +++ b/core/utils/build.gradle.kts @@ -6,10 +6,9 @@ plugins { id("android-module-dependencies") id("all-open-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.core.utils" } diff --git a/core/validators/build.gradle.kts b/core/validators/build.gradle.kts index a0bbdfeb45..8b82e097e5 100644 --- a/core/validators/build.gradle.kts +++ b/core/validators/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.core.validators" } diff --git a/database/impl/build.gradle.kts b/database/impl/build.gradle.kts index 297ece9cc4..612b649d93 100644 --- a/database/impl/build.gradle.kts +++ b/database/impl/build.gradle.kts @@ -5,10 +5,9 @@ plugins { id("kotlin-allopen") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.database.impl" diff --git a/implementation/build.gradle.kts b/implementation/build.gradle.kts index c68a3211cd..1e42bffd00 100644 --- a/implementation/build.gradle.kts +++ b/implementation/build.gradle.kts @@ -5,10 +5,9 @@ plugins { id("android-module-dependencies") id("all-open-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.implementation" } diff --git a/insight/build.gradle.kts b/insight/build.gradle.kts index b62eae7095..4e2a561932 100644 --- a/insight/build.gradle.kts +++ b/insight/build.gradle.kts @@ -4,9 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") android { namespace = "info.nightscout.androidaps.insight" diff --git a/plugins/aps/build.gradle.kts b/plugins/aps/build.gradle.kts index 1bad435573..fae1e7a91d 100644 --- a/plugins/aps/build.gradle.kts +++ b/plugins/aps/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.aps" } diff --git a/plugins/automation/build.gradle.kts b/plugins/automation/build.gradle.kts index 6c5615cfe5..a0d4361dd5 100644 --- a/plugins/automation/build.gradle.kts +++ b/plugins/automation/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.automation" } diff --git a/plugins/configuration/build.gradle.kts b/plugins/configuration/build.gradle.kts index ffa40d3556..0a16c630da 100644 --- a/plugins/configuration/build.gradle.kts +++ b/plugins/configuration/build.gradle.kts @@ -5,10 +5,9 @@ plugins { id("kotlin-parcelize") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.configuration" } diff --git a/plugins/constraints/build.gradle.kts b/plugins/constraints/build.gradle.kts index cdaa7fdc04..3bd3c95a85 100644 --- a/plugins/constraints/build.gradle.kts +++ b/plugins/constraints/build.gradle.kts @@ -5,10 +5,9 @@ plugins { id("android-module-dependencies") id("test-module-dependencies") id("all-open-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.constraints" } diff --git a/plugins/insulin/build.gradle.kts b/plugins/insulin/build.gradle.kts index 56bd432a5a..33e7514873 100644 --- a/plugins/insulin/build.gradle.kts +++ b/plugins/insulin/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.insulin" } diff --git a/plugins/main/build.gradle.kts b/plugins/main/build.gradle.kts index b7a2184282..62f7951e91 100644 --- a/plugins/main/build.gradle.kts +++ b/plugins/main/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.main" } diff --git a/plugins/sensitivity/build.gradle.kts b/plugins/sensitivity/build.gradle.kts index 8d97c7db2f..c81647e025 100644 --- a/plugins/sensitivity/build.gradle.kts +++ b/plugins/sensitivity/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.sensitivity" } diff --git a/plugins/smoothing/build.gradle.kts b/plugins/smoothing/build.gradle.kts index 9d612710a5..8acf11e836 100644 --- a/plugins/smoothing/build.gradle.kts +++ b/plugins/smoothing/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.smoothing" } diff --git a/plugins/source/build.gradle.kts b/plugins/source/build.gradle.kts index 244cdb7b47..df0c6cf34a 100644 --- a/plugins/source/build.gradle.kts +++ b/plugins/source/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.source" } diff --git a/plugins/sync/build.gradle.kts b/plugins/sync/build.gradle.kts index 5db40cd140..e0b7a0d1ad 100644 --- a/plugins/sync/build.gradle.kts +++ b/plugins/sync/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.plugins.sync" } diff --git a/pump/combo/build.gradle.kts b/pump/combo/build.gradle.kts index aceaa5418b..a7948278fd 100644 --- a/pump/combo/build.gradle.kts +++ b/pump/combo/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { buildFeatures { diff --git a/pump/combov2/build.gradle.kts b/pump/combov2/build.gradle.kts index 3e3d7ed73e..014d99c473 100644 --- a/pump/combov2/build.gradle.kts +++ b/pump/combov2/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.combov2" buildFeatures { diff --git a/pump/combov2/comboctl/build.gradle.kts b/pump/combov2/comboctl/build.gradle.kts index 545ce3fdf2..2f194b6acb 100644 --- a/pump/combov2/comboctl/build.gradle.kts +++ b/pump/combov2/comboctl/build.gradle.kts @@ -2,11 +2,9 @@ plugins { id("com.android.library") id("kotlin-android") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.comboctl" sourceSets.getByName("main") { @@ -20,14 +18,12 @@ android { } dependencies { - implementation(platform(Libs.Kotlin.platformBom)) - testImplementation(Libs.Kotlin.test) - testImplementation(Libs.Kotlin.testJunit5) - api(Libs.KotlinX.coroutinesCore) api(Libs.KotlinX.datetime) api(Libs.AndroidX.core) + + testImplementation(kotlin("test")) testImplementation(Libs.kotlinTestRunner) testRuntimeOnly(Libs.JUnit.jupiterEngine) } \ No newline at end of file diff --git a/pump/dana/build.gradle.kts b/pump/dana/build.gradle.kts index 3f223198cd..1b030af2b3 100644 --- a/pump/dana/build.gradle.kts +++ b/pump/dana/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.dana" diff --git a/pump/danar/build.gradle.kts b/pump/danar/build.gradle.kts index fb0644393e..da6ca39c80 100644 --- a/pump/danar/build.gradle.kts +++ b/pump/danar/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.danar" } diff --git a/pump/danars/build.gradle.kts b/pump/danars/build.gradle.kts index f76b29187c..76b977c0ca 100644 --- a/pump/danars/build.gradle.kts +++ b/pump/danars/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.danars" ndkVersion = Versions.ndkVersion diff --git a/pump/diaconn/build.gradle.kts b/pump/diaconn/build.gradle.kts index b05c29cfa2..e349993b8c 100644 --- a/pump/diaconn/build.gradle.kts +++ b/pump/diaconn/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.diaconn" diff --git a/pump/eopatch/build.gradle.kts b/pump/eopatch/build.gradle.kts index b8317c64d7..e745baa5f1 100644 --- a/pump/eopatch/build.gradle.kts +++ b/pump/eopatch/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.eopatch" buildFeatures { diff --git a/pump/medtronic/build.gradle.kts b/pump/medtronic/build.gradle.kts index c17f1a63d6..0c38a6f7f5 100644 --- a/pump/medtronic/build.gradle.kts +++ b/pump/medtronic/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.medtronic" } diff --git a/pump/medtrum/build.gradle.kts b/pump/medtrum/build.gradle.kts index 242c15cd71..d39da5f847 100644 --- a/pump/medtrum/build.gradle.kts +++ b/pump/medtrum/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.medtrum" buildFeatures { diff --git a/pump/omnipod-common/build.gradle.kts b/pump/omnipod-common/build.gradle.kts index d1aa2127a4..aae2bad174 100644 --- a/pump/omnipod-common/build.gradle.kts +++ b/pump/omnipod-common/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.omnipod.common" } diff --git a/pump/omnipod-dash/build.gradle.kts b/pump/omnipod-dash/build.gradle.kts index 5af1097055..ca97eb800b 100644 --- a/pump/omnipod-dash/build.gradle.kts +++ b/pump/omnipod-dash/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.omnipod.dash" diff --git a/pump/omnipod-eros/build.gradle.kts b/pump/omnipod-eros/build.gradle.kts index 3e72a54c88..ddecc8e592 100644 --- a/pump/omnipod-eros/build.gradle.kts +++ b/pump/omnipod-eros/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.omnipod.eros" diff --git a/pump/pump-common/build.gradle.kts b/pump/pump-common/build.gradle.kts index 601102d151..27572c08cd 100644 --- a/pump/pump-common/build.gradle.kts +++ b/pump/pump-common/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.pump.common" } diff --git a/pump/rileylink/build.gradle.kts b/pump/rileylink/build.gradle.kts index 3682f1c5b4..6dec816cf3 100644 --- a/pump/rileylink/build.gradle.kts +++ b/pump/rileylink/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "info.nightscout.androidaps.plugins.pump.common.hw.rileylink" } diff --git a/pump/virtual/build.gradle.kts b/pump/virtual/build.gradle.kts index e2350981c1..eafad6764e 100644 --- a/pump/virtual/build.gradle.kts +++ b/pump/virtual/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.pump.virtual" } diff --git a/shared/impl/build.gradle.kts b/shared/impl/build.gradle.kts index 25056e51bf..59baf7a5a9 100644 --- a/shared/impl/build.gradle.kts +++ b/shared/impl/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.shared.impl" defaultConfig { diff --git a/shared/tests/build.gradle.kts b/shared/tests/build.gradle.kts index 56da924512..7229eec8dd 100644 --- a/shared/tests/build.gradle.kts +++ b/shared/tests/build.gradle.kts @@ -2,10 +2,9 @@ plugins { id("com.android.library") id("kotlin-android") id("android-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.shared.tests" } diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index 759741ad6f..447b448b3e 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -4,10 +4,9 @@ plugins { id("kotlin-kapt") id("android-module-dependencies") id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.ui" } diff --git a/wear/build.gradle.kts b/wear/build.gradle.kts index 851d3be7b4..9e074ec8c1 100644 --- a/wear/build.gradle.kts +++ b/wear/build.gradle.kts @@ -8,10 +8,9 @@ plugins { id("kotlin-kapt") id("android-app-dependencies") id("test-app-dependencies") + id("jacoco-app-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - repositories { google() mavenCentral() diff --git a/workflow/build.gradle.kts b/workflow/build.gradle.kts index 3a6016a28a..bc6c9d8d12 100644 --- a/workflow/build.gradle.kts +++ b/workflow/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("kotlin-android") id("kotlin-kapt") id("android-module-dependencies") - id("test-module-dependencies") + id("jacoco-module-dependencies") } -apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") - android { namespace = "app.aaps.workflow" }