-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathjacoco.kt
More file actions
87 lines (77 loc) · 3.03 KB
/
jacoco.kt
File metadata and controls
87 lines (77 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package kotlinx.fuzz.gradle
import java.io.File
import java.nio.file.Path
import kotlin.io.path.inputStream
import kotlin.io.path.listDirectoryEntries
import kotlin.io.path.outputStream
import kotlinx.fuzz.JacocoReport
import org.jacoco.core.analysis.Analyzer
import org.jacoco.core.analysis.CoverageBuilder
import org.jacoco.core.tools.ExecFileLoader
import org.jacoco.report.DirectorySourceFileLocator
import org.jacoco.report.FileMultiReportOutput
import org.jacoco.report.IReportVisitor
import org.jacoco.report.MultiReportVisitor
import org.jacoco.report.csv.CSVFormatter
import org.jacoco.report.html.HTMLFormatter
import org.jacoco.report.xml.XMLFormatter
private fun JacocoReport.toVisitor(reportDir: Path): IReportVisitor = when (this) {
JacocoReport.HTML -> HTMLFormatter().createVisitor(FileMultiReportOutput(reportDir.toFile()))
JacocoReport.XML ->
XMLFormatter().createVisitor(reportDir.resolve("jacoco.xml").outputStream().buffered())
JacocoReport.CSV ->
CSVFormatter().createVisitor(reportDir.resolve("jacoco.csv").outputStream().buffered())
}
/**
* Merges all JaCoCo .exec files in [execDir] into a single .exec result file at [result].
*
* @param execDir
* @param result
*/
fun jacocoMerge(execDir: Path, result: Path) {
// Use a single loader for merging. Each subsequent load() merges additional .exec data.
val mergedLoader = ExecFileLoader()
execDir.listDirectoryEntries("*.exec").forEach { execFile ->
execFile.inputStream().buffered().use { mergedLoader.load(it) }
}
// Save merged execution data to the result .exec file
result.outputStream().buffered().use { mergedLoader.save(it) }
}
/**
* Generates an HTML coverage report (and optional XML) for [execFile].
*
* @param execFile Path to the .exec file
* @param classPath Directory containing compiled .class files
* @param sourceDirectories Directory containing source files (for line coverage information)
* @param reportDir Output directory where the coverage report will be generated
* @param reports Jacoco reports to generate (xml, html, csv)
*/
fun jacocoReport(
execFile: Path,
classPath: Set<File>,
sourceDirectories: Set<File>,
reportDir: Path,
reports: Set<JacocoReport>,
) {
val execLoader = ExecFileLoader()
execFile.inputStream().buffered().use { execLoader.load(it) }
val coverageBuilder = CoverageBuilder()
val analyzer = Analyzer(execLoader.executionDataStore, coverageBuilder)
classPath.filter { it.exists() }.forEach { classFile ->
analyzer.analyzeAll(classFile)
}
val visitors = reports.map { it.toVisitor(reportDir) }
val reportVisitor = MultiReportVisitor(visitors)
reportVisitor.visitInfo(
execLoader.sessionInfoStore.infos,
execLoader.executionDataStore.contents,
)
val bundle = coverageBuilder.getBundle("Coverage Report")
sourceDirectories.forEach { directory ->
reportVisitor.visitBundle(
bundle,
DirectorySourceFileLocator(directory, "UTF-8", 4),
)
}
reportVisitor.visitEnd()
}