@@ -3,6 +3,7 @@ package com.vanniktech.android.junit.jacoco
3
3
import com.android.build.gradle.api.BaseVariant
4
4
import org.gradle.api.Plugin
5
5
import org.gradle.api.Project
6
+ import org.gradle.testing.jacoco.tasks.JacocoMerge
6
7
import org.gradle.testing.jacoco.tasks.JacocoReport
7
8
8
9
class GenerationPlugin implements Plugin<Project > {
@@ -13,11 +14,18 @@ class GenerationPlugin implements Plugin<Project> {
13
14
final def hasSubProjects = rootProject. subprojects. size() > 0
14
15
15
16
if (hasSubProjects) {
17
+ final def (JacocoMerge mergeTask, JacocoReport mergedReportTask) = addJacocoMergeToRootProject(rootProject, rootProject. junitJacoco)
18
+
16
19
rootProject. subprojects { subProject ->
20
+ subProject. tasks. whenTaskAdded {
21
+ if (it instanceof JacocoReport ) {
22
+ mergeTask. dependsOn it
23
+ }
24
+ }
25
+
17
26
afterEvaluate {
18
27
final def extension = rootProject. junitJacoco
19
-
20
- addJacoco(subProject, extension)
28
+ addJacoco(subProject, extension, mergeTask, mergedReportTask)
21
29
}
22
30
}
23
31
} else {
@@ -29,22 +37,25 @@ class GenerationPlugin implements Plugin<Project> {
29
37
}
30
38
}
31
39
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 ) {
34
45
if (! shouldIgnore(subProject, extension)) {
35
46
if (isAndroidApplication(subProject) || isAndroidLibrary(subProject)) {
36
- addJacocoAndroid(subProject, extension)
47
+ addJacocoAndroid(subProject, extension, mergeTask, mergedReportTask )
37
48
return true
38
49
} else if (isJavaProject(subProject)) {
39
- addJacocoJava(subProject, extension)
50
+ addJacocoJava(subProject, extension, mergeTask, mergedReportTask )
40
51
return true
41
52
}
42
53
}
43
54
44
55
return false
45
56
}
46
57
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 ) {
48
59
subProject. plugins. apply(' jacoco' )
49
60
50
61
subProject. jacoco {
@@ -79,12 +90,21 @@ class GenerationPlugin implements Plugin<Project> {
79
90
additionalSourceDirs = subProject. files(coverageSourceDirs)
80
91
sourceDirectories = subProject. files(coverageSourceDirs)
81
92
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
+ }
82
102
}
83
103
84
104
subProject. check. dependsOn ' jacocoTestReport'
85
105
}
86
106
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 ) {
88
108
subProject. plugins. apply(' jacoco' )
89
109
90
110
subProject. jacoco {
@@ -168,12 +188,69 @@ class GenerationPlugin implements Plugin<Project> {
168
188
additionalSourceDirs = subProject. files(coverageSourceDirs)
169
189
sourceDirectories = subProject. files(coverageSourceDirs)
170
190
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
+ }
171
200
}
172
201
173
202
subProject. check. dependsOn " ${ taskName} "
174
203
}
175
204
}
176
205
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
+
177
254
static List<String > getExcludes (final JunitJacocoExtension extension ) {
178
255
extension. excludes == null ? [
179
256
' **/R.class' ,
0 commit comments