From 6d50bdbdcad1319188321b4e124b0683b7ce26e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20=C3=81lvarez=20=C3=81lvarez?= Date: Wed, 26 Nov 2025 15:48:19 +0100 Subject: [PATCH 1/3] Mark AppSecActivationSmokeTest as flaky in oracle8 --- .../AppSecActivationSmokeTest.groovy | 4 ++++ .../datadog/trace/test/util/Predicates.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy b/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy index a80177e35a9..155d407ea82 100644 --- a/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy +++ b/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy @@ -3,6 +3,9 @@ package datadog.smoketest import datadog.remoteconfig.Capabilities import datadog.remoteconfig.Product import datadog.smoketest.dynamicconfig.AppSecApplication +import datadog.trace.test.util.Flaky + +import static datadog.trace.test.util.Predicates.ORACLE8 class AppSecActivationSmokeTest extends AbstractSmokeTest { @@ -24,6 +27,7 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { processBuilder.directory(new File(buildDirectory)) } + @Flaky(value = "Telemetry product change event flakes in oracle8", condition = ORACLE8) void 'test activation via RC workflow'() { given: final asmRuleProducts = [Product.ASM, Product.ASM_DD, Product.ASM_DATA] diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java b/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java index d9b7c1aece3..5db96012cba 100644 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java +++ b/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java @@ -29,4 +29,27 @@ public boolean test(final String spec) { return version.equals(VERSION); } } + + public static class ORACLE implements Predicate { + private static final String ORACLE_VENDOR_STRING = "Oracle"; + + @Override + public boolean test(String s) { + return System.getProperty("java.vendor", "").contains(ORACLE_VENDOR_STRING); + } + } + + public static final class ORACLE8 extends ORACLE { + private static final BigDecimal VERSION = new BigDecimal("1.8"); + + @Override + public boolean test(final String spec) { + if (!super.test(spec)) { + return false; + } + final BigDecimal version = + new BigDecimal(System.getProperty("java.specification.version", "-1")); + return version.equals(VERSION); + } + } } From 53849dd0c69d678c9e1429f47ecf89491699856b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20=C3=81lvarez=20=C3=81lvarez?= Date: Wed, 26 Nov 2025 16:30:24 +0100 Subject: [PATCH 2/3] Remove System.getProperty from predicates --- .../datadog/trace/test/util/Predicates.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java b/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java index 5db96012cba..2f67a9bcdd3 100644 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java +++ b/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java @@ -1,6 +1,6 @@ package datadog.trace.test.util; -import java.math.BigDecimal; +import datadog.environment.JavaVirtualMachine; import java.util.function.Predicate; public abstract class Predicates { @@ -12,21 +12,18 @@ public static class IBM implements Predicate { @Override public boolean test(String s) { - return System.getProperty("java.vendor", "").contains(IBM_VENDOR_STRING); + return JavaVirtualMachine.getRuntimeVendor().contains(IBM_VENDOR_STRING); } } public static final class IBM8 extends IBM { - private static final BigDecimal VERSION = new BigDecimal("1.8"); @Override public boolean test(final String spec) { if (!super.test(spec)) { return false; } - final BigDecimal version = - new BigDecimal(System.getProperty("java.specification.version", "-1")); - return version.equals(VERSION); + return JavaVirtualMachine.isJavaVersion(8); } } @@ -35,21 +32,18 @@ public static class ORACLE implements Predicate { @Override public boolean test(String s) { - return System.getProperty("java.vendor", "").contains(ORACLE_VENDOR_STRING); + return JavaVirtualMachine.getRuntimeVendor().contains(ORACLE_VENDOR_STRING); } } public static final class ORACLE8 extends ORACLE { - private static final BigDecimal VERSION = new BigDecimal("1.8"); @Override public boolean test(final String spec) { if (!super.test(spec)) { return false; } - final BigDecimal version = - new BigDecimal(System.getProperty("java.specification.version", "-1")); - return version.equals(VERSION); + return JavaVirtualMachine.isJavaVersion(8); } } } From c34ff34e6c428e2c82f111cdb896af21addb5b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20=C3=81lvarez=20=C3=81lvarez?= Date: Thu, 27 Nov 2025 11:35:05 +0100 Subject: [PATCH 3/3] Get rid of the predicates class --- .../environment/JavaVirtualMachine.java | 6 ++- .../CustomSystemLoaderSmokeTest.groovy | 7 +-- dd-smoke-tests/dynamic-config/build.gradle | 1 + .../AppSecActivationSmokeTest.groovy | 23 ++++++--- .../datadog/smoketest/Jersey2SmokeTest.groovy | 3 +- .../datadog/smoketest/Jersey3SmokeTest.groovy | 4 +- .../smoketest/LogInjectionSmokeTest.groovy | 4 +- .../smoketest/SampleTraceSmokeTest.groovy | 5 +- .../groovy/IastSpringBootSmokeTest.groovy | 4 +- .../smoketest/IastSpringBootSmokeTest.groovy | 4 +- .../test/util/FlakySpockExtension.groovy | 15 ++++-- .../datadog/trace/test/util/Predicates.java | 49 ------------------- 12 files changed, 48 insertions(+), 77 deletions(-) delete mode 100644 utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java diff --git a/components/environment/src/main/java/datadog/environment/JavaVirtualMachine.java b/components/environment/src/main/java/datadog/environment/JavaVirtualMachine.java index 5517a639c77..ed1ec0ae215 100644 --- a/components/environment/src/main/java/datadog/environment/JavaVirtualMachine.java +++ b/components/environment/src/main/java/datadog/environment/JavaVirtualMachine.java @@ -108,8 +108,12 @@ public static boolean isJ9() { return SystemProperties.getOrDefault("java.vm.name", "").contains("J9"); } + public static boolean isIbm() { + return runtime.vendor.contains("IBM"); + } + public static boolean isIbm8() { - return isJavaVersion(8) && runtime.vendor.contains("IBM"); + return isIbm() && isJavaVersion(8); } public static boolean isGraalVM() { diff --git a/dd-smoke-tests/custom-systemloader/src/test/groovy/datadog/smoketest/CustomSystemLoaderSmokeTest.groovy b/dd-smoke-tests/custom-systemloader/src/test/groovy/datadog/smoketest/CustomSystemLoaderSmokeTest.groovy index 1c5ee6b9601..0cf70b42f41 100644 --- a/dd-smoke-tests/custom-systemloader/src/test/groovy/datadog/smoketest/CustomSystemLoaderSmokeTest.groovy +++ b/dd-smoke-tests/custom-systemloader/src/test/groovy/datadog/smoketest/CustomSystemLoaderSmokeTest.groovy @@ -1,7 +1,7 @@ package datadog.smoketest +import datadog.environment.JavaVirtualMachine import datadog.trace.test.util.Flaky -import datadog.trace.test.util.Predicates.IBM import static java.util.concurrent.TimeUnit.SECONDS @@ -30,7 +30,7 @@ class CustomSystemLoaderSmokeTest extends AbstractSmokeTest { return processBuilder } - @Flaky(value = 'Race condition with IMB. Check APMAPI-1194', condition = IBM) + @Flaky(value = 'Race condition with IMB. Check APMAPI-1194', condition = () -> JavaVirtualMachine.isIbm()) def "resource types loaded by custom system class-loader are transformed"() { when: testedProcess.waitFor(TIMEOUT_SECS, SECONDS) @@ -39,7 +39,8 @@ class CustomSystemLoaderSmokeTest extends AbstractSmokeTest { testedProcess.exitValue() == 0 int loadedResources = 0 int transformedResources = 0 - forEachLogLine { String it -> + forEachLogLine { + String it -> if (it =~ /Loading sample.app.Resource[$]Test[1-3] from TestLoader/) { loadedResources++ } diff --git a/dd-smoke-tests/dynamic-config/build.gradle b/dd-smoke-tests/dynamic-config/build.gradle index 2a3c2df5fed..2efcbc9e971 100644 --- a/dd-smoke-tests/dynamic-config/build.gradle +++ b/dd-smoke-tests/dynamic-config/build.gradle @@ -13,6 +13,7 @@ dependencies { implementation libs.slf4j testImplementation project(':dd-smoke-tests') + testImplementation project(':utils:test-utils') } tasks.withType(Test).configureEach { diff --git a/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy b/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy index 155d407ea82..d2754503d64 100644 --- a/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy +++ b/dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy @@ -1,12 +1,11 @@ package datadog.smoketest +import datadog.environment.JavaVirtualMachine import datadog.remoteconfig.Capabilities import datadog.remoteconfig.Product import datadog.smoketest.dynamicconfig.AppSecApplication import datadog.trace.test.util.Flaky -import static datadog.trace.test.util.Predicates.ORACLE8 - class AppSecActivationSmokeTest extends AbstractSmokeTest { @Override @@ -27,14 +26,17 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { processBuilder.directory(new File(buildDirectory)) } - @Flaky(value = "Telemetry product change event flakes in oracle8", condition = ORACLE8) + @Flaky(value = "Telemetry product change event flakes in oracle8", condition = () ->JavaVirtualMachine.isOracleJDK8()) void 'test activation via RC workflow'() { given: final asmRuleProducts = [Product.ASM, Product.ASM_DD, Product.ASM_DATA] when: 'appsec is enabled but inactive' - final request = waitForRcClientRequest {req -> - decodeProducts(req).find { asmRuleProducts.contains(it) } == null + final request = waitForRcClientRequest { + req -> + decodeProducts(req).find { + asmRuleProducts.contains(it) + } == null } final capabilities = decodeCapabilities(request) @@ -48,7 +50,9 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { then: 'we should receive a product change for appsec' waitForTelemetryFlat { final configurations = (List>) it?.payload?.configuration ?: [] - final enabledConfig = configurations.find { it.name == 'appsec_enabled' } + final enabledConfig = configurations.find { + it.name == 'appsec_enabled' + } if (!enabledConfig) { return false } @@ -56,7 +60,8 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { } and: 'we should have set the capabilities for ASM rules and data' - final newRequest = waitForRcClientRequest {req -> + final newRequest = waitForRcClientRequest { + req -> decodeProducts(req).containsAll(asmRuleProducts) } final newCapabilities = decodeCapabilities(newRequest) @@ -64,7 +69,9 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { } private static Set decodeProducts(final Map request) { - return request.client.products.collect { Product.valueOf(it)} + return request.client.products.collect { + Product.valueOf(it) + } } private static long decodeCapabilities(final Map request) { diff --git a/dd-smoke-tests/jersey-2/src/test/groovy/datadog/smoketest/Jersey2SmokeTest.groovy b/dd-smoke-tests/jersey-2/src/test/groovy/datadog/smoketest/Jersey2SmokeTest.groovy index 0aa67101c04..c5547ff672c 100644 --- a/dd-smoke-tests/jersey-2/src/test/groovy/datadog/smoketest/Jersey2SmokeTest.groovy +++ b/dd-smoke-tests/jersey-2/src/test/groovy/datadog/smoketest/Jersey2SmokeTest.groovy @@ -3,7 +3,6 @@ package datadog.smoketest import datadog.environment.JavaVirtualMachine import datadog.trace.api.config.IastConfig import datadog.trace.test.util.Flaky -import datadog.trace.test.util.Predicates.IBM8 import static datadog.trace.api.iast.IastContext.Mode.GLOBAL @@ -35,7 +34,7 @@ class Jersey2SmokeTest extends AbstractJerseySmokeTest { ] } - @Flaky(value = 'global context is flaky under IBM8', condition = IBM8) + @Flaky(value = 'global context is flaky under IBM8', condition = () -> JavaVirtualMachine.isIbm8()) static class WithGlobalContext extends Jersey2SmokeTest { @Override protected List iastJvmOpts() { diff --git a/dd-smoke-tests/jersey-3/src/test/groovy/datadog/smoketest/Jersey3SmokeTest.groovy b/dd-smoke-tests/jersey-3/src/test/groovy/datadog/smoketest/Jersey3SmokeTest.groovy index 62b6641fbf6..c45e202324f 100644 --- a/dd-smoke-tests/jersey-3/src/test/groovy/datadog/smoketest/Jersey3SmokeTest.groovy +++ b/dd-smoke-tests/jersey-3/src/test/groovy/datadog/smoketest/Jersey3SmokeTest.groovy @@ -1,6 +1,6 @@ package datadog.smoketest -import datadog.trace.test.util.Predicates.IBM8 +import datadog.environment.JavaVirtualMachine import datadog.trace.test.util.Flaky import static datadog.trace.api.config.IastConfig.* @@ -31,7 +31,7 @@ class Jersey3SmokeTest extends AbstractJerseySmokeTest { ] } - @Flaky(value = 'global context is flaky under IBM8', condition = IBM8) + @Flaky(value = 'global context is flaky under IBM8', condition = () -> JavaVirtualMachine.isIbm8()) static class WithGlobalContext extends Jersey3SmokeTest { @Override protected List iastJvmOpts() { diff --git a/dd-smoke-tests/log-injection/src/test/groovy/datadog/smoketest/LogInjectionSmokeTest.groovy b/dd-smoke-tests/log-injection/src/test/groovy/datadog/smoketest/LogInjectionSmokeTest.groovy index 68dce191a9c..bdcc94f62ae 100644 --- a/dd-smoke-tests/log-injection/src/test/groovy/datadog/smoketest/LogInjectionSmokeTest.groovy +++ b/dd-smoke-tests/log-injection/src/test/groovy/datadog/smoketest/LogInjectionSmokeTest.groovy @@ -2,6 +2,7 @@ package datadog.smoketest import com.squareup.moshi.Moshi import com.squareup.moshi.Types +import datadog.environment.JavaVirtualMachine import datadog.trace.api.config.GeneralConfig import datadog.trace.test.util.Flaky import spock.lang.AutoCleanup @@ -9,7 +10,6 @@ import spock.lang.Shared import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_128_BIT_TRACEID_LOGGING_ENABLED import static datadog.trace.api.config.TracerConfig.TRACE_128_BIT_TRACEID_GENERATION_ENABLED -import static datadog.trace.test.util.Predicates.IBM8 import static java.util.concurrent.TimeUnit.SECONDS /** @@ -256,7 +256,7 @@ abstract class LogInjectionSmokeTest extends AbstractSmokeTest { return unmangled.split(" ")[1..2] } - @Flaky(condition = IBM8) + @Flaky(condition = () -> JavaVirtualMachine.isIbm8()) def "check raw file injection"() { when: def count = waitForTraceCount(2) diff --git a/dd-smoke-tests/sample-trace/src/test/groovy/datadog/smoketest/SampleTraceSmokeTest.groovy b/dd-smoke-tests/sample-trace/src/test/groovy/datadog/smoketest/SampleTraceSmokeTest.groovy index 5e07f3150a2..791f9aed1c2 100644 --- a/dd-smoke-tests/sample-trace/src/test/groovy/datadog/smoketest/SampleTraceSmokeTest.groovy +++ b/dd-smoke-tests/sample-trace/src/test/groovy/datadog/smoketest/SampleTraceSmokeTest.groovy @@ -1,9 +1,8 @@ package datadog.smoketest +import datadog.environment.JavaVirtualMachine import datadog.trace.test.util.Flaky -import static datadog.trace.test.util.Predicates.IBM - class SampleTraceSmokeTest extends AbstractSmokeTest { @Override @@ -25,7 +24,7 @@ class SampleTraceSmokeTest extends AbstractSmokeTest { processBuilder.directory(new File(buildDirectory)) } - @Flaky(condition = IBM) + @Flaky(condition = () -> JavaVirtualMachine.isIbm()) def 'sample traces are sent'() { when: waitForTraceCount(10) diff --git a/dd-smoke-tests/spring-boot-2.6-webmvc/src/test/groovy/IastSpringBootSmokeTest.groovy b/dd-smoke-tests/spring-boot-2.6-webmvc/src/test/groovy/IastSpringBootSmokeTest.groovy index 300cf8e09a7..1290a505e95 100644 --- a/dd-smoke-tests/spring-boot-2.6-webmvc/src/test/groovy/IastSpringBootSmokeTest.groovy +++ b/dd-smoke-tests/spring-boot-2.6-webmvc/src/test/groovy/IastSpringBootSmokeTest.groovy @@ -1,13 +1,13 @@ +import datadog.environment.JavaVirtualMachine import datadog.smoketest.AbstractIastSpringBootTest import datadog.trace.api.config.IastConfig -import datadog.trace.test.util.Predicates.IBM8 import datadog.trace.test.util.Flaky import static datadog.trace.api.iast.IastContext.Mode.GLOBAL class IastSpringBootSmokeTest extends AbstractIastSpringBootTest { - @Flaky(value = 'global context is flaky under IBM8', condition = IBM8) + @Flaky(value = 'global context is flaky under IBM8', condition = () -> JavaVirtualMachine.isIbm8()) static class WithGlobalContext extends IastSpringBootSmokeTest { @Override protected List iastJvmOpts() { diff --git a/dd-smoke-tests/springboot/src/test/groovy/datadog/smoketest/IastSpringBootSmokeTest.groovy b/dd-smoke-tests/springboot/src/test/groovy/datadog/smoketest/IastSpringBootSmokeTest.groovy index cbc660a19a0..ac823de6045 100644 --- a/dd-smoke-tests/springboot/src/test/groovy/datadog/smoketest/IastSpringBootSmokeTest.groovy +++ b/dd-smoke-tests/springboot/src/test/groovy/datadog/smoketest/IastSpringBootSmokeTest.groovy @@ -1,7 +1,7 @@ package datadog.smoketest +import datadog.environment.JavaVirtualMachine import datadog.trace.api.config.IastConfig -import datadog.trace.test.util.Predicates.IBM8 import datadog.trace.test.util.Flaky import groovy.transform.CompileDynamic import okhttp3.Request @@ -54,7 +54,7 @@ class IastSpringBootSmokeTest extends AbstractIastSpringBootTest { } } - @Flaky(value = 'global context is flaky under IBM8', condition = IBM8) + @Flaky(value = 'global context is flaky under IBM8', condition = () -> JavaVirtualMachine.isIbm8()) static class WithGlobalContext extends IastSpringBootSmokeTest { @Override protected List iastJvmOpts() { diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/FlakySpockExtension.groovy b/utils/test-utils/src/main/groovy/datadog/trace/test/util/FlakySpockExtension.groovy index fc0d929682c..ac962da6a65 100644 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/FlakySpockExtension.groovy +++ b/utils/test-utils/src/main/groovy/datadog/trace/test/util/FlakySpockExtension.groovy @@ -92,11 +92,20 @@ class FlakySpockExtension extends AbstractGlobalExtension { return "true" == System.getProperty(RUN_FLAKY_TESTS_KEY) } - private static boolean isFlakySpec(final NodeInfo node, final Class> condition) { + private static boolean isFlakySpec(final NodeInfo node, final Class condition) { if (condition == null || condition === Flaky.True) { return true } - final closure = condition.newInstance() - return closure.test(node.name) + boolean isFlaky + if (Closure.isAssignableFrom(condition)) { + // Invoke the closure without owner or this, also the spec parameter is captured by the groovy compiler + // so we don't need to pass it along + final closure = condition.newInstance(null, null) as Closure + isFlaky = closure.doCall() + } else { + final closure = condition.newInstance() as Predicate + isFlaky = closure.test(node.name) + } + return isFlaky } } diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java b/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java deleted file mode 100644 index 2f67a9bcdd3..00000000000 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java +++ /dev/null @@ -1,49 +0,0 @@ -package datadog.trace.test.util; - -import datadog.environment.JavaVirtualMachine; -import java.util.function.Predicate; - -public abstract class Predicates { - - private Predicates() {} - - public static class IBM implements Predicate { - private static final String IBM_VENDOR_STRING = "IBM"; - - @Override - public boolean test(String s) { - return JavaVirtualMachine.getRuntimeVendor().contains(IBM_VENDOR_STRING); - } - } - - public static final class IBM8 extends IBM { - - @Override - public boolean test(final String spec) { - if (!super.test(spec)) { - return false; - } - return JavaVirtualMachine.isJavaVersion(8); - } - } - - public static class ORACLE implements Predicate { - private static final String ORACLE_VENDOR_STRING = "Oracle"; - - @Override - public boolean test(String s) { - return JavaVirtualMachine.getRuntimeVendor().contains(ORACLE_VENDOR_STRING); - } - } - - public static final class ORACLE8 extends ORACLE { - - @Override - public boolean test(final String spec) { - if (!super.test(spec)) { - return false; - } - return JavaVirtualMachine.isJavaVersion(8); - } - } -}