From 1b1a3505fcb2c453d9f51df53a09bf337e4f79f8 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 20 Aug 2025 13:05:42 +0200 Subject: [PATCH] Avoid multiple injections on dispatch on jboss --- .../rum/RumControllableResponse.java | 9 ++ .../RumAsyncContextInstrumentation.java | 5 +- .../RumHttpServletRequestWrapper.java | 16 +- .../RumHttpServletResponseWrapper.java | 6 +- .../servlet3/Servlet3Advice.java | 15 +- .../JakartaServletInstrumentation.java | 15 +- .../RumAsyncContextInstrumentation.java | 5 +- .../RumHttpServletRequestWrapper.java | 7 +- .../RumHttpServletResponseWrapper.java | 6 +- .../rum/AbstractRumServerSmokeTest.groovy | 13 +- dd-smoke-tests/rum/wildfly-15/build.gradle | 124 +++++++++++++++ dd-smoke-tests/rum/wildfly-15/gradle.lockfile | 146 ++++++++++++++++++ .../rum/wildfly-15/rum-ear/.gitignore | 7 + .../rum/wildfly-15/rum-ear/build.gradle | 21 +++ .../rum/wildfly-15/rum-ear/settings.gradle | 36 +++++ .../rum/wildfly-15/rum-ear/war/build.gradle | 17 ++ .../main/java/com/example/HtmlJspFilter.java | 26 ++++ .../main/java/com/example/HtmlServlet.java | 15 ++ .../src/main/java/com/example/XmlServlet.java | 18 +++ .../war/src/main/webapp/WEB-INF/beans.xml | 8 + .../war/src/main/webapp/WEB-INF/web.xml | 7 + .../rum-ear/war/src/main/webapp/jsp/html.jsp | 11 ++ .../smoketest/Wildfly15RumSmokeTest.groovy | 57 +++++++ settings.gradle.kts | 1 + 24 files changed, 558 insertions(+), 33 deletions(-) create mode 100644 dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rum/RumControllableResponse.java create mode 100644 dd-smoke-tests/rum/wildfly-15/build.gradle create mode 100644 dd-smoke-tests/rum/wildfly-15/gradle.lockfile create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/.gitignore create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/build.gradle create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/settings.gradle create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/build.gradle create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlJspFilter.java create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlServlet.java create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/XmlServlet.java create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/beans.xml create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/web.xml create mode 100644 dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/jsp/html.jsp create mode 100644 dd-smoke-tests/rum/wildfly-15/src/test/groovy/datadog/smoketest/Wildfly15RumSmokeTest.groovy diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rum/RumControllableResponse.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rum/RumControllableResponse.java new file mode 100644 index 00000000000..fe5120a5d6b --- /dev/null +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rum/RumControllableResponse.java @@ -0,0 +1,9 @@ +package datadog.trace.bootstrap.instrumentation.rum; + +public interface RumControllableResponse { + /** Drain the held buffer. */ + void commit(); + + /** Stops filtering the response. */ + void stopFiltering(); +} diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumAsyncContextInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumAsyncContextInstrumentation.java index c6b420fdc65..33dc9663251 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumAsyncContextInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumAsyncContextInstrumentation.java @@ -10,6 +10,7 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import javax.servlet.AsyncContext; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -56,8 +57,8 @@ public static class CommitAdvice { public static void commitRumBuffer(@Advice.This final AsyncContext asyncContext) { final Object maybeRumWrappedResponse = asyncContext.getRequest().getAttribute(DD_RUM_INJECTED); - if (maybeRumWrappedResponse instanceof RumHttpServletResponseWrapper) { - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).commit(); + if (maybeRumWrappedResponse instanceof RumControllableResponse) { + ((RumControllableResponse) maybeRumWrappedResponse).commit(); } } } diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletRequestWrapper.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletRequestWrapper.java index 36be99b0a7f..13dfa13c4c9 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletRequestWrapper.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletRequestWrapper.java @@ -2,6 +2,7 @@ import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_RUM_INJECTED; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import javax.servlet.AsyncContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -11,7 +12,7 @@ public class RumHttpServletRequestWrapper extends HttpServletRequestWrapper { - private final HttpServletResponse response; + private HttpServletResponse response; public RumHttpServletRequestWrapper( final HttpServletRequest request, final HttpServletResponse response) { @@ -30,17 +31,16 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se throws IllegalStateException { // deactivate the previous wrapper final Object maybeRumWrappedResponse = (servletRequest.getAttribute(DD_RUM_INJECTED)); - if (maybeRumWrappedResponse instanceof RumHttpServletResponseWrapper) { - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).commit(); - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).stopFiltering(); + if (maybeRumWrappedResponse instanceof RumControllableResponse) { + ((RumControllableResponse) maybeRumWrappedResponse).commit(); + ((RumControllableResponse) maybeRumWrappedResponse).stopFiltering(); } - ServletResponse actualResponse = servletResponse; // rewrap it if (servletResponse instanceof HttpServletResponse) { - actualResponse = + this.response = new RumHttpServletResponseWrapper(this, (HttpServletResponse) servletResponse); - servletRequest.setAttribute(DD_RUM_INJECTED, actualResponse); + servletRequest.setAttribute(DD_RUM_INJECTED, this.response); } - return super.startAsync(servletRequest, actualResponse); + return super.startAsync(servletRequest, this.response); } } diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java index a1dc5bcf54d..07963ae95a6 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java @@ -2,6 +2,7 @@ import datadog.trace.api.rum.RumInjector; import datadog.trace.bootstrap.instrumentation.buffer.InjectingPipeWriter; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import datadog.trace.util.MethodHandles; import java.io.IOException; import java.io.PrintWriter; @@ -14,7 +15,8 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; -public class RumHttpServletResponseWrapper extends HttpServletResponseWrapper { +public class RumHttpServletResponseWrapper extends HttpServletResponseWrapper + implements RumControllableResponse { private final RumInjector rumInjector; private final String servletVersion; private WrappedServletOutputStream outputStream; @@ -203,6 +205,7 @@ public void setContentType(String type) { super.setContentType(type); } + @Override public void commit() { if (wrappedPipeWriter != null) { try { @@ -218,6 +221,7 @@ public void commit() { } } + @Override public void stopFiltering() { shouldInject = false; if (wrappedPipeWriter != null) { diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java index 9a8a55f159d..c123c212515 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java @@ -17,6 +17,7 @@ import datadog.trace.api.gateway.Flow; import datadog.trace.api.rum.RumInjector; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import datadog.trace.instrumentation.servlet.ServletBlockingHelper; import java.security.Principal; import java.util.concurrent.atomic.AtomicBoolean; @@ -35,7 +36,7 @@ public static boolean onEnter( @Advice.Local("isDispatch") boolean isDispatch, @Advice.Local("finishSpan") boolean finishSpan, @Advice.Local("contextScope") ContextScope scope, - @Advice.Local("rumServletWrapper") RumHttpServletResponseWrapper rumServletWrapper) { + @Advice.Local("rumServletWrapper") RumControllableResponse rumServletWrapper) { final boolean invalidRequest = !(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse); if (invalidRequest) { @@ -47,14 +48,16 @@ public static boolean onEnter( if (RumInjector.get().isEnabled()) { final Object maybeRumWrapper = httpServletRequest.getAttribute(DD_RUM_INJECTED); - if (maybeRumWrapper instanceof RumHttpServletResponseWrapper) { - rumServletWrapper = (RumHttpServletResponseWrapper) maybeRumWrapper; + if (maybeRumWrapper instanceof RumControllableResponse) { + rumServletWrapper = (RumControllableResponse) maybeRumWrapper; } else { rumServletWrapper = new RumHttpServletResponseWrapper(httpServletRequest, (HttpServletResponse) response); httpServletRequest.setAttribute(DD_RUM_INJECTED, rumServletWrapper); - response = rumServletWrapper; - request = new RumHttpServletRequestWrapper(httpServletRequest, rumServletWrapper); + response = (ServletResponse) rumServletWrapper; + request = + new RumHttpServletRequestWrapper( + httpServletRequest, (HttpServletResponse) rumServletWrapper); } } @@ -116,7 +119,7 @@ public static void stopSpan( @Advice.Local("contextScope") final ContextScope scope, @Advice.Local("isDispatch") boolean isDispatch, @Advice.Local("finishSpan") boolean finishSpan, - @Advice.Local("rumServletWrapper") RumHttpServletResponseWrapper rumServletWrapper, + @Advice.Local("rumServletWrapper") RumControllableResponse rumServletWrapper, @Advice.Thrown final Throwable throwable) { if (rumServletWrapper != null) { rumServletWrapper.commit(); diff --git a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java index 3d0013786ee..6b82e220519 100644 --- a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java @@ -19,6 +19,7 @@ import datadog.trace.api.rum.RumInjector; import datadog.trace.bootstrap.CallDepthThreadLocalMap; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; @@ -71,7 +72,7 @@ public static class JakartaServletAdvice { public static AgentSpan before( @Advice.Argument(value = 0, readOnly = false) ServletRequest request, @Advice.Argument(value = 1, readOnly = false) ServletResponse response, - @Advice.Local("rumServletWrapper") RumHttpServletResponseWrapper rumServletWrapper) { + @Advice.Local("rumServletWrapper") RumControllableResponse rumServletWrapper) { if (!(request instanceof HttpServletRequest)) { return null; } @@ -81,15 +82,17 @@ public static AgentSpan before( if (RumInjector.get().isEnabled()) { final Object maybeRumWrapper = httpServletRequest.getAttribute(DD_RUM_INJECTED); - if (maybeRumWrapper instanceof RumHttpServletResponseWrapper) { - rumServletWrapper = (RumHttpServletResponseWrapper) maybeRumWrapper; + if (maybeRumWrapper instanceof RumControllableResponse) { + rumServletWrapper = (RumControllableResponse) maybeRumWrapper; } else { rumServletWrapper = new RumHttpServletResponseWrapper( httpServletRequest, (HttpServletResponse) response); httpServletRequest.setAttribute(DD_RUM_INJECTED, rumServletWrapper); - response = rumServletWrapper; - request = new RumHttpServletRequestWrapper(httpServletRequest, rumServletWrapper); + response = (ServletResponse) rumServletWrapper; + request = + new RumHttpServletRequestWrapper( + httpServletRequest, (HttpServletResponse) rumServletWrapper); } } } @@ -108,7 +111,7 @@ public static AgentSpan before( public static void after( @Advice.Enter final AgentSpan span, @Advice.Argument(0) final ServletRequest request, - @Advice.Local("rumServletWrapper") RumHttpServletResponseWrapper rumServletWrapper) { + @Advice.Local("rumServletWrapper") RumControllableResponse rumServletWrapper) { if (span == null) { return; } diff --git a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumAsyncContextInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumAsyncContextInstrumentation.java index a4150f17ad1..2d5764d68ad 100644 --- a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumAsyncContextInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumAsyncContextInstrumentation.java @@ -10,6 +10,7 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import jakarta.servlet.AsyncContext; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -56,8 +57,8 @@ public static class CommitAdvice { public static void commitRumBuffer(@Advice.This final AsyncContext asyncContext) { final Object maybeRumWrappedResponse = asyncContext.getRequest().getAttribute(DD_RUM_INJECTED); - if (maybeRumWrappedResponse instanceof RumHttpServletResponseWrapper) { - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).commit(); + if (maybeRumWrappedResponse instanceof RumControllableResponse) { + ((RumControllableResponse) maybeRumWrappedResponse).commit(); } } } diff --git a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletRequestWrapper.java b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletRequestWrapper.java index 7bba1a13c10..8aa73d4bf3c 100644 --- a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletRequestWrapper.java +++ b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletRequestWrapper.java @@ -2,6 +2,7 @@ import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_RUM_INJECTED; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import jakarta.servlet.AsyncContext; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; @@ -30,9 +31,9 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se throws IllegalStateException { // deactivate the previous wrapper final Object maybeRumWrappedResponse = (servletRequest.getAttribute(DD_RUM_INJECTED)); - if (maybeRumWrappedResponse instanceof RumHttpServletResponseWrapper) { - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).commit(); - ((RumHttpServletResponseWrapper) maybeRumWrappedResponse).stopFiltering(); + if (maybeRumWrappedResponse instanceof RumControllableResponse) { + ((RumControllableResponse) maybeRumWrappedResponse).commit(); + ((RumControllableResponse) maybeRumWrappedResponse).stopFiltering(); } ServletResponse actualResponse = servletResponse; // rewrap it diff --git a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java index b242ba07837..5884e7fb706 100644 --- a/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java +++ b/dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java @@ -2,6 +2,7 @@ import datadog.trace.api.rum.RumInjector; import datadog.trace.bootstrap.instrumentation.buffer.InjectingPipeWriter; +import datadog.trace.bootstrap.instrumentation.rum.RumControllableResponse; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletRequest; @@ -11,7 +12,8 @@ import java.io.PrintWriter; import java.nio.charset.Charset; -public class RumHttpServletResponseWrapper extends HttpServletResponseWrapper { +public class RumHttpServletResponseWrapper extends HttpServletResponseWrapper + implements RumControllableResponse { private final RumInjector rumInjector; private final String servletVersion; private WrappedServletOutputStream outputStream; @@ -180,6 +182,7 @@ public void setContentType(String type) { super.setContentType(type); } + @Override public void commit() { if (wrappedPipeWriter != null) { try { @@ -195,6 +198,7 @@ public void commit() { } } + @Override public void stopFiltering() { shouldInject = false; if (wrappedPipeWriter != null) { diff --git a/dd-smoke-tests/rum/src/main/groovy/datadog/smoketest/rum/AbstractRumServerSmokeTest.groovy b/dd-smoke-tests/rum/src/main/groovy/datadog/smoketest/rum/AbstractRumServerSmokeTest.groovy index d26cffe3d44..edd795b61df 100644 --- a/dd-smoke-tests/rum/src/main/groovy/datadog/smoketest/rum/AbstractRumServerSmokeTest.groovy +++ b/dd-smoke-tests/rum/src/main/groovy/datadog/smoketest/rum/AbstractRumServerSmokeTest.groovy @@ -14,9 +14,13 @@ class AbstractRumServerSmokeTest extends AbstractServerSmokeTest { "-Ddd.rum.remote.configuration.id=12345", ] + String mountPoint() { + "" + } + void 'test RUM SDK injection on html for path #servletPath'() { given: - def url = "http://localhost:${httpPort}/${servletPath}" + def url = "http://localhost:${httpPort}${mountPoint()}/${servletPath}" def request = new Request.Builder() .url(url) .get() @@ -34,7 +38,7 @@ class AbstractRumServerSmokeTest extends AbstractServerSmokeTest { void 'test RUM SDK injection skip on unsupported mime type'() { given: - def url = "http://localhost:${httpPort}/xml" + def url = "http://localhost:${httpPort}${mountPoint()}/xml" def request = new Request.Builder() .url(url) .get() @@ -52,13 +56,14 @@ class AbstractRumServerSmokeTest extends AbstractServerSmokeTest { assert response.header('x-datadog-rum-injected') == '1': 'RUM injected header missing' def content = response.body().string() assert content.contains('https://www.datadoghq-browser-agent.com'): 'RUM script not injected' - assert content.endsWith(''): 'Response not fully flushed' + assert content.trim().endsWith(''): 'Response not fully flushed' + assert content.indexOf("DD_RUM.init(") == content.lastIndexOf("DD_RUM.init("): 'script injected more than once' } static void assertRumNotInjected(Response response) { assert response.header('x-datadog-rum-injected') == null: 'RUM header unexpectedly injected' def content = response.body().string() assert !content.contains('https://www.datadoghq-browser-agent.com'): 'RUM script unexpectedly injected' - assert content.endsWith(''): 'Response not fully flushed' + assert content.trim().endsWith(''): 'Response not fully flushed' } } diff --git a/dd-smoke-tests/rum/wildfly-15/build.gradle b/dd-smoke-tests/rum/wildfly-15/build.gradle new file mode 100644 index 00000000000..664cf3647f9 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/build.gradle @@ -0,0 +1,124 @@ +ext { + serverName = 'wildfly' + //serverModule = 'servlet' + serverModule = 'wildfly' + serverVersion = '15.0.0.Final' + serverExtension = 'zip' + maxJavaVersionForTests = JavaVersion.VERSION_11 +} + +repositories { + ivy { + url 'https://download.jboss.org/' + patternLayout { + // artifact '/[organisation]/[revision]/[module]/[organisation]-[module]-[revision].[ext]' + // we download the full EE profile and not the servlet minimal one + artifact '/[organisation]/[revision]/[organisation]-[revision].[ext]' + } + metadataSources { + it.artifact() + } + } +} + +apply from: "$rootDir/gradle/java.gradle" + +description = 'Wildfly Smoke Tests.' + +configurations { + serverFile { + extendsFrom implementation + canBeResolved = true + } +} + +dependencies { + // uses the ivy repository url to download the wildfly servlet zip + // organisation = serverName, revision = serverVersion, module = serverModule, ext = serverExtension + serverFile "${serverName}:${serverModule}:${serverVersion}@${serverExtension}" + testImplementation project(':dd-smoke-tests:rum') + testImplementation project(':dd-smoke-tests') +} + +def appDir = "$projectDir/rum-ear" +def appBuildDir = "$buildDir/rm-ear" +def isWindows = System.getProperty("os.name").toLowerCase().contains("win") +def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' +// define the task that builds the quarkus project +tasks.register('earBuild', Exec) { + workingDir "$appDir" + environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + commandLine "$rootDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" + + outputs.cacheIf { true } + + outputs.dir(appBuildDir) + .withPropertyName("applicationEar") + + inputs.files(fileTree(appDir) { + include '**/*' + exclude '.gradle/**' + }) + .withPropertyName("application") + .withPathSensitivity(PathSensitivity.RELATIVE) +} + +earBuild { + dependsOn project(':dd-trace-api').tasks.named("jar") +} + +tasks.named("compileTestGroovy").configure { + dependsOn tasks.earBuild + outputs.upToDateWhen { + !earBuild.didWork + } +} + +spotless { + java { + target "**/*.java" + } + + groovyGradle { + target '*.gradle', "**/*.gradle" + } +} + +def wildflyDir="${buildDir}/${serverName}-${serverVersion}" + +tasks.register("unzip", Copy) { + dependsOn tasks.earBuild + mustRunAfter tasks.compileTestGroovy + def zipFileNamePrefix = "wildfly" + def zipPath = project.configurations.serverFile.find { + it.name.startsWith(zipFileNamePrefix) + } + if (zipPath != null) { + def zipFile = file(zipPath) + def outputDir = file("${buildDir}") + + from zipTree(zipFile) + into outputDir + } else { + throw new GradleException("Can't find server zip file that starts with: " + zipFileNamePrefix) + } + + // When tests are disabled this would still be run, so disable this manually + onlyIf { !project.rootProject.hasProperty("skipTests") } +} + +tasks.withType(Jar).configureEach { + dependsOn tasks.unzip +} + +tasks.register("deploy", Copy) { + dependsOn tasks.unzip + from "${appBuildDir}/libs/wildfly-rum-ear-smoketest.ear" + into "${wildflyDir}/standalone/deployments" +} + +tasks.withType(Test).configureEach { + dependsOn tasks.deploy + jvmArgs "-Ddatadog.smoketest.wildflyDir=${wildflyDir}" +} + diff --git a/dd-smoke-tests/rum/wildfly-15/gradle.lockfile b/dd-smoke-tests/rum/wildfly-15/gradle.lockfile new file mode 100644 index 00000000000..55830d627bc --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/gradle.lockfile @@ -0,0 +1,146 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +cafe.cryptography:curve25519-elisabeth:0.1.0=testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.13=testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.13=testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.6=testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.2.0=compileClasspath,testCompileClasspath,testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.7.3=spotbugs +com.github.spotbugs:spotbugs:4.7.3=spotbugs +com.github.stefanbirkner:system-rules:1.19.0=testCompileClasspath,testRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=compileClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.9.1=spotbugs +com.google.guava:guava:20.0=testCompileClasspath,testRuntimeClasspath +com.google.re2j:re2j:1.7=testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:3.12.12=testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:okhttp:3.12.12=testCompileClasspath,testRuntimeClasspath +com.squareup.okio:okio:1.17.5=testCompileClasspath,testRuntimeClasspath +com.thoughtworks.qdox:qdox:1.12.1=testRuntimeClasspath +commons-codec:commons-codec:1.15=spotbugs +commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.11.0=testCompileClasspath,testRuntimeClasspath +de.thetaphi:forbiddenapis:3.8=compileClasspath +info.picocli:picocli:4.6.3=testRuntimeClasspath +io.sqreen:libsqreen:15.0.1=testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:1.2.0=spotbugs +jline:jline:2.14.6=testRuntimeClasspath +junit:junit-dep:4.11=testCompileClasspath,testRuntimeClasspath +junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.17.5=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.17.5=testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=testRuntimeClasspath +net.jcip:jcip-annotations:1.0=compileClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +net.sf.saxon:Saxon-HE:11.4=spotbugs +org.apache.ant:ant-antlr:1.10.15=testRuntimeClasspath +org.apache.ant:ant-antlr:1.9.15=codenarc +org.apache.ant:ant-junit:1.10.15=testRuntimeClasspath +org.apache.ant:ant-junit:1.9.15=codenarc +org.apache.ant:ant-launcher:1.10.15=testRuntimeClasspath +org.apache.ant:ant:1.10.15=testCompileClasspath,testRuntimeClasspath +org.apache.bcel:bcel:6.5.0=spotbugs +org.apache.commons:commons-lang3:3.12.0=spotbugs +org.apache.commons:commons-text:1.10.0=spotbugs +org.apache.httpcomponents.client5:httpclient5:5.1.3=spotbugs +org.apache.httpcomponents.core5:httpcore5-h2:5.1.3=spotbugs +org.apache.httpcomponents.core5:httpcore5:5.1.3=spotbugs +org.apache.logging.log4j:log4j-api:2.19.0=spotbugs +org.apache.logging.log4j:log4j-core:2.19.0=spotbugs +org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath +org.codehaus.groovy:groovy-all:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-ant:2.5.14=codenarc +org.codehaus.groovy:groovy-ant:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-astbuilder:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-cli-picocli:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-console:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-datetime:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-docgenerator:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovydoc:2.5.14=codenarc +org.codehaus.groovy:groovy-groovydoc:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovysh:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jmx:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-json:2.5.14=codenarc +org.codehaus.groovy:groovy-json:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jsr223:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-macro:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-nio:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-servlet:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-sql:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-swing:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-templates:2.5.14=codenarc +org.codehaus.groovy:groovy-templates:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test-junit5:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-testng:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-xml:2.5.14=codenarc +org.codehaus.groovy:groovy-xml:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy:2.5.14=codenarc +org.codehaus.groovy:groovy:3.0.24=testCompileClasspath,testRuntimeClasspath +org.codenarc:CodeNarc:2.2.0=codenarc +org.dom4j:dom4j:2.1.3=spotbugs +org.eclipse.jetty:jetty-http:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.gmetrics:GMetrics:1.1=codenarc +org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:2.2=testCompileClasspath,testRuntimeClasspath +org.jctools:jctools-core:3.3.0=testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.12.0=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.12.0=testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.12.0=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.12.0=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.12.0=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.12.0=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.12.0=testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.12.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.12.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.12.0=testRuntimeClasspath +org.junit:junit-bom:5.12.0=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +org.msgpack:msgpack-core:0.8.24=testRuntimeClasspath +org.objenesis:objenesis:3.3=testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.2=testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.8=testRuntimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.8=testRuntimeClasspath +org.ow2.asm:asm-util:9.2=testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.8=testRuntimeClasspath +org.slf4j:jcl-over-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:jul-to-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:log4j-over-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.32=testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:2.0.0=spotbugs,spotbugsSlf4j +org.slf4j:slf4j-simple:2.0.0=spotbugsSlf4j +org.spockframework:spock-core:2.3-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.spockframework:spock-junit4:2.3-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.5.1=testRuntimeClasspath +org.webjars:jquery:3.5.1=testRuntimeClasspath +org.xmlresolver:xmlresolver:4.4.3=spotbugs +wildfly:wildfly:15.0.0.Final=serverFile +xml-apis:xml-apis:1.4.01=spotbugs +empty=annotationProcessor,runtimeClasspath,spotbugsPlugins,testAnnotationProcessor diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/.gitignore b/dd-smoke-tests/rum/wildfly-15/rum-ear/.gitignore new file mode 100644 index 00000000000..72d30a335be --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/.gitignore @@ -0,0 +1,7 @@ +# Ignore all project specific gradle directories/files +.gradle +.idea +gradle +build +gradlew +gradlew.bat diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/build.gradle b/dd-smoke-tests/rum/wildfly-15/rum-ear/build.gradle new file mode 100644 index 00000000000..25eb46b1db0 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' + id 'ear' + id 'com.diffplug.spotless' version '6.13.0' +} + +def sharedRootDir = "$rootDir/../../../../" +def sharedConfigDirectory = "$sharedRootDir/gradle" +rootProject.ext.sharedConfigDirectory = sharedConfigDirectory + +apply from: "$sharedConfigDirectory/repositories.gradle" +apply from: "$sharedConfigDirectory/spotless.gradle" +apply plugin: 'ear' + +if (hasProperty('appBuildDir')) { + buildDir = property('appBuildDir') +} + +dependencies { + deploy project(path: ':war', configuration: 'archives') +} diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/settings.gradle b/dd-smoke-tests/rum/wildfly-15/rum-ear/settings.gradle new file mode 100644 index 00000000000..c14efe93653 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/settings.gradle @@ -0,0 +1,36 @@ +pluginManagement { + repositories { + mavenLocal() + if (settings.hasProperty("gradlePluginProxy")) { + maven { + url settings["gradlePluginProxy"] + allowInsecureProtocol true + } + } + if (settings.hasProperty("mavenRepositoryProxy")) { + maven { + url settings["mavenRepositoryProxy"] + allowInsecureProtocol true + } + } + gradlePluginPortal() + mavenCentral() + } +} + +def isCI = System.getenv("CI") != null + +// Don't pollute the dependency cache with the build cache +if (isCI) { + def sharedRootDir = "$rootDir/../../../../" + buildCache { + local { + // This needs to line up with the code in the outer project settings.gradle + directory = "$sharedRootDir/workspace/build-cache" + } + } +} + +rootProject.name='wildfly-rum-ear-smoketest' + +include 'war' diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/build.gradle b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/build.gradle new file mode 100644 index 00000000000..e897c9b3687 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'war' + +repositories { + mavenLocal() + if (project.rootProject.hasProperty("mavenRepositoryProxy")) { + maven { + url project.rootProject.property("mavenRepositoryProxy") + allowInsecureProtocol true + } + } + mavenCentral() +} + +dependencies { + compileOnly group: 'javax', name: 'javaee-api', version: '8.0.1' +} diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlJspFilter.java b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlJspFilter.java new file mode 100644 index 00000000000..84045a3f1c7 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlJspFilter.java @@ -0,0 +1,26 @@ +package com.example; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; + +@WebFilter(filterName = "test", value = "/*", asyncSupported = true) +public class HtmlJspFilter implements Filter { + @Override + public void doFilter( + ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + final String uri = ((HttpServletRequest) servletRequest).getRequestURI(); + if (uri.contains("/xml")) { + filterChain.doFilter(servletRequest, servletResponse); + } else { + // FIXME: async injection looks not working on wildfly + servletRequest.getRequestDispatcher("/jsp/html.jsp").forward(servletRequest, servletResponse); + } + } +} diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlServlet.java b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlServlet.java new file mode 100644 index 00000000000..fd9846e4424 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/HtmlServlet.java @@ -0,0 +1,15 @@ +package com.example; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(value = "/html") +public class HtmlServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException {} +} diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/XmlServlet.java b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/XmlServlet.java new file mode 100644 index 00000000000..ab0b2291744 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/java/com/example/XmlServlet.java @@ -0,0 +1,18 @@ +package com.example; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(value = "/xml") +public class XmlServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/xml"); + resp.getWriter().print(""); + } +} diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/beans.xml b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 00000000000..f0ba505ab81 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,8 @@ + + + + diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/web.xml b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..1e7444526e4 --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,7 @@ + + + diff --git a/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/jsp/html.jsp b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/jsp/html.jsp new file mode 100644 index 00000000000..3accf92568b --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/rum-ear/war/src/main/webapp/jsp/html.jsp @@ -0,0 +1,11 @@ + + + JSP - Hello World + + +

<%= "Hello World!" %> +

+
+Html Servlet + + diff --git a/dd-smoke-tests/rum/wildfly-15/src/test/groovy/datadog/smoketest/Wildfly15RumSmokeTest.groovy b/dd-smoke-tests/rum/wildfly-15/src/test/groovy/datadog/smoketest/Wildfly15RumSmokeTest.groovy new file mode 100644 index 00000000000..df0334feaea --- /dev/null +++ b/dd-smoke-tests/rum/wildfly-15/src/test/groovy/datadog/smoketest/Wildfly15RumSmokeTest.groovy @@ -0,0 +1,57 @@ +package datadog.smoketest + +import datadog.smoketest.rum.AbstractRumServerSmokeTest +import datadog.trace.agent.test.utils.OkHttpUtils +import datadog.trace.agent.test.utils.PortUtils +import okhttp3.Request +import spock.lang.Shared +import spock.util.concurrent.PollingConditions + +class Wildfly15RumSmokeTest extends AbstractRumServerSmokeTest { + + @Shared + File wildflyDirectory = new File(System.getProperty("datadog.smoketest.wildflyDir")) + @Shared + int httpsPort = PortUtils.randomOpenPort() + @Shared + int managementPort = PortUtils.randomOpenPort() + + @Override + ProcessBuilder createProcessBuilder() { + ProcessBuilder processBuilder = + new ProcessBuilder("${wildflyDirectory}/bin/standalone.sh") + processBuilder.directory(wildflyDirectory) + List javaOpts = [ + *defaultJavaProperties, + *defaultRumProperties, + "-Djboss.http.port=${httpPort}", + "-Djboss.https.port=${httpsPort}", + "-Djboss.management.http.port=${managementPort}", + ] + processBuilder.environment().put("JAVA_OPTS", javaOpts.collect({ it.replace(' ', '\\ ') }).join(' ')) + return processBuilder + } + + def setupSpec() { + //wait for the deployment + new PollingConditions(timeout: 300, delay: 2).eventually { + assert OkHttpUtils.client().newCall(new Request.Builder().url("http://localhost:$httpPort/war/html").build()).execute().code() == 200 + } + } + + def cleanupSpec() { + ProcessBuilder processBuilder = new ProcessBuilder( + "${wildflyDirectory}/bin/jboss-cli.sh", + "--connect", + "--controller=localhost:${managementPort}", + "command=:shutdown") + processBuilder.directory(wildflyDirectory) + Process process = processBuilder.start() + process.waitFor() + } + + @Override + String mountPoint() { + "/war" + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 6ec03c40493..2de3e282faa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -188,6 +188,7 @@ include( ":dd-smoke-tests:rum:tomcat-9", ":dd-smoke-tests:rum:tomcat-10", ":dd-smoke-tests:rum:tomcat-11", + ":dd-smoke-tests:rum:wildfly-15", ":dd-smoke-tests:spring-boot-3.0-native", ":dd-smoke-tests:spring-boot-2.4-webflux", ":dd-smoke-tests:spring-boot-2.5-webflux",