/* ### * IP: GHIDRA * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import groovy.io.FileType; apply plugin:'jacoco' dependencies { jacocoAnt 'org.jacoco:org.jacoco.ant:0.8.2' jacocoAgent 'org.jacoco:org.jacoco.agent:0.8.2' } def String jacocoRootExecPath = "$buildDir/jacoco/jacocoMerge.exec" delete new File(jacocoRootExecPath) // If the merged exec file (output from jacocoMerge) exists, // jacocoReport & jacocoBranchReport tasks are skipped and // the report is not generated. // So always delete the merged file before the determination // to skip a task is made. /********************************************************************************* * Generate the Jacoco excludes list from file (this will strip out comments and * whitespace). * * This uses 'gradle/support/jacoco.excludes.src.txt' to generate list of * class exclusions for the 'jacocoReport' task. * * Task to generate an aggregate jacoco report from subprojects with * Java sourceSets *********************************************************************************/ def String[] generateExcludesList() { File inputFile = new File(rootProject.projectDir, "gradle/support/jacoco.excludes.src.txt") def lines = inputFile.readLines() .findAll({ line -> !shouldIgnoreLine(line) }) .collect() return lines } /* An ignorable line is one that is only whitespace or that starts with a comment marker */ def shouldIgnoreLine(line) { if (line.startsWith('#')){ return true } if (line.startsWith("//")) { return true } if (line.trim().isEmpty()) { return true } return false } List excludesList = generateExcludesList() /********************************************************************************* * Task to merge multiple jacoco execution data files into one *********************************************************************************/ task jacocoMerge(type: JacocoMerge) { description = 'Task to merge multiple jacoco execution data files into one.' destinationFile = new File(jacocoRootExecPath) dependsOn { subprojects.findAll { p -> p.plugins.hasPlugin('jacoco') }.test } dependsOn { subprojects.findAll { p -> p.plugins.hasPlugin('jacoco') }.integrationTest } executionData fileTree(rootDir) { include '**/*.exec' } } /********************************************************************************* * Task to generate an aggregate jacoco report from subprojects with * Java sourceSets *********************************************************************************/ task jacocoReport(type: JacocoReport, group: 'Coverage reports') { description = 'Generates an aggregate Jacoco report from all subprojects' dependsOn 'jacocoMerge' executionData new File(jacocoRootExecPath) // Setting these source/class dirs MUST be done in the configuration phase (we used // to do it in a doFirst block but that was deprecated in later gradle builds). However, // we have to delay evaluation of the subprojects (using the '{ }' notation) to wait for // some project attributes (eg: 'sourceSets') to be made available. additionalSourceDirs files({ subprojects.findAll { p -> p.plugins.hasPlugin('jacoco') }.sourceSets.main.java.srcDirs }) additionalClassDirs files({ subprojects.findAll { p -> p.plugins.hasPlugin('jacoco') }.sourceSets.main.output }).asFileTree.matching { exclude excludesList } reports { html { enabled true destination new File(rootDir.absolutePath + "/jacocoReport") } xml { enabled false } } }