/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ /** * ES Plugin build tools don't work with the Gradle Jacoco Plugin to report coverage out of the box. * https://github.com/elastic/elasticsearch/issues/28867. * * This code sets up coverage reporting manually for ES plugin tests. This is complicated because: * 1. The ES integTest Task doesn't implement Gradle's JavaForkOptions so we have to manually start the jacoco agent with the test JVM * 2. The cluster nodes are stopped using 'kill -9' which means jacoco can't dump it's execution output to a file on VM shutdown * 3. The Java Security Manager prevents JMX from writing execution output to the file. * * To workaround these we start the cluster with jmx enabled and then use Jacoco's JMX MBean to get the execution data before the * cluster is stopped and dump it to a file. Luckily our current security policy seems to allow this. This will also probably * break if there are multiple nodes in the integTestCluster. But for now... it sorta works. */ import org.apache.tools.ant.taskdefs.condition.Os apply plugin: 'jacoco' // Get gradle to generate the required jvm agent arg for us using a dummy tasks of type Test. Unfortunately Elastic's // testing tasks don't derive from Test so the jacoco plugin can't do this automatically. def jacocoDir = "${buildDir}/jacoco" task dummyTest(type: Test) { enabled = false workingDir = file("/") // Force absolute path to jacoco agent jar jacoco { destinationFile = file("${jacocoDir}/test.exec") destinationFile.parentFile.mkdirs() jmx = true } } task dummyIntegTest(type: Test) { enabled = false workingDir = file("/") // Force absolute path to jacoco agent jar jacoco { destinationFile = file("${jacocoDir}/integTest.exec") destinationFile.parentFile.mkdirs() jmx = true } } integTest { systemProperty 'jacoco.dir', "${jacocoDir}" systemProperty 'jmx.serviceUrl', "service:jmx:rmi:///jndi/rmi://127.0.0.1:7777/jmxrmi" } jacocoTestReport { dependsOn integTest, test executionData.from = [dummyTest.jacoco.destinationFile, dummyIntegTest.jacoco.destinationFile] sourceDirectories.from = sourceSets.main.java.sourceDirectories classDirectories.from = files(sourceSets.main.java.outputDir) reports { html.enabled = true // human readable csv.enabled = true xml.enabled = true // for coverlay } } afterEvaluate { jacocoTestReport.dependsOn integTest testClusters.integTest { if (Os.isFamily(Os.FAMILY_WINDOWS)) { // Replacing build with absolute path to fix the error "error opening zip file or JAR manifest missing : /build/tmp/expandedArchives/..../jacocoagent.jar" jvmArgs " ${dummyIntegTest.jacoco.getAsJvmArg()}".replace('build',"${buildDir}") } else { jvmArgs " ${dummyIntegTest.jacoco.getAsJvmArg()}".replace('javaagent:','javaagent:/') } systemProperty 'com.sun.management.jmxremote', "true" systemProperty 'com.sun.management.jmxremote.authenticate', "false" systemProperty 'com.sun.management.jmxremote.port', "7777" systemProperty 'com.sun.management.jmxremote.ssl', "false" systemProperty 'java.rmi.server.hostname', "127.0.0.1" } }