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/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java b/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java index 8a8d1104e0d..7d540045205 100644 --- a/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java +++ b/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java @@ -113,6 +113,7 @@ void onlyOnGraalVm() { @EnabledOnJre(JAVA_8) void onlyOnIbm8() { assertFalse(JavaVirtualMachine.isGraalVM()); + assertTrue(JavaVirtualMachine.isIbm()); assertTrue(JavaVirtualMachine.isIbm8()); assertTrue(JavaVirtualMachine.isJ9()); assertFalse(JavaVirtualMachine.isOracleJDK8()); 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 a80177e35a9..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,8 +1,10 @@ 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 class AppSecActivationSmokeTest extends AbstractSmokeTest { @@ -24,13 +26,17 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest { processBuilder.directory(new File(buildDirectory)) } + @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) @@ -44,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 } @@ -52,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) @@ -60,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 aa70402eea5..297351a2aac 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) @@ -284,10 +284,18 @@ abstract class LogInjectionSmokeTest extends AbstractSmokeTest { println "json log lines: " + jsonLogLines def stdOutLines = new File(logFilePath).readLines() - def (String firstTraceId, String firstSpanId) = parseTraceFromStdOut(stdOutLines.find { it.contains("FIRSTTRACEID")}) - def (String secondTraceId, String secondSpanId) = parseTraceFromStdOut(stdOutLines.find { it.contains("SECONDTRACEID")}) - def (String thirdTraceId, String thirdSpanId) = parseTraceFromStdOut(stdOutLines.find { it.contains("THIRDTRACEID")}) - def (String forthTraceId, String forthSpanId) = parseTraceFromStdOut(stdOutLines.find { it.contains("FORTHTRACEID")}) + def (String firstTraceId, String firstSpanId) = parseTraceFromStdOut(stdOutLines.find { + it.contains("FIRSTTRACEID") + }) + def (String secondTraceId, String secondSpanId) = parseTraceFromStdOut(stdOutLines.find { + it.contains("SECONDTRACEID") + }) + def (String thirdTraceId, String thirdSpanId) = parseTraceFromStdOut(stdOutLines.find { + it.contains("THIRDTRACEID") + }) + def (String forthTraceId, String forthSpanId) = parseTraceFromStdOut(stdOutLines.find { + it.contains("FORTHTRACEID") + }) then: exitValue == 0 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 d9b7c1aece3..00000000000 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/Predicates.java +++ /dev/null @@ -1,32 +0,0 @@ -package datadog.trace.test.util; - -import java.math.BigDecimal; -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 System.getProperty("java.vendor", "").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); - } - } -}