Skip to content

Commit f95c54a

Browse files
vRallevvanniktech
authored andcommitted
Create a Gradle task for merging all test code coverage reports and another task for creating a combined report (#89)
1 parent 4ece87c commit f95c54a

File tree

1 file changed

+85
-8
lines changed

1 file changed

+85
-8
lines changed

src/main/groovy/com/vanniktech/android/junit/jacoco/GenerationPlugin.groovy

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.vanniktech.android.junit.jacoco
33
import com.android.build.gradle.api.BaseVariant
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
6+
import org.gradle.testing.jacoco.tasks.JacocoMerge
67
import org.gradle.testing.jacoco.tasks.JacocoReport
78

89
class GenerationPlugin implements Plugin<Project> {
@@ -13,11 +14,18 @@ class GenerationPlugin implements Plugin<Project> {
1314
final def hasSubProjects = rootProject.subprojects.size() > 0
1415

1516
if (hasSubProjects) {
17+
final def (JacocoMerge mergeTask, JacocoReport mergedReportTask) = addJacocoMergeToRootProject(rootProject, rootProject.junitJacoco)
18+
1619
rootProject.subprojects { subProject ->
20+
subProject.tasks.whenTaskAdded {
21+
if (it instanceof JacocoReport) {
22+
mergeTask.dependsOn it
23+
}
24+
}
25+
1726
afterEvaluate {
1827
final def extension = rootProject.junitJacoco
19-
20-
addJacoco(subProject, extension)
28+
addJacoco(subProject, extension, mergeTask, mergedReportTask)
2129
}
2230
}
2331
} else {
@@ -29,22 +37,25 @@ class GenerationPlugin implements Plugin<Project> {
2937
}
3038
}
3139

32-
protected static boolean addJacoco(final Project subProject,
33-
final JunitJacocoExtension extension) {
40+
protected static boolean addJacoco(final Project subProject, final JunitJacocoExtension extension) {
41+
return addJacoco(subProject, extension, null, null)
42+
}
43+
44+
protected static boolean addJacoco(final Project subProject, final JunitJacocoExtension extension, JacocoMerge mergeTask, JacocoReport mergedReportTask) {
3445
if (!shouldIgnore(subProject, extension)) {
3546
if (isAndroidApplication(subProject) || isAndroidLibrary(subProject)) {
36-
addJacocoAndroid(subProject, extension)
47+
addJacocoAndroid(subProject, extension, mergeTask, mergedReportTask)
3748
return true
3849
} else if (isJavaProject(subProject)) {
39-
addJacocoJava(subProject, extension)
50+
addJacocoJava(subProject, extension, mergeTask, mergedReportTask)
4051
return true
4152
}
4253
}
4354

4455
return false
4556
}
4657

47-
private static void addJacocoJava(final Project subProject, final JunitJacocoExtension extension) {
58+
private static void addJacocoJava(final Project subProject, final JunitJacocoExtension extension, JacocoMerge mergeTask, JacocoReport mergedReportTask) {
4859
subProject.plugins.apply('jacoco')
4960

5061
subProject.jacoco {
@@ -79,12 +90,21 @@ class GenerationPlugin implements Plugin<Project> {
7990
additionalSourceDirs = subProject.files(coverageSourceDirs)
8091
sourceDirectories = subProject.files(coverageSourceDirs)
8192
executionData = subProject.files("${subProject.buildDir}/jacoco/test.exec")
93+
94+
if (mergeTask != null) {
95+
mergeTask.executionData += executionData
96+
}
97+
if (mergedReportTask != null) {
98+
mergedReportTask.classDirectories += classDirectories
99+
mergedReportTask.additionalSourceDirs += additionalSourceDirs
100+
mergedReportTask.sourceDirectories += sourceDirectories
101+
}
82102
}
83103

84104
subProject.check.dependsOn 'jacocoTestReport'
85105
}
86106

87-
private static void addJacocoAndroid(final Project subProject, final JunitJacocoExtension extension) {
107+
private static void addJacocoAndroid(final Project subProject, final JunitJacocoExtension extension, JacocoMerge mergeTask, JacocoReport mergedReportTask) {
88108
subProject.plugins.apply('jacoco')
89109

90110
subProject.jacoco {
@@ -168,12 +188,69 @@ class GenerationPlugin implements Plugin<Project> {
168188
additionalSourceDirs = subProject.files(coverageSourceDirs)
169189
sourceDirectories = subProject.files(coverageSourceDirs)
170190
executionData = subProject.files("${subProject.buildDir}/jacoco/${testTaskName}.exec")
191+
192+
if (mergeTask != null) {
193+
mergeTask.executionData += executionData
194+
}
195+
if (mergedReportTask != null) {
196+
mergedReportTask.classDirectories += classDirectories
197+
mergedReportTask.additionalSourceDirs += additionalSourceDirs
198+
mergedReportTask.sourceDirectories += sourceDirectories
199+
}
171200
}
172201

173202
subProject.check.dependsOn "${taskName}"
174203
}
175204
}
176205

206+
private static addJacocoMergeToRootProject(final Project project, final JunitJacocoExtension extension) {
207+
project.plugins.apply('jacoco')
208+
209+
project.jacoco {
210+
toolVersion extension.jacocoVersion
211+
}
212+
213+
def mergeTask = project.task("mergeJacocoReports", type: JacocoMerge) {
214+
executionData project.files().asFileTree // start with an empty collection
215+
destinationFile project.file("${project.buildDir}/jacoco/mergedReport.exec")
216+
217+
doFirst {
218+
// filter non existing files
219+
def realExecutionData = project.files().asFileTree
220+
221+
executionData.each {
222+
if (it.exists()) {
223+
realExecutionData += project.files(it)
224+
}
225+
}
226+
227+
executionData = realExecutionData
228+
}
229+
}
230+
231+
def mergedReportTask = project.task("jacocoTestReportMerged", type: JacocoReport, dependsOn: mergeTask) {
232+
executionData mergeTask.destinationFile
233+
234+
reports {
235+
xml {
236+
enabled = true
237+
destination "${project.buildDir}/reports/jacoco/jacoco.xml"
238+
}
239+
html {
240+
enabled = true
241+
destination "${project.buildDir}/reports/jacoco"
242+
}
243+
}
244+
245+
// start with empty collections
246+
classDirectories = project.files()
247+
additionalSourceDirs = project.files()
248+
sourceDirectories = project.files()
249+
}
250+
251+
return [mergeTask, mergedReportTask]
252+
}
253+
177254
static List<String> getExcludes(final JunitJacocoExtension extension) {
178255
extension.excludes == null ? [
179256
'**/R.class',

0 commit comments

Comments
 (0)