From 9f4b41d4dcc47fb3a1ff0efac49d6407dc37c9e5 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 23 Jul 2026 09:29:06 +0200 Subject: [PATCH] chore: test jvm constraints plugin now configures jmh plugin --- buildSrc/build.gradle.kts | 2 ++ .../TestJvmConstraintsPlugin.kt | 11 ++++++++ .../TestJvmConstraintsPluginTest.kt | 27 +++++++++++++++++++ dd-trace-core/build.gradle | 6 ----- internal-api/build.gradle.kts | 6 ----- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 991ca899596..86c975353cc 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -109,6 +109,8 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-core") compileOnly(libs.develocity) + + testImplementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") } tasks.compileKotlin { diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt index 02d1c0d0a9a..78342d7642f 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt @@ -6,6 +6,7 @@ import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.testing.Test import org.gradle.kotlin.dsl.* @@ -42,6 +43,16 @@ class TestJvmConstraintsPlugin : Plugin { configureTestJvm(testJvmSpec, taskExtension) } + // JMH plugin is not applied on every project + project.pluginManager.withPlugin("me.champeau.jmh") { + val jmh = project.extensions.getByName("jmh") + + // Avoid linking against JMH types, which are unavailable to the parent buildSrc classloader. + @Suppress("UNCHECKED_CAST") + val jvm = jmh.javaClass.getMethod("getJvm").invoke(jmh) as Property + jvm.set(testJvmSpec.javaTestLauncher.map { it.executablePath.asFile.absolutePath }) + } + // Jacoco plugin is not applied on every project project.pluginManager.withPlugin("org.gradle.jacoco") { project.tasks.withType().configureEach { diff --git a/buildSrc/src/test/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPluginTest.kt b/buildSrc/src/test/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPluginTest.kt index 438da18f92b..11ead139a3a 100644 --- a/buildSrc/src/test/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPluginTest.kt +++ b/buildSrc/src/test/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPluginTest.kt @@ -1,7 +1,9 @@ package datadog.gradle.plugin.testJvmConstraints import datadog.gradle.plugin.testJvmConstraints.TestJvmConstraintsExtension.Companion.TEST_JVM_CONSTRAINTS +import me.champeau.jmh.JmhParameters import org.assertj.core.api.Assertions.assertThat +import org.gradle.api.JavaVersion import org.gradle.api.tasks.testing.Test as GradleTest import org.gradle.testfixtures.ProjectBuilder import org.gradle.testing.jacoco.plugins.JacocoTaskExtension @@ -21,6 +23,31 @@ class TestJvmConstraintsPluginTest { assertThat(testTask.extensions.findByName(TEST_JVM_CONSTRAINTS)).isInstanceOf(TestJvmConstraintsExtension::class.java) } + @Test + fun `plugin configures jmh to use the test jvm`() { + val propertyName = "org.gradle.project.${TestJvmSpec.TEST_JVM}" + val previousValue = System.setProperty(propertyName, JavaVersion.current().majorVersion) + + try { + val project = ProjectBuilder.builder().build() + + project.pluginManager.apply("dd-trace-java.test-jvm-constraints") + assertThat(project.extensions.findByName("jmh")).isNull() + + project.pluginManager.apply("me.champeau.jmh") + + val jmh = project.extensions.getByType(JmhParameters::class.java) + val expectedExecutable = TestJvmSpec(project).javaTestLauncher.get().executablePath.asFile.absolutePath + assertThat(jmh.jvm.get()).isEqualTo(expectedExecutable) + } finally { + if (previousValue == null) { + System.clearProperty(propertyName) + } else { + System.setProperty(propertyName, previousValue) + } + } + } + @Test fun `jacoco is disabled for additional test jvm when coverage is not checked`() { val testTask = testTaskWithJacoco() diff --git a/dd-trace-core/build.gradle b/dd-trace-core/build.gradle index a5ec602366e..de6ed598277 100644 --- a/dd-trace-core/build.gradle +++ b/dd-trace-core/build.gradle @@ -1,5 +1,3 @@ -import datadog.gradle.plugin.testJvmConstraints.TestJvmSpec - plugins { id 'me.champeau.jmh' id 'dd-trace-java.version-file' @@ -135,8 +133,4 @@ jmh { if (project.hasProperty('jmh.profilers')) { profilers = project.property('jmh.profilers').tokenize(',') } - if (project.hasProperty('testJvm')) { - def testJvmSpec = new TestJvmSpec(project) - jvm = testJvmSpec.javaTestLauncher.map { it.executablePath.asFile.absolutePath } - } } diff --git a/internal-api/build.gradle.kts b/internal-api/build.gradle.kts index 65be1563eda..95c0fa2b7a5 100644 --- a/internal-api/build.gradle.kts +++ b/internal-api/build.gradle.kts @@ -1,4 +1,3 @@ -import datadog.gradle.plugin.testJvmConstraints.TestJvmSpec import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis import groovy.lang.Closure @@ -291,9 +290,4 @@ jmh { if (project.hasProperty("jmh.includes")) { includes.add(project.property("jmh.includes") as String) } - - if (project.hasProperty("testJvm")) { - val testJvmSpec = TestJvmSpec(project) - jvm.set(testJvmSpec.javaTestLauncher.map { it.executablePath.asFile.absolutePath }) - } }