Skip to content

Commit dfefaea

Browse files
committed
chore: Configure test jvm constraint on test task, added project wide test jvm constraints
1 parent c6cda9f commit dfefaea

File tree

5 files changed

+88
-87
lines changed

5 files changed

+88
-87
lines changed

buildSrc/src/main/kotlin/datadog.test-jvm-contraints.gradle.kts

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import org.gradle.kotlin.dsl.*
88

99
plugins {
1010
java
11-
jacoco apply false
1211
}
1312

13+
val projectExtension = extensions.create<TestJvmConstraintsExtension>(TestJvmConstraintsExtension.NAME)
14+
1415
val testJvmJavaLauncher = TestJvmJavaLauncher(project)
1516

1617
tasks.withType<Test>().configureEach {
@@ -20,34 +21,44 @@ tasks.withType<Test>().configureEach {
2021

2122
inputs.property("testJvm", providers.gradleProperty("testJvm"))
2223

23-
val extension = project.objects.newInstance<TestJvmConstraintsExtension>(name, project.objects, project.providers, project)
24-
inputs.property("${TestJvmConstraintsExtension.NAME}.allowReflectiveAccessToJdk", extension.allowReflectiveAccessToJdk)
25-
inputs.property("${TestJvmConstraintsExtension.NAME}.excludeJdk", extension.excludeJdk)
26-
inputs.property("${TestJvmConstraintsExtension.NAME}.forceJdk", extension.forceJdk)
27-
inputs.property("${TestJvmConstraintsExtension.NAME}.minJavaVersionForTests", extension.minJavaVersionForTests)
28-
inputs.property("${TestJvmConstraintsExtension.NAME}.maxJavaVersionForTests", extension.maxJavaVersionForTests)
24+
val taskExtension = project.objects.newInstance<TestJvmConstraintsExtension>().also {
25+
configureConventions(it, projectExtension)
26+
}
27+
28+
inputs.property("${TestJvmConstraintsExtension.NAME}.allowReflectiveAccessToJdk", taskExtension.allowReflectiveAccessToJdk).optional(true)
29+
inputs.property("${TestJvmConstraintsExtension.NAME}.excludeJdk", taskExtension.excludeJdk)
30+
inputs.property("${TestJvmConstraintsExtension.NAME}.forceJdk", taskExtension.forceJdk)
31+
inputs.property("${TestJvmConstraintsExtension.NAME}.minJavaVersionForTests", taskExtension.minJavaVersionForTests).optional(true)
32+
inputs.property("${TestJvmConstraintsExtension.NAME}.maxJavaVersionForTests", taskExtension.maxJavaVersionForTests).optional(true)
2933

30-
extensions.add(TestJvmConstraintsExtension.NAME, extension)
34+
extensions.add(TestJvmConstraintsExtension.NAME, taskExtension)
3135

32-
configureTestJvm(extension)
36+
configureTestJvm(taskExtension)
3337
}
3438

3539
// TODO make this part of the testJvm test task extension
40+
/**
41+
* Provide arguments if condition is met.
42+
*/
3643
fun Test.configureJvmArgs(
3744
applyFromVersion: JavaVersion,
3845
jvmArgsToApply: List<String>,
39-
additionalCondition: Provider<Boolean>? = null
46+
additionalCondition: Provider<Boolean> = project.providers.provider { true }
4047
) {
4148
jvmArgumentProviders.add(
4249
ProvideJvmArgsOnJvmLauncherVersion(
4350
this,
4451
applyFromVersion,
4552
jvmArgsToApply,
46-
additionalCondition ?: project.providers.provider { true }
53+
additionalCondition
4754
)
4855
)
4956
}
5057

58+
/**
59+
* Configure the jvm launcher of the test task and ensure the test task
60+
* can be run with the test task launcher.
61+
*/
5162
fun Test.configureTestJvm(extension: TestJvmConstraintsExtension) {
5263
if (testJvmJavaLauncher.javaTestLauncher.isPresent) {
5364
javaLauncher = testJvmJavaLauncher.javaTestLauncher
@@ -56,16 +67,6 @@ fun Test.configureTestJvm(extension: TestJvmConstraintsExtension) {
5667
(extension.isJavaLauncherAllowed(testJvmJavaLauncher.javaTestLauncher.get()) ||
5768
extension.isJdkForced(testJvmJavaLauncher.normalizedTestJvm.get()))
5869
}
59-
60-
// TODO refactor out ?
61-
// Disable jacoco for additional 'testJvm' tests to speed things up a bit
62-
extensions.configure<JacocoTaskExtension> {
63-
val hasCoverage: Boolean by project.extra
64-
// TODO read enabled ?
65-
if (hasCoverage) {
66-
isEnabled = false
67-
}
68-
}
6970
} else {
7071
onlyIf("Is current Daemon JVM allowed") {
7172
extension.isJavaVersionAllowed(JavaVersion.current())
@@ -83,3 +84,48 @@ fun Test.configureTestJvm(extension: TestJvmConstraintsExtension) {
8384
)
8485
}
8586

87+
// Jacoco plugin is not applied on every project
88+
pluginManager.withPlugin("org.gradle.jacoco") {
89+
tasks.withType<Test>().configureEach {
90+
// Disable jacoco for additional 'testJvm' tests to speed things up a bit
91+
if (testJvmJavaLauncher.javaTestLauncher.isPresent) {
92+
extensions.configure<JacocoTaskExtension> {
93+
isEnabled = false
94+
}
95+
}
96+
}
97+
}
98+
99+
/**
100+
* Configures the convention, this tells Gradle where to look for values.
101+
*
102+
* Currently, the extension is still configured to look at project's _extra_ properties.
103+
*/
104+
private fun Test.configureConventions(
105+
taskExtension: TestJvmConstraintsExtension,
106+
projectExtension: TestJvmConstraintsExtension
107+
) {
108+
taskExtension.minJavaVersionForTests.convention(projectExtension.minJavaVersionForTests
109+
.orElse(providers.provider { project.findProperty("${name}MinJavaVersionForTests") as? JavaVersion })
110+
.orElse(providers.provider { project.findProperty("minJavaVersionForTests") as? JavaVersion })
111+
)
112+
taskExtension.maxJavaVersionForTests.convention(projectExtension.maxJavaVersionForTests
113+
.orElse(providers.provider { project.findProperty("${name}MaxJavaVersionForTests") as? JavaVersion })
114+
.orElse(providers.provider { project.findProperty("maxJavaVersionForTests") as? JavaVersion })
115+
)
116+
taskExtension.forceJdk.convention(projectExtension.forceJdk
117+
.orElse(providers.provider {
118+
@Suppress("UNCHECKED_CAST")
119+
project.findProperty("forceJdk") as? List<String> ?: emptyList()
120+
})
121+
)
122+
taskExtension.excludeJdk.convention(projectExtension.excludeJdk
123+
.orElse(providers.provider {
124+
@Suppress("UNCHECKED_CAST")
125+
project.findProperty("excludeJdk") as? List<String> ?: emptyList()
126+
})
127+
)
128+
taskExtension.allowReflectiveAccessToJdk.convention(projectExtension.allowReflectiveAccessToJdk
129+
.orElse(providers.provider { project.findProperty("allowReflectiveAccessToJdk") as? Boolean })
130+
)
131+
}

buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/ProvideJvmArgsOnJvmLauncherVersion.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.gradle.api.JavaVersion
44
import org.gradle.api.provider.Provider
55
import org.gradle.api.tasks.Input
66
import org.gradle.api.tasks.Internal
7+
import org.gradle.api.tasks.Optional
78
import org.gradle.api.tasks.testing.Test
89
import org.gradle.process.CommandLineArgumentProvider
910

@@ -18,6 +19,7 @@ class ProvideJvmArgsOnJvmLauncherVersion(
1819
val jvmArgsToApply: List<String>,
1920

2021
@get:Input
22+
@get:Optional
2123
val additionalCondition: Provider<Boolean>
2224
) : CommandLineArgumentProvider {
2325

buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsExtension.kt

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,20 @@ package datadog.gradle.plugin.testJvmConstraints
33
import org.gradle.api.JavaVersion
44
import org.gradle.api.Project
55
import org.gradle.api.model.ObjectFactory
6+
import org.gradle.api.provider.ListProperty
7+
import org.gradle.api.provider.Property
68
import org.gradle.api.provider.ProviderFactory
79
import org.gradle.kotlin.dsl.extra
810
import org.gradle.kotlin.dsl.listProperty
911
import org.gradle.kotlin.dsl.property
1012
import javax.inject.Inject
1113

12-
abstract class TestJvmConstraintsExtension @Inject constructor(
13-
private val taskName: String,
14-
private val objects: ObjectFactory,
15-
private val providers: ProviderFactory,
16-
private val project: Project,
17-
) {
18-
val minJavaVersionForTests = objects.property<JavaVersion>()
19-
.convention(
20-
providers.provider { project.extra["${taskName}MinJavaVersionForTests"] as JavaVersion }.orElse(
21-
providers.provider { project.extra["minJavaVersionForTests"] as? JavaVersion }
22-
)
23-
)
24-
val maxJavaVersionForTests = objects.property<JavaVersion>()
25-
.convention(
26-
providers.provider { project.extra["${taskName}MaxJavaVersionForTests"] as JavaVersion }.orElse(
27-
providers.provider { project.extra["maxJavaVersionForTests"] as? JavaVersion }
28-
)
29-
)
30-
val forceJdk = objects.listProperty<String>().convention(emptyList())
31-
.convention(providers.provider {
32-
@Suppress("UNCHECKED_CAST")
33-
project.extra["forceJdk"] as? List<String> ?: emptyList()
34-
})
35-
val excludeJdk = objects.listProperty<String>().convention(emptyList())
36-
.convention(providers.provider {
37-
@Suppress("UNCHECKED_CAST")
38-
project.extra["excludeJdk"] as? List<String> ?: emptyList()
39-
})
40-
val allowReflectiveAccessToJdk = objects.property<Boolean>().convention(
41-
providers.provider { project.extra["allowReflectiveAccessToJdk"] as? Boolean ?: false }
42-
)
14+
interface TestJvmConstraintsExtension {
15+
val minJavaVersionForTests: Property<JavaVersion>
16+
val maxJavaVersionForTests: Property<JavaVersion>
17+
val forceJdk: ListProperty<String>
18+
val excludeJdk: ListProperty<String>
19+
val allowReflectiveAccessToJdk: Property<Boolean>
4320

4421
companion object {
4522
const val NAME = "jvmConstraint"

buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmJavaLauncher.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import java.nio.file.Path
1010
import java.nio.file.Paths
1111

1212
class TestJvmJavaLauncher(val project: Project) {
13-
val currentJavaHomePath = System.getProperty("java.home").normalizeToJDKJavaHome()
13+
private val currentJavaHomePath = project.providers.systemProperty("java.home").map { it.normalizeToJDKJavaHome() }
1414
val normalizedTestJvm = project.providers.gradleProperty("testJvm").map { testJvm ->
1515
if (testJvm.isBlank()) {
1616
throw GradleException("testJvm property is blank")
@@ -54,7 +54,7 @@ class TestJvmJavaLauncher(val project: Project) {
5454

5555
val javaTestLauncher = project.providers.zip(testJvmHomePath, normalizedTestJvm) { testJvmHome, testJvm ->
5656
// Only change test JVM if it's not the one we are running the gradle build with
57-
if (currentJavaHomePath == testJvmHome) {
57+
if (currentJavaHomePath.get() == testJvmHome) {
5858
project.providers.provider<JavaLauncher?> { null }
5959
} else {
6060
// This is using internal APIs

gradle/java_no_deps.gradle

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,17 @@ apply from: "$rootDir/gradle/test-suites.gradle"
1414

1515
@CompileStatic
1616
class TracerJavaExtension {
17-
// TODO handle this style as well
18-
// ext {
19-
// forkedTestMaxJavaVersionForTests = JavaVersion.VERSION_11
20-
// mule46ForkedTestMaxJavaVersionForTests = JavaVersion.VERSION_11
21-
// latestDepForkedTestMinJavaVersionForTests = JavaVersion.VERSION_17
22-
// latestDepForkedTestMaxJavaVersionForTests = JavaVersion.VERSION_17
23-
// }
17+
public static String NAME = "tracerJava";
18+
private Project project
2419

2520
Property<Boolean> skipSettingTestJavaVersion
26-
// Property<JavaVersion> minJavaVersionForTests
27-
// Property<JavaVersion> maxJavaVersionForTests
28-
// MapProperty<String, JavaVersion> minJavaVersionForTestTasks
29-
// ListProperty<String> forceJdk
30-
// ListProperty<String> excludeJdk
3121

3222
TracerJavaExtension(ObjectFactory objects, ProviderFactory providers, Project project) {
33-
skipSettingTestJavaVersion = objects.property(Boolean)//.convention(providers.provider { project.findProperty('skipSettingTestJavaVersion') as Boolean })
34-
// minJavaVersionForTests = objects.property(JavaVersion) //.convention(providers.provider { project.findProperty('minJavaVersionForTests') as JavaVersion })
35-
// maxJavaVersionForTests = objects.property(JavaVersion)//.convention(providers.provider { project.findProperty('maxJavaVersionForTests') as JavaVersion })
36-
// forceJdk = objects.listProperty(String).convention([]) //.convention(providers.provider { project.findProperty('forceJdk') as List<String> })
37-
// excludeJdk = objects.listProperty(String).convention([]) //.convention(providers.provider { project.findProperty('excludeJdk') as List<String> })
38-
}
39-
40-
def configureSourceSet(JavaVersion javaVersion) {
41-
// TODO configure source sets and co
23+
this.project = project
24+
this.skipSettingTestJavaVersion = objects.property(Boolean).convention(providers.provider { project.findProperty('skipSettingTestJavaVersion') as Boolean })
4225
}
4326
}
44-
def tracerJavaExtension = extensions.create("tracerJava", TracerJavaExtension, objects, providers, project)
27+
def tracerJavaExtension = extensions.create(TracerJavaExtension.NAME, TracerJavaExtension, objects, providers, project)
4528

4629

4730

@@ -67,6 +50,8 @@ def applyCodeCoverage = !(
6750

6851
ext.applyCodeCoverage = applyCodeCoverage
6952

53+
// https://stackoverflow.com/questions/42501869/gradle-skip-jacoco-during-test
54+
// https://poetengineer.postach.io/post/how-to-conditionally-enable-disable-jacoco-in-gradle-build
7055
if (applyCodeCoverage) {
7156
apply from: "$rootDir/gradle/jacoco.gradle"
7257
}
@@ -82,17 +67,6 @@ java {
8267
withSourcesJar()
8368
}
8469

85-
// TODO source set config, below is pseudo code based on tracerJavaExtension.minJavaVersionForTests
86-
// sourceSets {
87-
// def wanted_version = tracerJavaExtension.minJavaVersionForTests.orNull
88-
// if (wanted_version) {
89-
// println("source set config ${project.path}")
90-
// register("${SourceSet.MAIN_SOURCE_SET_NAME}2_java${wanted_version.majorVersion}") {
91-
// java.srcDirs = ["${project.projectDir}/src/main/yaj${wanted_version.majorVersion}"]
92-
// }
93-
// }
94-
// }
95-
9670
// TODO configures the source sets via the extension
9771
if (project.hasProperty('minJavaVersionForTests') && project.findProperty('minJavaVersionForTests') != JavaVersion.VERSION_1_7) {
9872
def version = JavaVersion.toVersion(project.findProperty('minJavaVersionForTests'))
@@ -122,6 +96,8 @@ if (project.hasProperty('minJavaVersionForTests') && project.findProperty('minJa
12296
}
12397

12498
// TODO configure this via extension
99+
// If unset (hasProperty is false), or value is explicitly set to false (case not seen), then
100+
// sets the compiler to `minJavaVersionForTests` version
125101
// In some cases we would like to avoid setting java version to `minJavaVersionForTests`.
126102
// For example we would like to be able to run profiling tests with ZULU8, but we cannot run it with other JDK8 implementations at the moment
127103
def skipSettingTestJavaVersion = project.hasProperty('skipSettingTestJavaVersion') && project.findProperty('skipSettingTestJavaVersion')

0 commit comments

Comments
 (0)