From d58b07572d2dbbd90c35fb1dabd107c5ed211bfc Mon Sep 17 00:00:00 2001 From: Hans Ott Date: Tue, 14 Jul 2026 19:13:45 +0200 Subject: [PATCH 1/3] Load JaCoCo before our agent --- agent_api/build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/agent_api/build.gradle b/agent_api/build.gradle index b0f758f1..96c01bb2 100644 --- a/agent_api/build.gradle +++ b/agent_api/build.gradle @@ -46,7 +46,6 @@ dependencies { test { jvmArgs '--add-opens', 'java.base/java.util=ALL-UNNAMED' jvmArgs '--add-opens', 'java.base/java.lang=ALL-UNNAMED' - jvmArgs "-javaagent:${project.rootDir}/dist/agent.jar=mode=daemon-disabled" jvmArgs '-Dnet.bytebuddy.experimental=true' // Mockito support. systemProperty 'AIK_agent_dir', "${project.rootDir}/dist" @@ -64,6 +63,13 @@ test { jacoco { enabled = true } + doFirst { + // JaCoCo's javaagent must load before our own agent.jar. Our agent registers a + // retransformation-capable ByteBuddy transformer; if it loads first, JaCoCo silently + // stops recording coverage for almost every class, not just the ones we instrument. + jvmArgs jacoco.getAsJvmArg(), "-javaagent:${project.rootDir}/dist/agent.jar=mode=daemon-disabled" + jacoco.enabled = false + } } jacocoTestReport { From 1d5596baa02710a312700a0f59cf997582ad66f5 Mon Sep 17 00:00:00 2001 From: Hans Ott Date: Thu, 13 Aug 2026 18:23:36 +0200 Subject: [PATCH 2/3] Enforce 80% code coverage and upgrade jacoco to 0.8.15 --- Makefile | 2 +- agent_api/build.gradle | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index f6ab4e89..9822afeb 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ test: check_binaries AIKIDO_LOG_LEVEL="error" AIKIDO_TOKEN="token" ./gradlew test cov: check_binaries - AIKIDO_LOG_LEVEL="error" AIKIDO_TOKEN="token" ./gradlew test --rerun-tasks -PcoverageRun jacocoTestReport + AIKIDO_LOG_LEVEL="error" AIKIDO_TOKEN="token" ./gradlew test --rerun-tasks -PcoverageRun jacocoTestReport jacocoTestCoverageVerification # Binaries : diff --git a/agent_api/build.gradle b/agent_api/build.gradle index 96c01bb2..68df5cb4 100644 --- a/agent_api/build.gradle +++ b/agent_api/build.gradle @@ -5,7 +5,7 @@ plugins { } jacoco { - toolVersion "0.8.12" + toolVersion "0.8.15" reportsDirectory = layout.buildDirectory.dir('jacoco') } @@ -64,9 +64,8 @@ test { enabled = true } doFirst { - // JaCoCo's javaagent must load before our own agent.jar. Our agent registers a - // retransformation-capable ByteBuddy transformer; if it loads first, JaCoCo silently - // stops recording coverage for almost every class, not just the ones we instrument. + // Load JaCoCo before our agent so it can track classes from the start. + // Otherwise, some tested code may incorrectly appear uncovered. jvmArgs jacoco.getAsJvmArg(), "-javaagent:${project.rootDir}/dist/agent.jar=mode=daemon-disabled" jacoco.enabled = false } @@ -81,8 +80,20 @@ jacocoTestReport { dependsOn test } +jacocoTestCoverageVerification { + violationRules { + rule { + limit { + counter = 'LINE' + minimum = 0.80 + } + } + } + dependsOn test +} + shadowJar { mergeServiceFiles() manifest { } -} \ No newline at end of file +} From 559b9338c1f4ad143d002c50a6e427ee3e726e82 Mon Sep 17 00:00:00 2001 From: Hans Ott Date: Thu, 13 Aug 2026 18:27:09 +0200 Subject: [PATCH 3/3] Update comment --- agent_api/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent_api/build.gradle b/agent_api/build.gradle index 68df5cb4..62a87ebd 100644 --- a/agent_api/build.gradle +++ b/agent_api/build.gradle @@ -64,8 +64,8 @@ test { enabled = true } doFirst { - // Load JaCoCo before our agent so it can track classes from the start. - // Otherwise, some tested code may incorrectly appear uncovered. + // JaCoCo starts tracking a class when Java loads it. + // Our agent loads agent_api classes, so JaCoCo must start first. jvmArgs jacoco.getAsJvmArg(), "-javaagent:${project.rootDir}/dist/agent.jar=mode=daemon-disabled" jacoco.enabled = false }