diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ba10349d5a..b29ab7a669e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -100,6 +100,7 @@ workflow: - "17" - "21" - "25" + - "27" # JDK 27 TODO: remove after GA (tip will move to 27) - "semeru11" - "oracle8" - "zulu8" @@ -744,7 +745,7 @@ muzzle-dep-report: needs: [] variables: <<: *tier_m_variables - DEFAULT_TEST_JVMS: /^(8|11|17|21|25|tip)$/ + DEFAULT_TEST_JVMS: /^(8|11|17|21|25|27|tip)$/ # Java 27 TODO: remove 27 after GA (tip will move to 27) GRADLE_PARAMS: "-PskipFlakyTests" TESTCONTAINERS_CHECKS_DISABLE: "true" TESTCONTAINERS_RYUK_DISABLED: "true" @@ -980,7 +981,7 @@ test_inst_latest: CACHE_TYPE: "latestdep" parallel: matrix: - - testJvm: ["8", "17", "21", "25", "tip"] # the latest "tip" version is 26 + - testJvm: ["8", "17", "21", "25", "27", "tip"] # Java 27 TODO: remove 27 after GA (tip will move to 27) # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time # This emulates "parallel" by including it in the matrix CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"] @@ -993,7 +994,7 @@ test_inst_latest_arm64: CACHE_TYPE: "latestdep" parallel: matrix: - - testJvm: ["8", "17", "21", "25", "tip"] # the latest "tip" version is 26 + - testJvm: ["8", "17", "21", "25", "27", "tip"] # Java 27 TODO: remove 27 after GA (tip will move to 27) # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time # This emulates "parallel" by including it in the matrix CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"] @@ -1063,7 +1064,7 @@ test_debugger: variables: GRADLE_TARGET: ":debuggerTest" CACHE_TYPE: "base" - DEFAULT_TEST_JVMS: /^(8|11|17|21|25|tip|semeru8)$/ # the latest "tip" version is 26 + DEFAULT_TEST_JVMS: /^(8|11|17|21|25|27|tip|semeru8)$/ # Java 27 TODO: remove 27 after GA (tip will move to 27) parallel: matrix: *test_matrix # avoid running coverage for semeru8, semeru11, semeru17 and ibm8 as some tests are disabled and therefore cannot reach the diff --git a/.gitlab/upload_ciapp.sh b/.gitlab/upload_ciapp.sh index a4c36438796..e918ed16593 100755 --- a/.gitlab/upload_ciapp.sh +++ b/.gitlab/upload_ciapp.sh @@ -16,6 +16,10 @@ if [ -n "$TEST_JVM" ]; then for var in $(compgen -v JAVA_ | grep -E '^JAVA_[0-9]+_HOME$'); do ver="${var#JAVA_}" ver="${ver%_HOME}" + # JDK 27 TODO: remove after GA (tip will move to 27) + if [ "$ver" = "27" ]; then + continue + fi if [ "$ver" -gt "$MAX_VER" ] 2>/dev/null; then MAX_VER="$ver" fi diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt index 16fd16977d8..b9dad16bd1a 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt @@ -37,6 +37,16 @@ import java.nio.file.Paths class TestJvmSpec(val project: Project) { companion object { const val TEST_JVM = "testJvm" + + // JDK 27 TODO: remove after GA (tip will move to 27) + internal fun resolveTipJavaVersion(javaVersions: List): String { + val tipJavaVersions = javaVersions.filterNot { it == 27 } + if (tipJavaVersions.isEmpty()) { + throw GradleException("No Java installations found for tip after excluding Java 27.") + } + + return tipJavaVersions.max().toString() + } } private val currentJavaHomePath = project.providers.systemProperty("java.home").map { it.normalizeToJDKJavaHome() } @@ -63,7 +73,7 @@ class TestJvmSpec(val project: Project) { throw GradleException("No Java installations found via toolchains or JAVA_X_HOME environment variables.") } - javaVersions.max().toString() + resolveTipJavaVersion(javaVersions) // JDK 27 TODO: revert back to "javaVersions.max().toString()" after GA } else -> testJvm diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java index 261d6cd2e64..674d295d901 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.doAnswer; @@ -24,6 +25,7 @@ import com.datadog.debugger.sink.DebuggerSink; import com.datadog.debugger.sink.ProbeStatusSink; import com.datadog.debugger.util.TestSnapshotListener; +import datadog.environment.JavaVirtualMachine; import datadog.trace.api.Config; import datadog.trace.api.GlobalTracer; import datadog.trace.api.Tracer; @@ -132,8 +134,13 @@ void setup() { DebuggerContext.initProbeResolver(null); } + private static void assumeNotJdk27() { + assumeFalse(JavaVirtualMachine.isJavaVersion(27), "JDK 27 TODO: address failing test"); + } + @Test public void testDump() { + assumeNotJdk27(); Config config = createConfig(); Path initialTmpDir = DebuggerTransformer.DUMP_PATH; DebuggerTransformer.DUMP_PATH = Paths.get("/tmp/debugger"); @@ -171,6 +178,7 @@ public void testDump() { @Test public void testMultiProbes() { + assumeNotJdk27(); doTestMultiProbes( Class::getName, new ProbeTestInfo(ArrayList.class, "add"), @@ -179,6 +187,7 @@ public void testMultiProbes() { @Test public void testMultiProbesSimpleName() { + assumeNotJdk27(); doTestMultiProbes( Class::getSimpleName, new ProbeTestInfo(ArrayList.class, "add"), @@ -273,6 +282,7 @@ public void testBlockedProbes() { @Test public void classBeingRedefinedNull() { + assumeNotJdk27(); Config config = createConfig(); LogProbe logProbe = LogProbe.builder().where("ArrayList", "add").probeId("", 0).build(); Configuration configuration = @@ -305,6 +315,7 @@ public void classBeingRedefinedNull() { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Issue with J9: Flaky") public void classGenerationFailed() { + assumeNotJdk27(); Config config = createConfig(); final String CLASS_NAME = ArrayList.class.getTypeName(); final String METHOD_NAME = "add"; @@ -371,6 +382,7 @@ public void classGenerationFailed() { @Test public void ordering() { + assumeNotJdk27(); Config config = createConfig(); List invocationOrder = new ArrayList<>(); MetricProbe metricProbe = createMock(MetricProbe.class, invocationOrder, "metric"); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java index 4fb5ee83a4b..33c97029df5 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java @@ -3,6 +3,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; @@ -15,6 +16,7 @@ import com.datadog.debugger.sink.SymbolSink; import com.datadog.debugger.util.ClassNameFiltering; +import datadog.environment.JavaVirtualMachine; import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; @@ -81,6 +83,7 @@ void testScanQueuedCorruptedJars() { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testScopeFilter() { + assumeFalse(JavaVirtualMachine.isJavaVersion(27), "JDK 27 TODO: address failing test"); ScopeFilter mockFilter = mock(ScopeFilter.class); when(mockFilter.filterOut(any())).thenReturn(true); SymbolSink symbolSink = mock(SymbolSink.class); diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy index 31e5349f01f..7e4dd63689f 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy @@ -3,6 +3,7 @@ import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static org.asynchttpclient.Dsl.asyncHttpClient +import datadog.environment.JavaVirtualMachine import datadog.trace.agent.test.base.HttpClientTest import datadog.trace.agent.test.naming.TestingNettyHttpNamingConventions import datadog.trace.bootstrap.instrumentation.api.Tags @@ -22,6 +23,7 @@ import org.asynchttpclient.DefaultAsyncHttpClientConfig import org.asynchttpclient.Response import org.asynchttpclient.proxy.ProxyServer import spock.lang.AutoCleanup +import spock.lang.IgnoreIf import spock.lang.Timeout import java.util.concurrent.ExecutionException @@ -95,6 +97,9 @@ abstract class Netty41ClientTest extends HttpClientTest { return false } + @IgnoreIf(reason = "JDK 27 TODO: address failing test", value = { + JavaVirtualMachine.isJavaVersion(27) + }) def "connection error (unopened port)"() { given: def uri = new URI("http://127.0.0.1:$UNUSABLE_PORT/") diff --git a/dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy b/dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy index 50428eafa1b..6c68e2a0eb6 100644 --- a/dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy +++ b/dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy @@ -1,8 +1,10 @@ package datadog.trace.agent +import datadog.environment.JavaVirtualMachine import datadog.trace.agent.test.IntegrationTestUtils import jvmbootstraptest.AgentLoadedChecker import jvmbootstraptest.JmxStartedChecker +import spock.lang.IgnoreIf import spock.lang.Specification import spock.lang.Timeout @@ -73,6 +75,9 @@ class JMXFetchTest extends Specification { returnCode == 0 } + @IgnoreIf(reason = "JDK 27 TODO: address failing test", value = { + JavaVirtualMachine.isJavaVersion(27) + }) def "test jmxfetch config"() { setup: def configSettings = names.collect { diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java index 5461ec2056b..b8711daec49 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java @@ -117,6 +117,8 @@ void testNew( int expectedTraces, int expectedCoverages) throws IOException { + Assumptions.assumeFalse( + JavaVirtualMachine.isJavaVersion(27), "JDK 27 TODO: address failing test"); runGradleTest( gradleVersion, projectName, diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java index 199e21bfe70..5d4c827a17a 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java @@ -1,6 +1,7 @@ package datadog.smoketest; import datadog.communication.util.IOUtils; +import datadog.environment.JavaVirtualMachine; import datadog.trace.civisibility.utils.ShellCommandExecutor; import java.nio.file.Files; import java.nio.file.Path; @@ -9,6 +10,7 @@ import java.util.List; import java.util.Map; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.opentest4j.AssertionFailedError; @@ -46,6 +48,8 @@ class GradleLauncherSmokeTest extends AbstractGradleTest { @ParameterizedTest void testGradleLauncherInjectsTracerIntoGradleDaemon( String gradleVersion, String gradleDaemonCmdLineParams) throws Exception { + Assumptions.assumeFalse( + JavaVirtualMachine.isJavaVersion(27), "JDK 27 TODO: address failing test"); String resolvedGradleVersion = "latest".equals(gradleVersion) ? LATEST_GRADLE_VERSION : gradleVersion; String cmdLineParams = diff --git a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java index 1afd3d92d95..8cee8e15b48 100644 --- a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java +++ b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.junit.jupiter.api.Assumptions.assumeTrue; import datadog.environment.JavaVirtualMachine; @@ -73,6 +74,7 @@ public static boolean disabledOnIbm8() { @BeforeEach void resetMockBackend() { + assumeFalse(JavaVirtualMachine.isJavaVersion(27), "JDK 27 TODO: address failing test"); mockBackend.reset(); }