Skip to content

Commit cd871d8

Browse files
authored
Added ability to supplement coverage values from external binary reports
This will allow to build reports on tests run on various machines. Relates #585 Relates #645 Co-authored-by: Leonid Startsev <[email protected]> PR #663
1 parent 1a01acc commit cd871d8

File tree

11 files changed

+98
-1
lines changed

11 files changed

+98
-1
lines changed

kover-gradle-plugin/api/kover-gradle-plugin.api

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportSetCo
215215
public abstract fun binary (Lorg/gradle/api/Action;)V
216216
public abstract fun filters (Lorg/gradle/api/Action;)V
217217
public abstract fun filtersAppend (Lorg/gradle/api/Action;)V
218+
public abstract fun getAdditionalBinaryReports ()Lorg/gradle/api/provider/SetProperty;
218219
public abstract fun getBinary ()Lkotlinx/kover/gradle/plugin/dsl/KoverBinaryTaskConfig;
219220
public abstract fun getFilters ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig;
220221
public abstract fun getHtml ()Lkotlinx/kover/gradle/plugin/dsl/KoverHtmlTaskConfig;

kover-gradle-plugin/docs/index.md

+3
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,9 @@ verify {
856856
verifyAppend {
857857
// add verification rules
858858
}
859+
860+
// use coverage from external binary reports in IC format
861+
additionalBinaryReports.add(file("path/to/the/file.ic"))
859862
```
860863

861864
This is available both from the total report settings
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
package kotlinx.kover.gradle.plugin.test.functional.cases
5+
6+
import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.BuildConfigurator
7+
import kotlinx.kover.gradle.plugin.test.functional.framework.starter.GeneratedTest
8+
import java.io.File
9+
10+
internal class ReportsAdditionalIcTests {
11+
12+
@GeneratedTest
13+
fun BuildConfigurator.test() {
14+
copy(File("src/functionalTest/templates/report.bin"), "additional.ic")
15+
addProjectWithKover {
16+
sourcesFrom("simple")
17+
kover {
18+
reports {
19+
verify {
20+
rule {
21+
minBound(100)
22+
}
23+
}
24+
25+
total {
26+
additionalBinaryReports.add(File("additional.ic"))
27+
}
28+
}
29+
}
30+
}
31+
run("koverBinaryReport", "koverVerify", "koverXmlReport") {
32+
xmlReport {
33+
classCounter("org.jetbrains.ExampleClass").assertFullyCovered()
34+
classCounter("org.jetbrains.SecondClass").assertFullyCovered()
35+
classCounter("org.jetbrains.Unused").assertFullyCovered()
36+
}
37+
}
38+
}
39+
40+
41+
}

kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/BuildConfigurator.kt

+12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import kotlinx.kover.gradle.plugin.test.functional.framework.checker.*
1010
import kotlinx.kover.gradle.plugin.test.functional.framework.common.*
1111
import kotlinx.kover.gradle.plugin.test.functional.framework.common.kotlinVersionCurrent
1212
import kotlinx.kover.gradle.plugin.test.functional.framework.mirroring.printGradleDsl
13+
import java.io.File
1314

1415
internal fun createConfigurator(): BuildConfigurator {
1516
return TestBuildConfigurator()
@@ -50,6 +51,13 @@ internal data class TestFileAddStep(
5051
override val name: String = "Add file: $filePath"
5152
}
5253

54+
internal data class TestFileCopyStep(
55+
val origin: File,
56+
val filePath: String,
57+
): TestExecutionStep() {
58+
override val name: String = "Copy file $origin to $filePath"
59+
}
60+
5361
internal data class TestFileDeleteStep(val filePath: String): TestExecutionStep() {
5462
override val name: String = "Delete file: $filePath"
5563
}
@@ -92,6 +100,10 @@ private open class TestBuildConfigurator : BuildConfigurator {
92100
steps += TestFileAddStep(filePath, editor)
93101
}
94102

103+
override fun copy(from: File, filePath: String) {
104+
steps += TestFileCopyStep(from, filePath)
105+
}
106+
95107
override fun delete(filePath: String) {
96108
steps += TestFileDeleteStep(filePath)
97109
}

kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/ConfiguratorTypes.kt

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ internal interface BuildConfigurator {
2929

3030
fun add(filePath: String, editor: () -> String)
3131

32+
fun copy(from: File, filePath: String)
33+
3234
fun delete(filePath: String)
3335

3436
fun useLocalCache(use: Boolean = true)
@@ -85,6 +87,10 @@ internal abstract class BuilderConfiguratorWrapper(private val origin: BuildConf
8587
origin.add(filePath, editor)
8688
}
8789

90+
override fun copy(from: File, filePath: String) {
91+
origin.copy(from, filePath)
92+
}
93+
8894
override fun delete(filePath: String) {
8995
origin.delete(filePath)
9096
}

kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/mirroring/Printing.kt

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package kotlinx.kover.gradle.plugin.test.functional.framework.mirroring
66

77
import kotlinx.kover.gradle.plugin.test.functional.framework.common.ScriptLanguage
88
import kotlinx.kover.gradle.plugin.util.SemVer
9+
import java.io.File
910

1011

1112
internal fun printCode(name: String?, language: ScriptLanguage, gradleVersion: String, block: CodeBlock): String {
@@ -132,6 +133,7 @@ private fun handleValueLiteral(context: PrintingContext, expression: ValueLitera
132133
is String -> context.print("\"${expression.value}\"")
133134
is Int -> context.print(expression.value.toString())
134135
is Boolean -> context.print(expression.value.toString())
136+
is File -> context.print("file(\"${expression.value}\")")
135137
else -> throw IllegalStateException("Value '${expression.value}' with type ${expression.value.javaClass} unsupported as argument")
136138
}
137139
}

kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/StepsRunner.kt

+5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ ${this.targetDir.buildScript()}
4646
file.writeText(step.editor())
4747
}
4848

49+
is TestFileCopyStep -> {
50+
val file = projectFile(step.filePath, description)
51+
step.origin.copyTo(file, overwrite = true)
52+
}
53+
4954
is TestFileDeleteStep -> {
5055
val file = projectFile(step.filePath, description)
5156
file.delete()
Binary file not shown.

kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/tasks/VariantReportsSet.kt

+9
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ internal class VariantReportsSet(
6969
htmlTask.configure {
7070
onlyIf { printPath(); true }
7171

72+
additionalBinaryReports.convention(config.additionalBinaryReports)
7273
reportDir.convention(config.html.htmlDir)
7374
title.convention(config.html.title.orElse(project.name))
7475
charset.convention(config.html.charset)
@@ -79,6 +80,8 @@ internal class VariantReportsSet(
7980
}
8081

8182
xmlTask.configure {
83+
additionalBinaryReports.convention(config.additionalBinaryReports)
84+
8285
reportFile.convention(config.xml.xmlFile)
8386
title.convention(config.xml.title)
8487
filters.set((config.filters).convert())
@@ -88,6 +91,8 @@ internal class VariantReportsSet(
8891
}
8992

9093
binTask.configure {
94+
additionalBinaryReports.convention(config.additionalBinaryReports)
95+
9196
file.convention(config.binary.file)
9297
filters.set((config.filters).convert())
9398
}
@@ -97,6 +102,8 @@ internal class VariantReportsSet(
97102

98103

99104
doVerifyTask.configure {
105+
additionalBinaryReports.convention(config.additionalBinaryReports)
106+
100107
val resultRules = config.verify.rules
101108
val converted = resultRules.map { rules -> rules.map { it.convert() } }
102109

@@ -142,6 +149,8 @@ internal class VariantReportsSet(
142149
}
143150

144151
logTask.configure {
152+
additionalBinaryReports.convention(config.additionalBinaryReports)
153+
145154
header.convention(config.log.header)
146155
lineFormat.convention(config.log.format)
147156
groupBy.convention(config.log.groupBy)

kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/dsl/KoverReportsConfig.kt

+14
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.gradle.api.file.RegularFileProperty
1414
import org.gradle.api.provider.Property
1515
import org.gradle.api.provider.Provider
1616
import org.gradle.api.provider.SetProperty
17+
import java.io.File
1718

1819
/**
1920
* Configuration of Kover reports.
@@ -162,6 +163,8 @@ public interface KoverReportsConfig {
162163
* verify {
163164
* // configure coverage verification all code of current project and `kover` dependencies.
164165
* }
166+
*
167+
* additionalBinaryReports.add(file("path/to/the/file.ic"))
165168
* }
166169
* }
167170
* }
@@ -199,6 +202,8 @@ public interface KoverReportsConfig {
199202
* verify {
200203
* // configure coverage verification for 'debug' variant
201204
* }
205+
*
206+
* additionalBinaryReports.add(file("path/to/the/file.ic"))
202207
* }
203208
* }
204209
* }
@@ -225,6 +230,8 @@ public interface KoverReportsConfig {
225230
* verify {
226231
* // configure coverage verification
227232
* }
233+
*
234+
* additionalBinaryReports.add(file("path/to/the/file.ic"))
228235
* ```
229236
*/
230237
@KoverGradlePluginDsl
@@ -428,6 +435,13 @@ public interface KoverReportSetConfig {
428435
*/
429436
public val log: KoverLogTaskConfig
430437

438+
/**
439+
* Use coverage from external files in binary IC format.
440+
*
441+
* Coverage results from specified binary reports will be included in produced Kover reports.
442+
*/
443+
public val additionalBinaryReports: SetProperty<File>
444+
431445
@Deprecated(
432446
message = "Block mergeWith was removed, create custom reports variant and merge with specified variant. Please refer to migration guide in order to migrate: ${KoverMigrations.MIGRATION_0_7_TO_0_8}",
433447
level = DeprecationLevel.ERROR

kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/reports/AbstractKoverReportTask.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
2929
@get:PathSensitive(PathSensitivity.RELATIVE)
3030
abstract val reportClasspath: ConfigurableFileCollection
3131

32+
@get:InputFiles
33+
@get:PathSensitive(PathSensitivity.RELATIVE)
34+
abstract val additionalBinaryReports: SetProperty<File>
35+
3236
/**
3337
* This will cause the task to be considered out-of-date when source files of dependencies have changed.
3438
*/
@@ -73,7 +77,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
7377
}
7478

7579
private fun collectAllFiles(): ArtifactContent {
76-
val local = ArtifactContent(projectPath, emptySet(), emptySet(), emptySet())
80+
val local = ArtifactContent(projectPath, emptySet(), emptySet(), additionalBinaryReports.get())
7781
return local.joinWith(artifacts.files.map { it.parseArtifactFile(rootDir).filterProjectSources() }).existing()
7882
}
7983

0 commit comments

Comments
 (0)