@@ -43,112 +43,38 @@ class ProjectJacocoConventionPlugin : Plugin<Project> {
4343 with (pluginManager) {
4444 apply (" jacoco" )
4545 }
46- tasks.register( " createMergedJacocoReport " ) {
46+ tasks.register< JacocoReport >( " MergeHTMLJacocoReports " ) {
4747 val jacocoReport = this
4848 group = " Reporting"
49- description = " Generate test coverage reports on the debug build"
49+ description = " Merge all generated JacocoReport"
50+ logger.quiet(" ======Merging HTML Reports=========" )
51+ val javaClasses: MutableCollection <String > = mutableListOf ()
52+ val kotlinClasses: MutableCollection <String > = mutableListOf ()
53+ val sourceDir: MutableCollection <String > = mutableListOf ()
54+ val coverageFiles: MutableCollection <String > = mutableListOf ()
5055 subprojects {
51- val subproject = this
52- subproject.plugins.withType<JacocoPlugin >().configureEach {
53- if (tasks.findByName(" createDemoDebugJacocoReport" ) != null ) {
54- val moduleTask = tasks.findByName(" createDemoDebugJacocoReport" )
55- jacocoReport.dependsOn(moduleTask)
56- }
56+ val subProject = this
57+ subProject.plugins.withType<JacocoPlugin >().configureEach {
58+ val moduleTask = tasks.findByName(" createDemoDebugJacocoReport" )
59+ jacocoReport.dependsOn(moduleTask)
60+ javaClasses.add(" ${subProject.buildDir} /intermediates/javac/demoDebug/classes" )
61+ kotlinClasses.add(" ${subProject.buildDir} /tmp/kotlin-classes/demoDebug" )
62+ sourceDir.add(" ${subProject.projectDir} /src/main/java" )
63+ sourceDir.add(" ${subProject.projectDir} /src/main/kotlin" )
64+ sourceDir.add(" ${subProject.projectDir} /src/demoDebug/java" )
65+ coverageFiles.add(" ${subProject.buildDir} /outputs/unit_test_code_coverage/demoDebugUnitTest/testDemoDebugUnitTest.exec" )
66+ coverageFiles.add(" ${subProject.buildDir} /outputs/code_coverage/demoDebugAndroidTest/connected/coverage.ec" )
5767 }
5868 }
59- doLast {
60- logger.lifecycle(" Making Overall coverage report" )
61- addReportMergingTask()
62- val metrics = mutableMapOf<String , Map <String , Double >>()
63- val moduleLimits = mutableMapOf<String , Map <String , Double >>()
64- val failures = mutableMapOf<String , List <String >>()
65-
66- if (! extra.has(" limits" )) {
67- setProjectTestCoverageLimits()
68- }
69- subprojects {
70- if (tasks.findByName(" createDemoDebugJacocoReport" ) != null ) {
71- val reportDir = jacoco.reportsDirectory.asFile.get()
72- val report =
73- file(" $reportDir /createDemoDebugJacocoReport/createDemoDebugJacocoReport.xml" )
74- if (report.exists()) {
75- logger.lifecycle(" Checking coverage results:$report " )
76- metrics[project.name] = report.extractTestCoverage()
77- moduleLimits[project.name] =
78- project.extra[" limits" ] as Map <String , Double >
79- }
80- }
81- }
82- metrics.forEach { (key, metricsMap) ->
83- val extractedMetricsMap = mutableMapOf<String , Double >()
84- if (metricsMap.isNotEmpty()) {
85- val failureMap = metricsMap.filter { item ->
86- item.value < moduleLimits[key]!! [item.key]!!
87- }.map { item ->
88- extractedMetricsMap[item.key] = item.value
89- " -${item.key} coverage is: ${item.value} %, minimum is ${moduleLimits[item.key]} %"
90- }
91- if (failureMap.isNotEmpty()) {
92- failures[key] = failureMap
93- }
94- }
95- moduleLimits[key] = extractedMetricsMap
96- }
97-
98-
99- if (failures.isNotEmpty()) {
100- logger.quiet(" ======Code coverage failures=========" )
101- failures.forEach { entry ->
102- logger.quiet(" ======Module: ${entry.key} =========" )
103- entry.value.forEach { logger.quiet(it) }
104- }
105- logger.quiet(" ===========================================" )
106- }
107-
108- if (metrics.isNotEmpty()) {
109- logger.quiet(" ======Code coverage success=========" )
110- metrics.forEach { entry ->
111- logger.quiet(" ======Module: ${entry.key} =========" )
112- entry.value.forEach {
113- logger.quiet(" - ${it.key} coverage: ${it.value} " )
114- }
115- }
116- logger.quiet(" ===========================================" )
117- }
69+ classDirectories.setFrom(files(javaClasses, kotlinClasses))
70+ additionalClassDirs.setFrom(files(sourceDir))
71+ sourceDirectories.setFrom(files(sourceDir))
72+ executionData.setFrom(files(coverageFiles))
73+ reports {
74+ xml.required.set(true )
75+ html.required.set(true )
11876 }
119-
12077 }
121-
122-
12378 }
12479 }
125-
126- private fun Project.addReportMergingTask () {
127- tasks.register<JacocoReport >(" MergeHTMLJacocoReports" ) {
128- logger.quiet(" ======Merging HTML Reports=========" )
129- val javaClasses : MutableCollection <String > = mutableListOf ()
130- val kotlinClasses : MutableCollection <String > = mutableListOf ()
131- val sourceDir : MutableCollection <String > = mutableListOf ()
132- val coverageFiles : MutableCollection <String > = mutableListOf ()
133- subprojects.forEach { subProject ->
134- javaClasses.add(" ${subProject.buildDir} /intermediates/javac/demoDebug/classes" )
135- kotlinClasses.add(" ${subProject.buildDir} /tmp/kotlin-classes/demoDebug" )
136- sourceDir.add( " ${subProject.projectDir} /src/main/java" )
137- sourceDir.add( " ${subProject.projectDir} /src/main/kotlin" )
138- sourceDir.add( " ${subProject.projectDir} /src/demoDebug/java" )
139- coverageFiles.add(" ${subProject.buildDir} /outputs/unit_test_code_coverage/demoDebugUnitTest/testDemoDebugUnitTest.exec" )
140- coverageFiles.add(" ${subProject.buildDir} /outputs/code_coverage/demoDebugAndroidTest/connected/coverage.ec" )
141- }
142- classDirectories.setFrom(files(javaClasses, kotlinClasses))
143- additionalClassDirs.setFrom(files(sourceDir))
144- sourceDirectories.setFrom(files(sourceDir))
145- executionData.setFrom(files(coverageFiles))
146- reports {
147- xml.required.set(true )
148- html.required.set(true )
149- }
150- }
151-
152- }
153-
15480}
0 commit comments