Skip to content

Commit 434b694

Browse files
authored
Create configure_tests convention plugin (#9859)
* Create configure-tests convention plugin * Use lazy providers for property evaluation * Use more lazy API configurations * Remove old file references and add missing configuration * Alphabetize instrumentations * Comment tasks * Add comment for forked test memory limit * Address quick formatting review comments * Add develocity as a dependency * Introduce testInstrumentation extension * Address review comments * Typo * Move extension definition to top of file
1 parent 5743cd5 commit 434b694

File tree

40 files changed

+172
-172
lines changed

40 files changed

+172
-172
lines changed

buildSrc/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ apply {
4949
from("$rootDir/../gradle/repositories.gradle")
5050
}
5151

52+
repositories {
53+
gradlePluginPortal()
54+
}
55+
5256
dependencies {
5357
implementation(gradleApi())
5458
implementation(localGroovy())
@@ -69,6 +73,8 @@ dependencies {
6973
implementation("com.fasterxml.jackson.core:jackson-databind")
7074
implementation("com.fasterxml.jackson.core:jackson-annotations")
7175
implementation("com.fasterxml.jackson.core:jackson-core")
76+
77+
compileOnly(libs.develocity)
7278
}
7379

7480
tasks.compileKotlin {
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import org.gradle.api.tasks.testing.Test
2+
import org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions
3+
import org.gradle.api.services.BuildService
4+
import org.gradle.api.services.BuildServiceParameters
5+
import org.gradle.testing.base.TestingExtension
6+
import org.gradle.api.plugins.jvm.JvmTestSuite
7+
import java.time.Duration
8+
import java.time.temporal.ChronoUnit
9+
10+
val isTestingInstrumentation = providers.provider {
11+
project.findProperty("testingInstrumentation") as? Boolean ?: false
12+
}
13+
14+
// Need concrete implementation of BuildService in Kotlin
15+
abstract class ForkedTestLimit : BuildService<BuildServiceParameters.None>
16+
// Forked tests will fail with OOM if the memory is set too high. Gitlab allows at least a limit of 3.
17+
val forkedTestsMemoryLimit = 3
18+
19+
val forkedTestLimit = gradle.sharedServices.registerIfAbsent("forkedTestLimit", ForkedTestLimit::class.java) {
20+
maxParallelUsages.set(forkedTestsMemoryLimit)
21+
}
22+
23+
extensions.findByType<TestingExtension>()?.apply {
24+
suites.withType<JvmTestSuite>().configureEach {
25+
// Use JUnit 5 to run tests
26+
useJUnitJupiter()
27+
}
28+
}
29+
30+
// Use lazy providers to avoid evaluating the property until it is needed
31+
val skipTestsProvider = rootProject.providers.gradleProperty("skipTests")
32+
val skipForkedTestsProvider = rootProject.providers.gradleProperty("skipForkedTests")
33+
val skipFlakyTestsProvider = rootProject.providers.gradleProperty("skipFlakyTests")
34+
val runFlakyTestsProvider = rootProject.providers.gradleProperty("runFlakyTests")
35+
val activePartitionProvider = providers.provider {
36+
project.extra.properties["activePartition"] as? Boolean ?: true
37+
}
38+
39+
// Go through the Test tasks and configure them
40+
tasks.withType<Test>().configureEach {
41+
enabled = activePartitionProvider.get()
42+
43+
// Disable all tests if skipTests property was specified
44+
onlyIf("skipTests are undefined or false") { !skipTestsProvider.isPresent }
45+
46+
// Enable force rerun of tests with -Prerun.tests.${project.name}
47+
outputs.upToDateWhen {
48+
!rootProject.providers.gradleProperty("rerun.tests.${project.name}").isPresent
49+
}
50+
51+
// Avoid executing classes used to test testing frameworks instrumentation
52+
if (isTestingInstrumentation.get()) {
53+
exclude("**/TestAssumption*", "**/TestSuiteSetUpAssumption*")
54+
exclude("**/TestDisableTestTrace*")
55+
exclude("**/TestError*")
56+
exclude("**/TestFactory*")
57+
exclude("**/TestFailed*")
58+
exclude("**/TestFailedWithSuccessPercentage*")
59+
exclude("**/TestInheritance*", "**/BaseTestInheritance*")
60+
exclude("**/TestParameterized*")
61+
exclude("**/TestRepeated*")
62+
exclude("**/TestSkipped*")
63+
exclude("**/TestSkippedClass*")
64+
exclude("**/TestSucceed*")
65+
exclude("**/TestTemplate*")
66+
exclude("**/TestUnskippable*")
67+
exclude("**/TestWithSetup*")
68+
}
69+
70+
// Split up tests that want to run forked in their own separate JVM for generated tasks
71+
if (name.startsWith("forkedTest") || name.endsWith("ForkedTest")) {
72+
setExcludes(emptyList())
73+
setIncludes(listOf("**/*ForkedTest*"))
74+
forkEvery = 1
75+
// Limit the number of concurrent forked tests
76+
usesService(forkedTestLimit)
77+
onlyIf("skipForkedTests are undefined or false") { !skipForkedTestsProvider.isPresent }
78+
} else {
79+
exclude("**/*ForkedTest*")
80+
}
81+
82+
// Set test timeout for 20 minutes. Default job timeout is 1h (configured on CI level).
83+
timeout.set(Duration.of(20, ChronoUnit.MINUTES))
84+
}
85+
86+
// Register a task "allTests" that depends on all non-latest and non-traceAgentTest Test tasks.
87+
// This is used when we only want to run the 'main' test sets.
88+
tasks.register("allTests") {
89+
dependsOn(tasks.withType<Test>().matching { testTask ->
90+
!testTask.name.contains("latest", ignoreCase = true) && testTask.name != "traceAgentTest"
91+
})
92+
}
93+
94+
// Register a task "allLatestDepTests" that depends on all Test tasks whose names include 'latest'.
95+
// This is used when we want to run tests against the latest dependency versions.
96+
tasks.register("allLatestDepTests") {
97+
dependsOn(tasks.withType<Test>().matching { testTask ->
98+
!testTask.name.contains("latest", ignoreCase = true)
99+
})
100+
}
101+
102+
// Make the 'check' task depend on all Test tasks in the project.
103+
// This means that when running the 'check' task, all Test tasks will run as well.
104+
tasks.named("check") {
105+
dependsOn(tasks.withType<Test>())
106+
}
107+
108+
tasks.withType<Test>().configureEach {
109+
// Flaky tests management for JUnit 5
110+
if (testFramework is JUnitPlatformOptions) {
111+
val junitPlatform = testFramework as JUnitPlatformOptions
112+
if (skipFlakyTestsProvider.isPresent) {
113+
junitPlatform.excludeTags("flaky")
114+
} else if (runFlakyTestsProvider.isPresent) {
115+
junitPlatform.includeTags("flaky")
116+
}
117+
}
118+
119+
// Flaky tests management for Spock
120+
if (skipFlakyTestsProvider.isPresent) {
121+
jvmArgs("-Drun.flaky.tests=false")
122+
} else if (runFlakyTestsProvider.isPresent) {
123+
jvmArgs("-Drun.flaky.tests=true")
124+
}
125+
}
126+
127+
tasks.withType<Test>().configureEach {
128+
// https://docs.gradle.com/develocity/flaky-test-detection/
129+
// https://docs.gradle.com/develocity/gradle-plugin/current/#test_retry
130+
develocity.testRetry {
131+
if (providers.environmentVariable("CI").isPresent()) {
132+
maxRetries = 3
133+
}
134+
}
135+
}

dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ protobuf {
4040
addTestSuiteForDir('latestDepTest', 'test')
4141
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')
4242

43-
apply from: "$rootDir/gradle/configure_tests.gradle"
44-
4543
tasks.named("latestDepTest", Test) {
4644
finalizedBy 'latestDepForkedTest'
4745
}

dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ muzzle {
1616
}
1717

1818
apply from: "$rootDir/gradle/java.gradle"
19-
apply from: "$rootDir/gradle/configure_tests.gradle"
2019

2120
addTestSuiteForDir('latestDepTest', 'test')
2221

dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ apply from: "$rootDir/gradle/java.gradle"
1313
addTestSuiteForDir('latestDepTest', 'test')
1414
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')
1515

16-
apply from: "$rootDir/gradle/configure_tests.gradle"
17-
1816
dependencies {
1917
compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-sqs', version: '1.11.0'
2018
compileOnly group: 'com.amazonaws', name: 'amazon-sqs-java-messaging-lib', version: '1.0.0'

dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ apply from: "$rootDir/gradle/java.gradle"
1414
addTestSuiteForDir('latestDepTest', 'test')
1515
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')
1616

17-
apply from: "$rootDir/gradle/configure_tests.gradle"
18-
1917
dependencies {
2018
compileOnly group: 'software.amazon.awssdk', name: 'sqs', version: '2.2.0'
2119
compileOnly group: 'com.amazonaws', name: 'amazon-sqs-java-messaging-lib', version: '2.0.0'

dd-java-agent/instrumentation/cucumber/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
ext.testingInstrumentation = true
2+
13
apply from: "$rootDir/gradle/java.gradle"
24

35
muzzle {

dd-java-agent/instrumentation/jakarta-jms/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ muzzle {
1414
}
1515

1616
apply from: "$rootDir/gradle/java.gradle"
17-
apply from: "$rootDir/gradle/configure_tests.gradle"
1817

1918
repositories {
2019
maven {

dd-java-agent/instrumentation/jms/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ repositories {
2626
addTestSuite('latestDepTest')
2727
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')
2828

29-
apply from: "$rootDir/gradle/configure_tests.gradle"
30-
3129
tasks.named("latestDepTest", Test) {
3230
finalizedBy 'latestDepForkedTest'
3331
}

dd-java-agent/instrumentation/junit/junit-4.10/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ plugins {
55
id 'org.jetbrains.kotlin.jvm'
66
}
77

8+
ext.testingInstrumentation = true
9+
810
apply from: "$rootDir/gradle/java.gradle"
911
apply from: "$rootDir/gradle/test-with-kotlin.gradle"
1012

0 commit comments

Comments
 (0)