From de1452a674cc46f0851bab2968ac349f327427ba Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Thu, 13 Jan 2022 02:56:34 +0300 Subject: [PATCH] Disabled running of all test tasks for single-project Kover tasks Resolves #114 --- README.md | 82 +++++++++-------- .../test/functional/cases/AdaptersTests.kt | 4 +- .../functional/cases/MultiProjectTests.kt | 64 ++++++++----- .../functional/cases/ReportsCachingTests.kt | 22 ++--- .../kover/test/functional/core/Types.kt | 1 + .../kover/test/functional/core/Writer.kt | 43 ++++++--- src/main/kotlin/kotlinx/kover/KoverPlugin.kt | 89 +++++++++---------- src/main/kotlin/kotlinx/kover/Providers.kt | 14 +-- .../kotlinx/kover/api/KoverConstants.kt | 20 ++--- .../kotlinx/kover/api/KoverExtension.kt | 15 +++- ...ProjectsTask.kt => KoverCollectingTask.kt} | 2 +- .../kotlinx/kover/tasks/KoverHtmlReport.kt | 6 +- ...verAggregateTask.kt => KoverMergedTask.kt} | 2 +- .../kotlinx/kover/tasks/KoverVerification.kt | 18 ++-- .../kotlinx/kover/tasks/KoverXmlReport.kt | 4 +- 15 files changed, 222 insertions(+), 164 deletions(-) rename src/main/kotlin/kotlinx/kover/tasks/{KoverCollectingProjectsTask.kt => KoverCollectingTask.kt} (95%) rename src/main/kotlin/kotlinx/kover/tasks/{KoverAggregateTask.kt => KoverMergedTask.kt} (97%) diff --git a/README.md b/README.md index 281a45cd..604196f3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Minimal supported `Gradle` version: `6.4`. - [Apply plugin to a multi-project build](#apply-plugin-to-a-multi-project-build) - [Configuration](#configuration) - [Configuring JVM test task](#configuring-jvm-test-task) - - [Configuring aggregated reports](#configuring-aggregated-reports) + - [Configuring merged reports](#configuring-merged-reports) - [Configuring project reports](#configuring-project-reports) - [Configuring entire plugin](#configuring-entire-plugin) - [Verification](#verification) @@ -191,8 +191,8 @@ android { -### Configuring aggregated reports -Aggregated reports combine classpath and coverage stats from the project in which the plugin is applied and all of its subprojects. +### Configuring merged reports +Merged reports combine classpath and coverage stats from the project in which the plugin is applied and all of its subprojects. If you need to change the name of the XML report file or HTML directory, you may configure the corresponding tasks in the project in which the plugin is applied (usually this is the root project): @@ -201,14 +201,14 @@ the project in which the plugin is applied (usually this is the root project): Kotlin ```kotlin -tasks.koverHtmlReport { +tasks.koverMergedHtmlReport { isEnabled = true // false to disable report generation - htmlReportDir.set(layout.buildDirectory.dir("my-agg-report/html-result")) + htmlReportDir.set(layout.buildDirectory.dir("my-merged-report/html-result")) } -tasks.koverXmlReport { +tasks.koverMergedXmlReport { isEnabled = true // false to disable report generation - xmlReportFile.set(layout.buildDirectory.file("my-agg-report/result.xml")) + xmlReportFile.set(layout.buildDirectory.file("my-merged-report/result.xml")) } ``` @@ -217,14 +217,14 @@ tasks.koverXmlReport { Groovy ```groovy -tasks.koverHtmlReport { +tasks.koverMergedHtmlReport { enabled = true // false to disable report generation - htmlReportDir.set(layout.buildDirectory.dir("my-reports/html-result")) + htmlReportDir.set(layout.buildDirectory.dir("my-merged-report/html-result")) } -tasks.koverXmlReport { +tasks.koverMergedXmlReport { enabled = true // false to disable report generation - xmlReportFile.set(layout.buildDirectory.file("my-reports/result.xml")) + xmlReportFile.set(layout.buildDirectory.file("my-merged-report/result.xml")) } ``` @@ -238,12 +238,12 @@ the corresponding tasks in this project: Kotlin ```kotlin -tasks.koverHtmlProjectReport { +tasks.koverHtmlReport { isEnabled = true // false to disable report generation htmlReportDir.set(layout.buildDirectory.dir("my-project-report/html-result")) } -tasks.koverXmlProjectReport { +tasks.koverXmlReport { isEnabled = true // false to disable report generation xmlReportFile.set(layout.buildDirectory.file("my-project-report/result.xml")) } @@ -254,19 +254,25 @@ tasks.koverXmlProjectReport { Groovy ```groovy -tasks.koverHtmlProjectReport { +tasks.koverHtmlReport { enabled = true // false to disable report generation htmlReportDir.set(layout.buildDirectory.dir("my-project-report/html-result")) } -tasks.koverXmlProjectReport { +tasks.koverXmlReport { enabled = true // false to disable report generation xmlReportFile.set(layout.buildDirectory.file("my-project-report/result.xml")) } ``` -You may collect all project reports into one directory using the `koverCollectProjectsReports` task. +By default, for tasks `koverHtmlReport` and `koverXmlReport` coverage is calculated only for the tests of the one project. +If classes or functions are called from tests of another module, then you need to set a flag `runAllTestsForProjectTask` for `KoverExtension` to `true` ([see](#configuring-entire-plugin)). + +**In this case, then running tasks `koverHtmlReport` or `koverXmlReport` will trigger the execution of all active tests from all projects!** + + +You may collect all project reports into one directory using the `koverCollectReports` task. Also, you may specify a custom directory to collect project reports in the build directory of the project in which the plugin is applied (usually this is the root project): @@ -274,7 +280,7 @@ is applied (usually this is the root project): Kotlin ```kotlin -tasks.koverCollectProjectsReports { +tasks.koverCollectReports { outputDir.set(layout.buildDirectory.dir("all-projects-reports") ) } ``` @@ -284,7 +290,7 @@ tasks.koverCollectProjectsReports { Groovy ```groovy -tasks.koverCollectProjectsReports { +tasks.koverCollectReports { outputDir.set(layout.buildDirectory.dir("all-projects-reports") ) } ``` @@ -302,9 +308,10 @@ kover { coverageEngine.set(kotlinx.kover.api.CoverageEngine.INTELLIJ) // change instrumentation agent and reporter intellijEngineVersion.set("1.0.640") // change version of IntelliJ agent and reporter jacocoEngineVersion.set("0.8.7") // change version of JaCoCo agent and reporter - generateReportOnCheck.set(true) // false to do not execute `koverReport` task before `check` task + generateReportOnCheck.set(true) // false to do not execute `koverMergedReport` task before `check` task disabledProjects = setOf() // setOf("project-name") to disable coverage for project with name `project-name` instrumentAndroidPackage = false // true to instrument packages `android.*` and `com.android.*` + runAllTestsForProjectTask = false // true to run all tests in all projects if `koverHtmlReport`, `koverXmlReport`, `koverReport`, `koverVerify` or `check` tasks executed on some project } ``` @@ -318,9 +325,10 @@ kover { coverageEngine.set(kotlinx.kover.api.CoverageEngine.INTELLIJ) // change instrumentation agent and reporter intellijEngineVersion.set('1.0.640') // change version of IntelliJ agent and reporter jacocoEngineVersion.set('0.8.7') // change version of JaCoCo agent and reporter - generateReportOnCheck.set(true) // false to do not execute `koverReport` task before `check` task + generateReportOnCheck.set(true) // false to do not execute `koverMergedReport` task before `check` task disabledProjects = [] // ["project-name"] to disable coverage for project with name `project-name` instrumentAndroidPackage = false // true to instrument packages `android.*` and `com.android.*` + runAllTestsForProjectTask = false // true to run all tests in all projects if `koverHtmlReport`, `koverXmlReport`, `koverReport`, `koverVerify` or `check` tasks executed on some project } ``` @@ -333,14 +341,14 @@ Validation rules work for both types of agents. *The plugin currently only supports line counter values.* -To add a rule to check coverage from the code of all projects, you need to add configuration to the project in which the plugin +To add a rule to check coverage of the code of all projects, you need to add configuration to the project in which the plugin is applied (usually this is the root project):
Kotlin ```kotlin -tasks.koverVerify { +tasks.koverMergedVerify { rule { name = "Minimum number of lines covered" bound { @@ -371,7 +379,7 @@ tasks.koverVerify { Groovy ```groovy -tasks.koverVerify { +tasks.koverMergedVerify { rule { name = "Minimum number of lines covered" bound { @@ -398,13 +406,13 @@ tasks.koverVerify { ```
-To add rules for code coverage checks for one specific project, you need to add a configuration to this project: +To add rules for code coverage checks for the code of one specific project, you need to add a configuration to this project:
Kotlin ```kotlin -tasks.koverProjectVerify { +tasks.koverVerify { rule { name = "Minimal line coverage rate in percent" bound { @@ -419,7 +427,7 @@ tasks.koverProjectVerify { Groovy ```groovy -tasks.koverProjectVerify { +tasks.koverVerify { rule { name = "Minimal line coverage rate in percent" bound { @@ -430,20 +438,24 @@ tasks.koverProjectVerify { ```
+By default, for the task `koverVerify` coverage is calculated only for the tests of the one project. +If classes or functions are called from tests of another module, then you need to set a flag `runAllTestsForProjectTask` for `KoverExtension` to `true` ([see](#configuring-entire-plugin)). + +**In this case, if verification rules are added, then running tasks `koverVerify` or `check` will trigger the execution of all active tests from all projects!** ## Tasks The plugin, when applied, automatically creates tasks for the project in which it is applied (usually this is the root project): -- `koverHtmlReport` - Generates code coverage HTML report for all enabled test tasks in all projects. -- `koverXmlReport` - Generates code coverage XML report for all enabled test tasks in all projects. -- `koverReport` - Executes both `koverXmlReport` and `koverHtmlReport` tasks. Executes before `check` task if property `generateReportOnCheck` for `KoverExtension` is `true` ([see](#configuring-entire-plugin)). -- `koverVerify` - Verifies code coverage metrics of all projects based on specified rules. Always executes before `check` task. -- `koverCollectProjectsReports` - Collects all projects reports into one directory. Default directory is `$buildDir/reports/kover/projects`, names for XML reports and dirs for HTML are projects names. Executing this task does not run `koverXmlReport` or `koverHtmlReport`, it only copies previously created reports if they exist to the output directory. +- `koverMergedHtmlReport` - Generates code coverage HTML report for all enabled test tasks in all projects. +- `koverMergedXmlReport` - Generates code coverage XML report for all enabled test tasks in all projects. +- `koverMergedReport` - Executes both `koverMergedXmlReport` and `koverMergedHtmlReport` tasks. Executes before `check` task if property `generateReportOnCheck` for `KoverExtension` is `true` ([see](#configuring-entire-plugin)). +- `koverMergedVerify` - Verifies code coverage metrics of all projects based on specified rules. Always executes before `check` task. +- `koverCollectReports` - Collects all projects reports into one directory. Default directory is `$buildDir/reports/kover/projects`, names for XML reports and dirs for HTML are projects names. Executing this task does not run `koverMergedXmlReport` or `koverMergedHtmlReport`, it only copies previously created reports if they exist to the output directory. Tasks that are created for all projects: -- `koverHtmlProjectReport` - Generates code coverage HTML report for all enabled test tasks in one project. -- `koverXmlProjectReport` - Generates code coverage XML report for all enabled test tasks in one project. -- `koverProjectReport` - Executes both `koverXmlProjectReport` and `koverHtmlProjectReport` tasks. -- `koverProjectVerify` - Verifies code coverage metrics of one project based on specified rules. Always executes before `check` task. +- `koverHtmlReport` - Generates code coverage HTML report for all enabled test tasks in one project. +- `koverXmlReport` - Generates code coverage XML report for all enabled test tasks in one project. +- `koverReport` - Executes both `koverXmlReport` and `koverHtmlReport` tasks. +- `koverVerify` - Verifies code coverage metrics of one project based on specified rules. Always executes before `check` task. ## Implicit plugin dependencies diff --git a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/AdaptersTests.kt b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/AdaptersTests.kt index 9f3305ce..e7328274 100644 --- a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/AdaptersTests.kt +++ b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/AdaptersTests.kt @@ -15,7 +15,7 @@ internal class AdaptersTests : BaseGradleScriptTest() { Therefore, Kover is forced to use reflection to work with extensions of the kotlin multiplatform plugin. */ internalSample("different-plugins") - .run("koverXmlReport") { + .run("koverMergedXmlReport") { xml(defaultXmlReport()) { assertCounterFullyCovered(classCounter("org.jetbrains.CommonClass")) assertCounterFullyCovered(classCounter("org.jetbrains.JvmClass")) @@ -23,7 +23,7 @@ internal class AdaptersTests : BaseGradleScriptTest() { } internalSample("different-plugins") - .run("koverXmlProjectReport") { + .run("koverXmlReport") { subproject("subproject-multiplatform") { xml(defaultXmlProjectReport()) { assertCounterFullyCovered(classCounter("org.jetbrains.CommonClass")) diff --git a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/MultiProjectTests.kt b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/MultiProjectTests.kt index fc9fe2fa..47577ec2 100644 --- a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/MultiProjectTests.kt +++ b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/MultiProjectTests.kt @@ -11,18 +11,14 @@ internal class MultiProjectTests : BaseGradleScriptTest() { private val subprojectName = "common" @Test - fun testAggregateReports() { - builder("Testing the generation of aggregating reports") + fun testMergedReports() { + builder("Testing the generation of merged reports") .types(ProjectType.KOTLIN_JVM, ProjectType.KOTLIN_MULTIPLATFORM) .engines(CoverageEngine.INTELLIJ, CoverageEngine.JACOCO) .sources("multiproject-user") .subproject(subprojectName) { sources("multiproject-common") } - .dependency( - "implementation(project(\":$subprojectName\"))", - "implementation project(':$subprojectName')" - ) .build() .run("build") { xml(defaultXmlReport()) { @@ -34,20 +30,16 @@ internal class MultiProjectTests : BaseGradleScriptTest() { } @Test - fun testProjectsReports() { - builder("Testing the generation of project reports") + fun testIsolatedProjectsReports() { + builder("Testing the generation of project reports with running tests only for this project") .types(ProjectType.KOTLIN_JVM, ProjectType.KOTLIN_MULTIPLATFORM) .engines(CoverageEngine.INTELLIJ, CoverageEngine.JACOCO) .sources("multiproject-user") .subproject(subprojectName) { sources("multiproject-common") } - .dependency( - "implementation(project(\":$subprojectName\"))", - "implementation project(':$subprojectName')" - ) .build() - .run("koverProjectReport") { + .run("koverReport") { xml(defaultXmlProjectReport()) { assertCounterAbsent(classCounter("org.jetbrains.CommonClass")) assertCounterAbsent(classCounter("org.jetbrains.CommonInternalClass")) @@ -56,37 +48,65 @@ internal class MultiProjectTests : BaseGradleScriptTest() { subproject(subprojectName) { xml(defaultXmlProjectReport()) { + assertCounterAbsent(classCounter("org.jetbrains.UserClass")) + + // common class covered partially because calls from the root project are not counted + assertCounterCovered(classCounter("org.jetbrains.CommonClass")) + assertCounterCovered(classCounter("org.jetbrains.CommonInternalClass")) + } + } + } + } + + @Test + fun testLinkedProjectsReports() { + builder("Testing the generation of project reports with running all tests for all projects") + .types(ProjectType.KOTLIN_JVM, ProjectType.KOTLIN_MULTIPLATFORM) + .engines(CoverageEngine.INTELLIJ, CoverageEngine.JACOCO) + .configKover { runAllTestsForProjectTask = true } + .sources("multiproject-user") + .subproject(subprojectName) { + sources("multiproject-common") + } + .build() + .run("koverReport") { + xml(defaultXmlProjectReport()) { + assertCounterAbsent(classCounter("org.jetbrains.CommonClass")) + assertCounterAbsent(classCounter("org.jetbrains.CommonInternalClass")) + assertCounterFullyCovered(classCounter("org.jetbrains.UserClass")) + } + + subproject(subprojectName) { + xml(defaultXmlProjectReport()) { + assertCounterAbsent(classCounter("org.jetbrains.UserClass")) + + // common class fully covered because calls from the root project are counted too assertCounterFullyCovered(classCounter("org.jetbrains.CommonClass")) assertCounterFullyCovered(classCounter("org.jetbrains.CommonInternalClass")) - assertCounterAbsent(classCounter("org.jetbrains.UserClass")) } } } } @Test - fun testDisableProject() { - builder("Testing the generation of projects reports") + fun testDisableSubproject() { + builder("Testing disabling tests of subproject") .types(ProjectType.KOTLIN_JVM, ProjectType.KOTLIN_MULTIPLATFORM) .engines(CoverageEngine.INTELLIJ, CoverageEngine.JACOCO) .sources("multiproject-user") .subproject(subprojectName) { sources("multiproject-common") } - .dependency( - "implementation(project(\":$subprojectName\"))", - "implementation project(':$subprojectName')" - ) .configKover { disabledProjects += subprojectName } .build() - .run("build", "koverProjectReport") { + .run("build", "koverReport") { checkDefaultBinaryReport() checkDefaultReports() checkDefaultProjectReports() xml(defaultXmlReport()) { assertCounterFullyCovered(classCounter("org.jetbrains.UserClass")) - // classes from disabled project should not be included in the aggregated report + // classes from disabled project should not be included in the merged report assertCounterAbsent(classCounter("org.jetbrains.CommonClass")) assertCounterAbsent(classCounter("org.jetbrains.CommonInternalClass")) } diff --git a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/ReportsCachingTests.kt b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/ReportsCachingTests.kt index dae5715a..9f70276c 100644 --- a/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/ReportsCachingTests.kt +++ b/src/functionalTest/kotlin/kotlinx/kover/test/functional/cases/ReportsCachingTests.kt @@ -9,7 +9,7 @@ import kotlin.test.* internal class ReportsCachingTests : BaseGradleScriptTest() { @Test fun testCaching() { - builder("Test caching aggregate reports") + builder("Test caching of merged reports") .engines(CoverageEngine.INTELLIJ, CoverageEngine.JACOCO) .sources("simple") .withLocalCache() @@ -18,8 +18,8 @@ internal class ReportsCachingTests : BaseGradleScriptTest() { checkDefaultBinaryReport() checkDefaultReports() outcome(":test") { assertEquals(TaskOutcome.SUCCESS, this) } - outcome(":koverXmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } - outcome(":koverHtmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } + outcome(":koverMergedXmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } + outcome(":koverMergedHtmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } } .run("clean", "--build-cache") { checkDefaultBinaryReport(false) @@ -29,8 +29,8 @@ internal class ReportsCachingTests : BaseGradleScriptTest() { checkDefaultBinaryReport() checkDefaultReports() outcome(":test") { assertEquals(TaskOutcome.FROM_CACHE, this) } - outcome(":koverXmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } - outcome(":koverHtmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } + outcome(":koverMergedXmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } + outcome(":koverMergedHtmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } } } @@ -41,23 +41,23 @@ internal class ReportsCachingTests : BaseGradleScriptTest() { .sources("simple") .withLocalCache() .build() - .run("koverProjectReport", "--build-cache") { + .run("koverReport", "--build-cache") { checkDefaultBinaryReport() checkDefaultProjectReports() outcome(":test") { assertEquals(TaskOutcome.SUCCESS, this) } - outcome(":koverXmlProjectReport") { assertEquals(TaskOutcome.SUCCESS, this) } - outcome(":koverHtmlProjectReport") { assertEquals(TaskOutcome.SUCCESS, this) } + outcome(":koverXmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } + outcome(":koverHtmlReport") { assertEquals(TaskOutcome.SUCCESS, this) } } .run("clean", "--build-cache") { checkDefaultBinaryReport(false) checkDefaultProjectReports(false) } - .run("koverProjectReport", "--build-cache") { + .run("koverReport", "--build-cache") { checkDefaultBinaryReport() checkDefaultProjectReports() outcome(":test") { assertEquals(TaskOutcome.FROM_CACHE, this) } - outcome(":koverXmlProjectReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } - outcome(":koverHtmlProjectReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } + outcome(":koverXmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } + outcome(":koverHtmlReport") { assertEquals(TaskOutcome.FROM_CACHE, this) } } } diff --git a/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Types.kt b/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Types.kt index 055e27c9..59f2e500 100644 --- a/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Types.kt +++ b/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Types.kt @@ -47,6 +47,7 @@ internal data class KoverRootConfig( var intellijVersion: String? = null, var jacocoVersion: String? = null, var generateReportOnCheck: Boolean? = null, + var runAllTestsForProjectTask: Boolean? = null, val disabledProjects: MutableSet = mutableSetOf() ) { val isDefault = diff --git a/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Writer.kt b/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Writer.kt index 8aba1224..c91eb51f 100644 --- a/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Writer.kt +++ b/src/functionalTest/kotlin/kotlinx/kover/test/functional/core/Writer.kt @@ -1,6 +1,7 @@ package kotlinx.kover.test.functional.core import kotlinx.kover.api.* +import kotlinx.kover.test.functional.core.GradleScriptLanguage.KOTLIN import java.io.* private const val TEMPLATES_PATH = "src/functionalTest/templates" @@ -15,7 +16,7 @@ internal fun CommonBuilderState.createProject(rootDir: File, slice: ProjectSlice val buildScript = loadScriptTemplate(true, slice) .processRootBuildScript(this, slice) - .processProjectBuildScript(rootProject, slice) + .processProjectBuildScript(rootProject, slice, subprojects.keys) File(projectDir, "build.$extension").writeText(buildScript) File(projectDir, "settings.$extension").writeText(buildSettings(slice)) @@ -40,7 +41,7 @@ private fun ProjectBuilderState.writeSubproject(directory: File, slice: ProjectS } -private val ProjectSlice.scriptExtension get() = if (language == GradleScriptLanguage.KOTLIN) "gradle.kts" else "gradle" +private val ProjectSlice.scriptExtension get() = if (language == KOTLIN) "gradle.kts" else "gradle" private val ProjectSlice.srcPath: String get() { @@ -66,9 +67,13 @@ private fun String.processRootBuildScript(state: CommonBuilderState, slice: Proj .replace("//KOVER", state.buildRootExtension(slice)) } -private fun String.processProjectBuildScript(state: ProjectBuilderState, slice: ProjectSlice): String { +private fun String.processProjectBuildScript( + state: ProjectBuilderState, + slice: ProjectSlice, + subprojects: Set = emptySet() +): String { return replace("//REPOSITORIES", "") - .replace("//DEPENDENCIES", state.buildDependencies(slice)) + .replace("//DEPENDENCIES", state.buildDependencies(slice, subprojects)) .replace("//SCRIPTS", state.buildScripts(slice)) .replace("//TEST_TASK", state.buildTestTask(slice)) .replace("//VERIFICATIONS", state.buildVerifications(slice)) @@ -99,7 +104,7 @@ private fun ProjectBuilderState.writeSources(projectDir: File, slice: ProjectSli } private fun ProjectSlice.scriptPath(): String { - val languageString = if (language == GradleScriptLanguage.KOTLIN) "kotlin" else "groovy" + val languageString = if (language == KOTLIN) "kotlin" else "groovy" val typeString = when (type) { ProjectType.KOTLIN_JVM -> "kjvm" ProjectType.KOTLIN_MULTIPLATFORM -> "kmp" @@ -140,8 +145,8 @@ private fun CommonBuilderState.buildRootExtension(slice: ProjectSlice): String { builder.appendLine("kover {") if (koverConfig.disabled != null) { - val property = if (slice.language == GradleScriptLanguage.KOTLIN) "isEnabled" else "enabled" - builder.appendLine("$property = ${koverConfig.disabled == false}") + val property = if (slice.language == KOTLIN) "isDisabled" else "disabled" + builder.appendLine("$property = ${koverConfig.disabled}") } if (slice.engine == CoverageEngine.INTELLIJ) { @@ -158,12 +163,16 @@ private fun CommonBuilderState.buildRootExtension(slice: ProjectSlice): String { } if (koverConfig.disabledProjects.isNotEmpty()) { - val prefix = if (slice.language == GradleScriptLanguage.KOTLIN) "setOf(" else "[" - val postfix = if (slice.language == GradleScriptLanguage.KOTLIN) ")" else "]" + val prefix = if (slice.language == KOTLIN) "setOf(" else "[" + val postfix = if (slice.language == KOTLIN) ")" else "]" val value = koverConfig.disabledProjects.joinToString(prefix = prefix, postfix = postfix) { "\"$it\"" } builder.appendLine(" disabledProjects = $value") } + if (koverConfig.runAllTestsForProjectTask != null) { + builder.appendLine(" runAllTestsForProjectTask = ${koverConfig.runAllTestsForProjectTask}") + } + builder.appendLine("}") return builder.toString() @@ -174,7 +183,7 @@ private fun ProjectBuilderState.buildTestTask(slice: ProjectSlice): String { return "" } - val configs = testScripts.map { if (slice.language == GradleScriptLanguage.KOTLIN) it.kotlin else it.groovy } + val configs = testScripts.map { if (slice.language == KOTLIN) it.kotlin else it.groovy } return loadTestTaskTemplate(slice).replace("//KOVER_TEST_CONFIG", configs.joinToString("\n")) } @@ -194,15 +203,21 @@ private fun ProjectBuilderState.buildScripts(slice: ProjectSlice): String { if (scripts.isEmpty()) { return "" } - val configs = scripts.map { if (slice.language == GradleScriptLanguage.KOTLIN) it.kotlin else it.groovy } + val configs = scripts.map { if (slice.language == KOTLIN) it.kotlin else it.groovy } return configs.joinToString("\n", "\n", "\n") } -private fun ProjectBuilderState.buildDependencies(slice: ProjectSlice): String { - if (dependencies.isEmpty()) { +private fun ProjectBuilderState.buildDependencies(slice: ProjectSlice, subprojects: Set): String { + if (dependencies.isEmpty() && subprojects.isEmpty()) { return "" } - val configs = dependencies.map { if (slice.language == GradleScriptLanguage.KOTLIN) it.kotlin else it.groovy } + + val configs: MutableList = mutableListOf(); + + configs += subprojects.map { + if (slice.language == KOTLIN) "implementation(project(\":$it\"))" else "implementation project(':$it')" + } + configs += dependencies.map { if (slice.language == KOTLIN) it.kotlin else it.groovy } return configs.joinToString("\n", "\n", "\n") } diff --git a/src/main/kotlin/kotlinx/kover/KoverPlugin.kt b/src/main/kotlin/kotlinx/kover/KoverPlugin.kt index 9c6f6b82..d5a6125d 100644 --- a/src/main/kotlin/kotlinx/kover/KoverPlugin.kt +++ b/src/main/kotlin/kotlinx/kover/KoverPlugin.kt @@ -6,24 +6,24 @@ package kotlinx.kover import kotlinx.kover.adapters.* import kotlinx.kover.api.* -import kotlinx.kover.api.KoverPaths.HTML_AGG_REPORT_DEFAULT_PATH +import kotlinx.kover.api.KoverPaths.MERGED_HTML_REPORT_DEFAULT_PATH import kotlinx.kover.api.KoverNames.CHECK_TASK_NAME -import kotlinx.kover.api.KoverNames.COLLECT_PROJECT_REPORTS_TASK_NAME +import kotlinx.kover.api.KoverNames.COLLECT_REPORTS_TASK_NAME +import kotlinx.kover.api.KoverNames.MERGED_HTML_REPORT_TASK_NAME import kotlinx.kover.api.KoverNames.HTML_REPORT_TASK_NAME -import kotlinx.kover.api.KoverNames.HTML_PROJECT_REPORT_TASK_NAME -import kotlinx.kover.api.KoverNames.PROJECT_REPORT_TASK_NAME -import kotlinx.kover.api.KoverNames.PROJECT_VERIFY_TASK_NAME import kotlinx.kover.api.KoverNames.REPORT_TASK_NAME -import kotlinx.kover.api.KoverNames.XML_PROJECT_REPORT_TASK_NAME +import kotlinx.kover.api.KoverNames.VERIFY_TASK_NAME +import kotlinx.kover.api.KoverNames.MERGED_REPORT_TASK_NAME +import kotlinx.kover.api.KoverNames.XML_REPORT_TASK_NAME import kotlinx.kover.api.KoverNames.ROOT_EXTENSION_NAME import kotlinx.kover.api.KoverNames.TASK_EXTENSION_NAME import kotlinx.kover.api.KoverNames.VERIFICATION_GROUP -import kotlinx.kover.api.KoverNames.VERIFY_TASK_NAME -import kotlinx.kover.api.KoverNames.XML_REPORT_TASK_NAME +import kotlinx.kover.api.KoverNames.MERGED_VERIFY_TASK_NAME +import kotlinx.kover.api.KoverNames.MERGED_XML_REPORT_TASK_NAME import kotlinx.kover.api.KoverPaths.ALL_PROJECTS_REPORTS_DEFAULT_PATH -import kotlinx.kover.api.KoverPaths.HTML_PROJECT_REPORT_DEFAULT_PATH -import kotlinx.kover.api.KoverPaths.XML_AGG_REPORT_DEFAULT_PATH -import kotlinx.kover.api.KoverPaths.XML_PROJECT_REPORT_DEFAULT_PATH +import kotlinx.kover.api.KoverPaths.PROJECT_HTML_REPORT_DEFAULT_PATH +import kotlinx.kover.api.KoverPaths.MERGED_XML_REPORT_DEFAULT_PATH +import kotlinx.kover.api.KoverPaths.PROJECT_XML_REPORT_DEFAULT_PATH import kotlinx.kover.engines.commons.* import kotlinx.kover.engines.commons.CoverageAgent import kotlinx.kover.engines.intellij.* @@ -52,7 +52,7 @@ class KoverPlugin : Plugin { } target.createCollectingTask() - target.createAggregateTasks(providers) + target.createMergedTasks(providers) } private fun Project.applyToProject(providers: AllProviders, agents: Map) { @@ -60,38 +60,38 @@ class KoverPlugin : Plugin { providers.projects[name] ?: throw GradleException("Kover: Providers for project '$name' was not found") val xmlReportTask = createKoverProjectTask( - XML_PROJECT_REPORT_TASK_NAME, - KoverXmlProjectReportTask::class, + XML_REPORT_TASK_NAME, + KoverXmlReportTask::class, providers, projectProviders ) { - it.xmlReportFile.set(layout.buildDirectory.file(XML_PROJECT_REPORT_DEFAULT_PATH)) + it.xmlReportFile.set(layout.buildDirectory.file(PROJECT_XML_REPORT_DEFAULT_PATH)) it.description = "Generates code coverage XML report for all enabled test tasks in one project." } val htmlReportTask = createKoverProjectTask( - HTML_PROJECT_REPORT_TASK_NAME, - KoverHtmlProjectReportTask::class, + HTML_REPORT_TASK_NAME, + KoverHtmlReportTask::class, providers, projectProviders ) { - it.htmlReportDir.set(it.project.layout.buildDirectory.dir(HTML_PROJECT_REPORT_DEFAULT_PATH)) + it.htmlReportDir.set(it.project.layout.buildDirectory.dir(PROJECT_HTML_REPORT_DEFAULT_PATH)) it.description = "Generates code coverage HTML report for all enabled test tasks in one project." } val verifyTask = createKoverProjectTask( - PROJECT_VERIFY_TASK_NAME, - KoverProjectVerificationTask::class, + VERIFY_TASK_NAME, + KoverVerificationTask::class, providers, projectProviders ) { - it.onlyIf { t -> (t as KoverProjectVerificationTask).rules.isNotEmpty() } + it.onlyIf { t -> (t as KoverVerificationTask).rules.isNotEmpty() } // kover takes counter values from XML file. Remove after reporter upgrade it.mustRunAfter(xmlReportTask) it.description = "Verifies code coverage metrics of one project based on specified rules." } - tasks.create(PROJECT_REPORT_TASK_NAME) { + tasks.create(REPORT_TASK_NAME) { it.group = VERIFICATION_GROUP it.dependsOn(xmlReportTask) it.dependsOn(htmlReportTask) @@ -109,38 +109,38 @@ class KoverPlugin : Plugin { } } - private fun Project.createAggregateTasks(providers: AllProviders) { - val xmlReportTask = createKoverAggregateTask( - XML_REPORT_TASK_NAME, - KoverXmlReportTask::class, + private fun Project.createMergedTasks(providers: AllProviders) { + val xmlReportTask = createKoverMergedTask( + MERGED_XML_REPORT_TASK_NAME, + KoverMergedXmlReportTask::class, providers ) { - it.xmlReportFile.set(layout.buildDirectory.file(XML_AGG_REPORT_DEFAULT_PATH)) + it.xmlReportFile.set(layout.buildDirectory.file(MERGED_XML_REPORT_DEFAULT_PATH)) it.description = "Generates code coverage XML report for all enabled test tasks in all projects." } - val htmlReportTask = createKoverAggregateTask( - HTML_REPORT_TASK_NAME, - KoverHtmlReportTask::class, + val htmlReportTask = createKoverMergedTask( + MERGED_HTML_REPORT_TASK_NAME, + KoverMergedHtmlReportTask::class, providers ) { - it.htmlReportDir.set(layout.buildDirectory.dir(HTML_AGG_REPORT_DEFAULT_PATH)) + it.htmlReportDir.set(layout.buildDirectory.dir(MERGED_HTML_REPORT_DEFAULT_PATH)) it.description = "Generates code coverage HTML report for all enabled test tasks in all projects." } - val reportTask = tasks.create(REPORT_TASK_NAME) { + val reportTask = tasks.create(MERGED_REPORT_TASK_NAME) { it.group = VERIFICATION_GROUP it.dependsOn(xmlReportTask) it.dependsOn(htmlReportTask) it.description = "Generates code coverage HTML and XML reports for all enabled test tasks in all projects." } - val verifyTask = createKoverAggregateTask( - VERIFY_TASK_NAME, - KoverVerificationTask::class, + val verifyTask = createKoverMergedTask( + MERGED_VERIFY_TASK_NAME, + KoverMergedVerificationTask::class, providers ) { - it.onlyIf { t -> (t as KoverVerificationTask).rules.isNotEmpty() } + it.onlyIf { t -> (t as KoverMergedVerificationTask).rules.isNotEmpty() } // kover takes counter values from XML file. Remove after reporter upgrade it.mustRunAfter(xmlReportTask) it.description = "Verifies code coverage metrics of all projects based on specified rules." @@ -150,7 +150,7 @@ class KoverPlugin : Plugin { if (it.name == CHECK_TASK_NAME) { it.dependsOn(provider { val koverExtension = extensions.getByType(KoverExtension::class.java) - if (koverExtension.generateReportOnCheck.get()) { + if (koverExtension.generateReportOnCheck) { listOf(reportTask, verifyTask) } else { listOf(verifyTask) @@ -161,7 +161,7 @@ class KoverPlugin : Plugin { } - private fun Project.createKoverAggregateTask( + private fun Project.createKoverMergedTask( taskName: String, type: KClass, providers: AllProviders, @@ -178,14 +178,14 @@ class KoverPlugin : Plugin { task.coverageEngine.set(providers.engine) task.classpath.set(providers.classpath) - task.dependsOn(providers.aggregated.tests) + task.dependsOn(providers.merged.tests) block(task) } } private fun Project.createCollectingTask() { - tasks.create(COLLECT_PROJECT_REPORTS_TASK_NAME, KoverCollectingProjectsTask::class.java) { task -> + tasks.create(COLLECT_REPORTS_TASK_NAME, KoverCollectingTask::class.java) { task -> task.group = VERIFICATION_GROUP task.description = "Collects all projects reports into one directory." task.outputDir.set(project.layout.buildDirectory.dir(ALL_PROJECTS_REPORTS_DEFAULT_PATH)) @@ -194,9 +194,9 @@ class KoverPlugin : Plugin { allprojects { proj -> val xmlReportTask = - proj.tasks.withType(KoverXmlProjectReportTask::class.java).getByName(XML_PROJECT_REPORT_TASK_NAME) + proj.tasks.withType(KoverXmlReportTask::class.java).getByName(XML_REPORT_TASK_NAME) val htmlReportTask = - proj.tasks.withType(KoverHtmlProjectReportTask::class.java).getByName(HTML_PROJECT_REPORT_TASK_NAME) + proj.tasks.withType(KoverHtmlReportTask::class.java).getByName(HTML_REPORT_TASK_NAME) task.mustRunAfter(xmlReportTask) task.mustRunAfter(htmlReportTask) @@ -224,8 +224,8 @@ class KoverPlugin : Plugin { task.outputDirs.set(projectProviders.output) // it is necessary to read all binary reports because project's classes can be invoked in another project - task.binaryReportFiles.set(providers.aggregated.reports) - task.dependsOn(providers.aggregated.tests) + task.binaryReportFiles.set(projectProviders.reports) + task.dependsOn(projectProviders.tests) task.onlyIf { !projectProviders.disabled.get() } task.onlyIf { !task.binaryReportFiles.get().isEmpty } @@ -240,7 +240,6 @@ class KoverPlugin : Plugin { extension.coverageEngine.set(CoverageEngine.INTELLIJ) extension.intellijEngineVersion.set(defaultIntellijVersion.toString()) extension.jacocoEngineVersion.set(defaultJacocoVersion) - extension.generateReportOnCheck.set(true) return extension } diff --git a/src/main/kotlin/kotlinx/kover/Providers.kt b/src/main/kotlin/kotlinx/kover/Providers.kt index a5e80ac9..d493e88a 100644 --- a/src/main/kotlin/kotlinx/kover/Providers.kt +++ b/src/main/kotlin/kotlinx/kover/Providers.kt @@ -16,8 +16,8 @@ internal fun Project.createProviders(agents: Map) allprojects { projects[it.name] = ProjectProviders( - it.provider { it.files(it.binaryReports(this)) }, - it.provider { it.testTasks(this) }, + it.provider { it.files(if (runAllTests()) allBinaryReports() else it.binaryReports(this)) }, + it.provider { if (runAllTests()) allTestTasks() else it.testTasks(this) }, it.provider { it.collectDirs(this).first }, it.provider { it.collectDirs(this).second }, it.provider { it.isDisabled(this) } @@ -39,7 +39,7 @@ internal fun Project.createProviders(agents: Map) // all sources and all outputs providers are unused, so NOW it can return empty file collection val emptyProvider: Provider = provider { files() } - val aggregatedProviders = + val mergedProviders = ProjectProviders( allReportsProvider, allTestsProvider, @@ -47,7 +47,7 @@ internal fun Project.createProviders(agents: Map) emptyProvider, provider { false }) - return AllProviders(projects, aggregatedProviders, engineProvider, classpathProvider, extensionProvider) + return AllProviders(projects, mergedProviders, engineProvider, classpathProvider, extensionProvider) } @@ -108,10 +108,14 @@ private fun Project.isDisabled(root: Project): Boolean { return root.extensions.getByType(KoverExtension::class.java).disabledProjects.contains(name) } +private fun Project.runAllTests(): Boolean { + return extensions.getByType(KoverExtension::class.java).runAllTestsForProjectTask +} + internal class AllProviders( val projects: Map, - val aggregated: ProjectProviders, + val merged: ProjectProviders, val engine: Provider, val classpath: Provider, diff --git a/src/main/kotlin/kotlinx/kover/api/KoverConstants.kt b/src/main/kotlin/kotlinx/kover/api/KoverConstants.kt index c8b7230a..8353963d 100644 --- a/src/main/kotlin/kotlinx/kover/api/KoverConstants.kt +++ b/src/main/kotlin/kotlinx/kover/api/KoverConstants.kt @@ -7,24 +7,24 @@ public object KoverNames { public const val ROOT_EXTENSION_NAME = "kover" public const val TASK_EXTENSION_NAME = "kover" + public const val MERGED_XML_REPORT_TASK_NAME = "koverMergedXmlReport" + public const val MERGED_HTML_REPORT_TASK_NAME = "koverMergedHtmlReport" + public const val MERGED_REPORT_TASK_NAME = "koverMergedReport" + public const val MERGED_VERIFY_TASK_NAME = "koverMergedVerify" + public const val XML_REPORT_TASK_NAME = "koverXmlReport" public const val HTML_REPORT_TASK_NAME = "koverHtmlReport" public const val REPORT_TASK_NAME = "koverReport" + public const val COLLECT_REPORTS_TASK_NAME = "koverCollectReports" public const val VERIFY_TASK_NAME = "koverVerify" - - public const val XML_PROJECT_REPORT_TASK_NAME = "koverXmlProjectReport" - public const val HTML_PROJECT_REPORT_TASK_NAME = "koverHtmlProjectReport" - public const val PROJECT_REPORT_TASK_NAME = "koverProjectReport" - public const val COLLECT_PROJECT_REPORTS_TASK_NAME = "koverCollectProjectsReports" - public const val PROJECT_VERIFY_TASK_NAME = "koverProjectVerify" } public object KoverPaths { - public const val HTML_AGG_REPORT_DEFAULT_PATH = "reports/kover/html" - public const val XML_AGG_REPORT_DEFAULT_PATH = "reports/kover/report.xml" + public const val MERGED_HTML_REPORT_DEFAULT_PATH = "reports/kover/html" + public const val MERGED_XML_REPORT_DEFAULT_PATH = "reports/kover/report.xml" - public const val HTML_PROJECT_REPORT_DEFAULT_PATH = "reports/kover/project-html" - public const val XML_PROJECT_REPORT_DEFAULT_PATH = "reports/kover/project-xml/report.xml" + public const val PROJECT_HTML_REPORT_DEFAULT_PATH = "reports/kover/project-html" + public const val PROJECT_XML_REPORT_DEFAULT_PATH = "reports/kover/project-xml/report.xml" public const val ALL_PROJECTS_REPORTS_DEFAULT_PATH = "reports/kover/projects" diff --git a/src/main/kotlin/kotlinx/kover/api/KoverExtension.kt b/src/main/kotlin/kotlinx/kover/api/KoverExtension.kt index 4bc7377f..7ab9d596 100644 --- a/src/main/kotlin/kotlinx/kover/api/KoverExtension.kt +++ b/src/main/kotlin/kotlinx/kover/api/KoverExtension.kt @@ -26,31 +26,38 @@ open class KoverExtension(objects: ObjectFactory) { * Specifies the version of Intellij-coverage dependency. */ @get:Input - val intellijEngineVersion: Property = objects.property(String::class.java) + public val intellijEngineVersion: Property = objects.property(String::class.java) /** * Specifies the version of JaCoCo dependency. */ @get:Input - val jacocoEngineVersion: Property = objects.property(String::class.java) + public val jacocoEngineVersion: Property = objects.property(String::class.java) /** * Specifies whether the reports will be generated within 'check' task execution. */ @get:Input - val generateReportOnCheck: Property = objects.property(Boolean::class.java) + public var generateReportOnCheck: Boolean = true /** * Specifies the projects to be disabled from instrumentation and reportings. */ @get:Input - var disabledProjects: Set = emptySet() + public var disabledProjects: Set = emptySet() /** * Specifies whether the classes from 'android' and 'com.android' packages should be included if Android plugin is applied. */ @get:Input public var instrumentAndroidPackage: Boolean = false + + /** + * Specifies whether to perform all test tasks from all projects for Kover single-project tasks. + * If the value is `false`, then executed only test tasks of the project for which its Kover task is called. + */ + @get:Input + public var runAllTestsForProjectTask: Boolean = false } public enum class CoverageEngine { diff --git a/src/main/kotlin/kotlinx/kover/tasks/KoverCollectingProjectsTask.kt b/src/main/kotlin/kotlinx/kover/tasks/KoverCollectingTask.kt similarity index 95% rename from src/main/kotlin/kotlinx/kover/tasks/KoverCollectingProjectsTask.kt rename to src/main/kotlin/kotlinx/kover/tasks/KoverCollectingTask.kt index 27c45580..1ce9364a 100644 --- a/src/main/kotlin/kotlinx/kover/tasks/KoverCollectingProjectsTask.kt +++ b/src/main/kotlin/kotlinx/kover/tasks/KoverCollectingTask.kt @@ -4,7 +4,7 @@ import org.gradle.api.* import org.gradle.api.file.* import org.gradle.api.tasks.* -open class KoverCollectingProjectsTask : DefaultTask() { +open class KoverCollectingTask : DefaultTask() { /** * Specifies directory path for collecting of all XML and HTML reports from all projects. */ diff --git a/src/main/kotlin/kotlinx/kover/tasks/KoverHtmlReport.kt b/src/main/kotlin/kotlinx/kover/tasks/KoverHtmlReport.kt index 01f54813..929d29ad 100644 --- a/src/main/kotlin/kotlinx/kover/tasks/KoverHtmlReport.kt +++ b/src/main/kotlin/kotlinx/kover/tasks/KoverHtmlReport.kt @@ -11,7 +11,7 @@ import org.gradle.api.file.* import org.gradle.api.tasks.* @CacheableTask -open class KoverHtmlReportTask : KoverAggregateTask() { +open class KoverMergedHtmlReportTask : KoverMergedTask() { /** * Specifies directory path of generated HTML report. */ @@ -37,12 +37,12 @@ open class KoverHtmlReportTask : KoverAggregateTask() { classpath.get(), ) } - project.logger.lifecycle("Kover: aggregate HTML report file://${htmlDirFile.canonicalPath}/index.html") + project.logger.lifecycle("Kover: merged HTML report file://${htmlDirFile.canonicalPath}/index.html") } } @CacheableTask -open class KoverHtmlProjectReportTask : KoverProjectTask() { +open class KoverHtmlReportTask : KoverProjectTask() { /** * Specifies directory path of generated HTML report. */ diff --git a/src/main/kotlin/kotlinx/kover/tasks/KoverAggregateTask.kt b/src/main/kotlin/kotlinx/kover/tasks/KoverMergedTask.kt similarity index 97% rename from src/main/kotlin/kotlinx/kover/tasks/KoverAggregateTask.kt rename to src/main/kotlin/kotlinx/kover/tasks/KoverMergedTask.kt index 218bc017..16fa13f9 100644 --- a/src/main/kotlin/kotlinx/kover/tasks/KoverAggregateTask.kt +++ b/src/main/kotlin/kotlinx/kover/tasks/KoverMergedTask.kt @@ -15,7 +15,7 @@ import org.gradle.api.tasks.* import java.io.* @CacheableTask -open class KoverAggregateTask : DefaultTask() { +open class KoverMergedTask : DefaultTask() { @get:Nested val binaryReportFiles: MapProperty = project.objects.mapProperty(String::class.java, NestedFiles::class.java) diff --git a/src/main/kotlin/kotlinx/kover/tasks/KoverVerification.kt b/src/main/kotlin/kotlinx/kover/tasks/KoverVerification.kt index 1f9e9b6d..be5788a6 100644 --- a/src/main/kotlin/kotlinx/kover/tasks/KoverVerification.kt +++ b/src/main/kotlin/kotlinx/kover/tasks/KoverVerification.kt @@ -7,8 +7,8 @@ package kotlinx.kover.tasks import kotlinx.kover.api.* -import kotlinx.kover.api.KoverNames.XML_PROJECT_REPORT_TASK_NAME import kotlinx.kover.api.KoverNames.XML_REPORT_TASK_NAME +import kotlinx.kover.api.KoverNames.MERGED_XML_REPORT_TASK_NAME import kotlinx.kover.engines.commons.* import kotlinx.kover.engines.intellij.* import kotlinx.kover.engines.jacoco.* @@ -19,7 +19,7 @@ import org.gradle.api.tasks.* import java.io.* import javax.inject.* -open class KoverVerificationTask : KoverAggregateTask() { +open class KoverMergedVerificationTask : KoverMergedTask() { private val rulesInternal: MutableList = mutableListOf() /** @@ -41,9 +41,9 @@ open class KoverVerificationTask : KoverAggregateTask() { fun verify() { verify(report(), coverageEngine.get(), rulesInternal, classpath.get()) { val xmlReport = - this.project.tasks.withType(KoverXmlReportTask::class.java) - .findByName(XML_REPORT_TASK_NAME) - ?: throw GradleException("Kover: task '$XML_REPORT_TASK_NAME' not exists but it is required for verification") + this.project.tasks.withType(KoverMergedXmlReportTask::class.java) + .findByName(MERGED_XML_REPORT_TASK_NAME) + ?: throw GradleException("Kover: task '$MERGED_XML_REPORT_TASK_NAME' not exists but it is required for verification") var xmlFile = xmlReport.xmlReportFile.get().asFile if (!xmlFile.exists()) { @@ -61,7 +61,7 @@ open class KoverVerificationTask : KoverAggregateTask() { } -open class KoverProjectVerificationTask : KoverProjectTask() { +open class KoverVerificationTask : KoverProjectTask() { private val rulesInternal: MutableList = mutableListOf() /** @@ -83,9 +83,9 @@ open class KoverProjectVerificationTask : KoverProjectTask() { fun verify() { verify(report(), coverageEngine.get(), rulesInternal, classpath.get()) { val xmlReport = - this.project.tasks.withType(KoverXmlProjectReportTask::class.java) - .findByName(XML_PROJECT_REPORT_TASK_NAME) - ?: throw GradleException("Kover: task '$XML_PROJECT_REPORT_TASK_NAME' does not exist but it is required for verification") + this.project.tasks.withType(KoverXmlReportTask::class.java) + .findByName(XML_REPORT_TASK_NAME) + ?: throw GradleException("Kover: task '$XML_REPORT_TASK_NAME' does not exist but it is required for verification") var xmlFile = xmlReport.xmlReportFile.get().asFile if (!xmlFile.exists()) { diff --git a/src/main/kotlin/kotlinx/kover/tasks/KoverXmlReport.kt b/src/main/kotlin/kotlinx/kover/tasks/KoverXmlReport.kt index b638b72a..cd9ec6f7 100644 --- a/src/main/kotlin/kotlinx/kover/tasks/KoverXmlReport.kt +++ b/src/main/kotlin/kotlinx/kover/tasks/KoverXmlReport.kt @@ -11,7 +11,7 @@ import org.gradle.api.file.* import org.gradle.api.tasks.* @CacheableTask -open class KoverXmlReportTask : KoverAggregateTask() { +open class KoverMergedXmlReportTask : KoverMergedTask() { /** * Specifies file path of generated XML report file with coverage data. @@ -40,7 +40,7 @@ open class KoverXmlReportTask : KoverAggregateTask() { } @CacheableTask -open class KoverXmlProjectReportTask : KoverProjectTask() { +open class KoverXmlReportTask : KoverProjectTask() { /** * Specifies file path of generated XML report file with coverage data.