From 6c6be3db98934d167d3d09974a7ca74ecc1f4a84 Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 12:13:48 -0700 Subject: [PATCH 1/9] Convert play v2.6 test to java --- .../play/v2_6/server/PlayAsyncServerTest.java | 102 +++++++++++++ .../play/v2_6/server/PlayServerTest.java | 137 ++++++++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java create mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java new file mode 100644 index 000000000000..c03e2739ee84 --- /dev/null +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java @@ -0,0 +1,102 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_6.server; + +import play.Mode; +import play.libs.concurrent.HttpExecution; +import play.mvc.Controller; +import play.mvc.Http; +import play.mvc.Results; +import play.routing.RoutingDsl; +import play.server.Server; +import scala.concurrent.ExecutionContextExecutor; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; + +class PlayAsyncServerTest extends PlayServerTest { + + private static final ExecutorService executor = Executors.newCachedThreadPool(); + + @Override + public Server setupServer(int port) { + ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); + return Server.forRouter(Mode.TEST, port, components -> + RoutingDsl.fromComponents(components) + .GET(SUCCESS.getPath()).routeAsync(() -> + CompletableFuture.supplyAsync(() -> + controller(SUCCESS, () -> + Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) + ), executionContextExecutor + ) + ) + .GET(QUERY_PARAM.getPath()).routeAsync(() -> + CompletableFuture.supplyAsync(() -> + controller(QUERY_PARAM, () -> + Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) + ), executionContextExecutor + ) + ) + .GET(REDIRECT.getPath()).routeAsync(() -> + CompletableFuture.supplyAsync(() -> + controller(REDIRECT, () -> + Results.found(REDIRECT.getBody()) + ), executionContextExecutor + ) + ) + .GET(ERROR.getPath()).routeAsync(() -> + CompletableFuture.supplyAsync(() -> + controller(ERROR, () -> + Results.status(ERROR.getStatus(), ERROR.getBody()) + ), executionContextExecutor + ) + ) + .GET(EXCEPTION.getPath()).routeAsync(() -> + CompletableFuture.supplyAsync(() -> + controller(EXCEPTION, () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + }), executionContextExecutor + ) + ) + .GET(CAPTURE_HEADERS.getPath()).routeAsync(() -> { + Http.Request request = Controller.request(); + Http.Response response = Controller.response(); + return CompletableFuture.supplyAsync(() -> + controller(CAPTURE_HEADERS, () -> { + request.header("X-Test-Request").ifPresent(value -> + response.setHeader("X-Test-Response", value) + ); + return Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); + }), executionContextExecutor + ); + }) + .GET(INDEXED_CHILD.getPath()).routeAsync(() -> { + String id = Controller.request().getQueryString("id"); + return CompletableFuture.supplyAsync(() -> + controller(INDEXED_CHILD, () -> { + INDEXED_CHILD.collectSpanAttributes(name -> "id".equals(name) ? id : null); + return Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + }), executionContextExecutor + ); + }) + .build() + ); + } + + @Override + protected void stopServer(Server server) { + server.stop(); + executor.shutdown(); + } +} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java new file mode 100644 index 000000000000..b538bf70437c --- /dev/null +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java @@ -0,0 +1,137 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_6.server; + +import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; +import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.HttpAttributes; +import java.util.HashSet; +import java.util.Set; +import org.junit.jupiter.api.extension.RegisterExtension; +import play.Mode; +import play.mvc.Controller; +import play.mvc.Results; +import play.routing.RoutingDsl; +import play.server.Server; + +abstract class PlayServerTest extends AbstractHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected Server setupServer() { + return Server.forRouter( + Mode.TEST, + port, + components -> + RoutingDsl.fromComponents(components) + .GET(SUCCESS.getPath()) + .routeTo( + () -> + controller( + SUCCESS, () -> Results.status(SUCCESS.getStatus(), SUCCESS.getBody()))) + .GET(QUERY_PARAM.getPath()) + .routeTo( + () -> + controller( + QUERY_PARAM, + () -> Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()))) + .GET(REDIRECT.getPath()) + .routeTo(() -> controller(REDIRECT, () -> Results.found(REDIRECT.getBody()))) + .GET(ERROR.getPath()) + .routeTo( + () -> + controller(ERROR, () -> Results.status(ERROR.getStatus(), ERROR.getBody()))) + .GET(EXCEPTION.getPath()) + .routeTo( + () -> + controller( + EXCEPTION, + () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + })) + .GET(CAPTURE_HEADERS.getPath()) + .routeTo( + () -> + controller( + CAPTURE_HEADERS, + () -> { + Controller.request() + .header("X-Test-Request") + .ifPresent( + value -> + Controller.response() + .setHeader("X-Test-Response", value)); + return Results.status( + CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); + })) + .GET(INDEXED_CHILD.getPath()) + .routeTo( + () -> + controller( + INDEXED_CHILD, + () -> { + INDEXED_CHILD.collectSpanAttributes( + name -> Controller.request().getQueryString(name)); + return Results.status( + INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + })) + .build()); + } + + @Override + protected void stopServer(Server server) throws Exception { + server.stop(); + } + + @Override + protected void configure(HttpServerTestOptions options) { + options.setHasHandlerSpan(unused -> true); + options.setTestHttpPipelining(false); + options.setResponseCodeOnNonStandardHttpMethod(404); + // server spans are ended inside of the controller spans + options.setVerifyServerSpanEndTime(false); + options.setHttpAttributes( + serverEndpoint -> { + Set> attributes = + new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); + attributes.remove(HttpAttributes.HTTP_ROUTE); + return attributes; + }); + + options.setExpectedException(new IllegalArgumentException(EXCEPTION.getBody())); + options.disableTestNonStandardHttpMethod(); + } + + @Override + public SpanDataAssert assertHandlerSpan( + SpanDataAssert span, String method, ServerEndpoint endpoint) { + span.hasName("play.request").hasKind(INTERNAL); + if (endpoint == EXCEPTION) { + span.hasStatus(StatusData.error()); + span.hasException(new IllegalArgumentException(EXCEPTION.getBody())); + } + return span; + } + + public abstract Server setupServer(int port); +} From 5be895f433ea3260ca7cc9277fd0b9b76fefe8b8 Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 14:02:08 -0700 Subject: [PATCH 2/9] Update --- .../play/v2_6/PlayAsyncServerTest.java | 129 ++++++++++++++++++ .../v2_6/{server => }/PlayServerTest.java | 4 +- .../play/v2_6/server/PlayAsyncServerTest.java | 102 -------------- 3 files changed, 130 insertions(+), 105 deletions(-) create mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java rename instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/{server => }/PlayServerTest.java (97%) delete mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java new file mode 100644 index 000000000000..60c9b87dbb1d --- /dev/null +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -0,0 +1,129 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_6; + +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import play.Mode; +import play.libs.concurrent.HttpExecution; +import play.mvc.Controller; +import play.mvc.Http; +import play.mvc.Results; +import play.routing.RoutingDsl; +import play.server.Server; +import scala.concurrent.ExecutionContextExecutor; + +class PlayAsyncServerTest extends PlayServerTest { + + private static final ExecutorService executor = Executors.newCachedThreadPool(); + + @Override + public Server setupServer() { + ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); + return Server.forRouter( + Mode.TEST, + port, + components -> + RoutingDsl.fromComponents(components) + .GET(SUCCESS.getPath()) + .routeAsync( + () -> + CompletableFuture.supplyAsync( + () -> + controller( + SUCCESS, + () -> Results.status(SUCCESS.getStatus(), SUCCESS.getBody())), + executionContextExecutor)) + .GET(QUERY_PARAM.getPath()) + .routeAsync( + () -> + CompletableFuture.supplyAsync( + () -> + controller( + QUERY_PARAM, + () -> + Results.status( + QUERY_PARAM.getStatus(), QUERY_PARAM.getBody())), + executionContextExecutor)) + .GET(REDIRECT.getPath()) + .routeAsync( + () -> + CompletableFuture.supplyAsync( + () -> controller(REDIRECT, () -> Results.found(REDIRECT.getBody())), + executionContextExecutor)) + .GET(ERROR.getPath()) + .routeAsync( + () -> + CompletableFuture.supplyAsync( + () -> + controller( + ERROR, + () -> Results.status(ERROR.getStatus(), ERROR.getBody())), + executionContextExecutor)) + .GET(EXCEPTION.getPath()) + .routeAsync( + () -> + CompletableFuture.supplyAsync( + () -> + controller( + EXCEPTION, + () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + }), + executionContextExecutor)) + .GET(CAPTURE_HEADERS.getPath()) + .routeAsync( + () -> { + Http.Request request = Controller.request(); + Http.Response response = Controller.response(); + return CompletableFuture.supplyAsync( + () -> + controller( + CAPTURE_HEADERS, + () -> { + request + .header("X-Test-Request") + .ifPresent( + value -> response.setHeader("X-Test-Response", value)); + return Results.status( + CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); + }), + executionContextExecutor); + }) + .GET(INDEXED_CHILD.getPath()) + .routeAsync( + () -> { + String id = Controller.request().getQueryString("id"); + return CompletableFuture.supplyAsync( + () -> + controller( + INDEXED_CHILD, + () -> { + INDEXED_CHILD.collectSpanAttributes( + name -> "id".equals(name) ? id : null); + return Results.status( + INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + }), + executionContextExecutor); + }) + .build()); + } + + @Override + protected void stopServer(Server server) { + server.stop(); + executor.shutdown(); + } +} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java similarity index 97% rename from instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java rename to instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index b538bf70437c..d8abc0ba3ac8 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.play.v2_6.server; +package io.opentelemetry.javaagent.instrumentation.play.v2_6; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; @@ -132,6 +132,4 @@ public SpanDataAssert assertHandlerSpan( } return span; } - - public abstract Server setupServer(int port); } diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java deleted file mode 100644 index c03e2739ee84..000000000000 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/server/PlayAsyncServerTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.play.v2_6.server; - -import play.Mode; -import play.libs.concurrent.HttpExecution; -import play.mvc.Controller; -import play.mvc.Http; -import play.mvc.Results; -import play.routing.RoutingDsl; -import play.server.Server; -import scala.concurrent.ExecutionContextExecutor; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; - -class PlayAsyncServerTest extends PlayServerTest { - - private static final ExecutorService executor = Executors.newCachedThreadPool(); - - @Override - public Server setupServer(int port) { - ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); - return Server.forRouter(Mode.TEST, port, components -> - RoutingDsl.fromComponents(components) - .GET(SUCCESS.getPath()).routeAsync(() -> - CompletableFuture.supplyAsync(() -> - controller(SUCCESS, () -> - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - ), executionContextExecutor - ) - ) - .GET(QUERY_PARAM.getPath()).routeAsync(() -> - CompletableFuture.supplyAsync(() -> - controller(QUERY_PARAM, () -> - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - ), executionContextExecutor - ) - ) - .GET(REDIRECT.getPath()).routeAsync(() -> - CompletableFuture.supplyAsync(() -> - controller(REDIRECT, () -> - Results.found(REDIRECT.getBody()) - ), executionContextExecutor - ) - ) - .GET(ERROR.getPath()).routeAsync(() -> - CompletableFuture.supplyAsync(() -> - controller(ERROR, () -> - Results.status(ERROR.getStatus(), ERROR.getBody()) - ), executionContextExecutor - ) - ) - .GET(EXCEPTION.getPath()).routeAsync(() -> - CompletableFuture.supplyAsync(() -> - controller(EXCEPTION, () -> { - throw new IllegalArgumentException(EXCEPTION.getBody()); - }), executionContextExecutor - ) - ) - .GET(CAPTURE_HEADERS.getPath()).routeAsync(() -> { - Http.Request request = Controller.request(); - Http.Response response = Controller.response(); - return CompletableFuture.supplyAsync(() -> - controller(CAPTURE_HEADERS, () -> { - request.header("X-Test-Request").ifPresent(value -> - response.setHeader("X-Test-Response", value) - ); - return Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); - }), executionContextExecutor - ); - }) - .GET(INDEXED_CHILD.getPath()).routeAsync(() -> { - String id = Controller.request().getQueryString("id"); - return CompletableFuture.supplyAsync(() -> - controller(INDEXED_CHILD, () -> { - INDEXED_CHILD.collectSpanAttributes(name -> "id".equals(name) ? id : null); - return Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); - }), executionContextExecutor - ); - }) - .build() - ); - } - - @Override - protected void stopServer(Server server) { - server.stop(); - executor.shutdown(); - } -} From 40210ed3cd10babfda65ca31f69e43939d4042ea Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 14:52:04 -0700 Subject: [PATCH 3/9] Update --- .../groovy/server/PlayAsyncServerTest.groovy | 99 ------------- .../groovy/server/PlayServerTest.groovy | 118 ---------------- .../java/server/PlayAsyncServerTest.java | 130 ++++++++++++++++++ .../java/server/PlayServerTest.java | 124 +++++++++++++++++ .../groovy/server/PlayAsyncServerTest.groovy | 106 -------------- .../test/groovy/server/PlayServerTest.groovy | 114 --------------- .../play/v2_6/PlayAsyncServerTest.java | 2 +- .../play/v2_6/PlayServerTest.java | 2 +- 8 files changed, 256 insertions(+), 439 deletions(-) delete mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayAsyncServerTest.groovy delete mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayServerTest.groovy create mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java create mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java delete mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayAsyncServerTest.groovy delete mode 100644 instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayAsyncServerTest.groovy b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayAsyncServerTest.groovy deleted file mode 100644 index 80a8e004b226..000000000000 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayAsyncServerTest.groovy +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package server - -import play.BuiltInComponents -import play.Mode -import play.libs.concurrent.HttpExecution -import play.mvc.Results -import play.routing.RequestFunctions -import play.routing.RoutingDsl -import play.server.Server -import spock.lang.Shared - -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executors - -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS - -class PlayAsyncServerTest extends PlayServerTest { - @Shared - def executor = Executors.newCachedThreadPool() - - def cleanupSpec() { - executor.shutdown() - } - - @Override - Server startServer(int port) { - def execContext = HttpExecution.fromThread(executor) - return Server.forRouter(Mode.TEST, port) { BuiltInComponents components -> - RoutingDsl.fromComponents(components) - .GET(SUCCESS.getPath()).routingAsync({ - CompletableFuture.supplyAsync({ - controller(SUCCESS) { - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .GET(QUERY_PARAM.getPath()).routingAsync({ - CompletableFuture.supplyAsync({ - controller(QUERY_PARAM) { - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .GET(REDIRECT.getPath()).routingAsync({ - CompletableFuture.supplyAsync({ - controller(REDIRECT) { - Results.found(REDIRECT.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .GET(ERROR.getPath()).routingAsync({ - CompletableFuture.supplyAsync({ - controller(ERROR) { - Results.status(ERROR.getStatus(), ERROR.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .GET(EXCEPTION.getPath()).routingAsync({ - CompletableFuture.supplyAsync({ - controller(EXCEPTION) { - throw new Exception(EXCEPTION.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .GET(CAPTURE_HEADERS.getPath()).routingAsync({request -> - CompletableFuture.supplyAsync({ - controller(CAPTURE_HEADERS) { - def result = Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()) - request.header("X-Test-Request").ifPresent({ value -> - result = result.withHeader("X-Test-Response", value) - }) - result - } - }, execContext) - } as RequestFunctions.Params0) - .GET(INDEXED_CHILD.getPath()).routingAsync({request -> - String id = request.queryString("id").get() - CompletableFuture.supplyAsync({ - controller(INDEXED_CHILD) { - INDEXED_CHILD.collectSpanAttributes { name -> name == "id" ? id : null } - Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()) - } - }, execContext) - } as RequestFunctions.Params0) - .build() - } - } -} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayServerTest.groovy deleted file mode 100644 index 2119ec65217a..000000000000 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/groovy/server/PlayServerTest.groovy +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package server - -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.api.trace.StatusCode -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.asserts.TraceAssert -import io.opentelemetry.instrumentation.test.base.HttpServerTest -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint -import io.opentelemetry.sdk.trace.data.SpanData -import play.BuiltInComponents -import play.Mode -import play.mvc.Results -import play.routing.RequestFunctions -import play.routing.RoutingDsl -import play.server.Server - -import static io.opentelemetry.api.trace.SpanKind.INTERNAL -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS - -class PlayServerTest extends HttpServerTest implements AgentTestTrait { - @Override - Server startServer(int port) { - return Server.forRouter(Mode.TEST, port) { BuiltInComponents components -> - RoutingDsl.fromComponents(components) - .GET(SUCCESS.getPath()).routingTo({ - controller(SUCCESS) { - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - } - } as RequestFunctions.Params0) - .GET(QUERY_PARAM.getPath()).routingTo({ - controller(QUERY_PARAM) { - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - } - } as RequestFunctions.Params0) - .GET(REDIRECT.getPath()).routingTo({ - controller(REDIRECT) { - Results.found(REDIRECT.getBody()) - } - } as RequestFunctions.Params0) - .GET(ERROR.getPath()).routingTo({ - controller(ERROR) { - Results.status(ERROR.getStatus(), ERROR.getBody()) - } - } as RequestFunctions.Params0) - .GET(EXCEPTION.getPath()).routingTo({ - controller(EXCEPTION) { - throw new Exception(EXCEPTION.getBody()) - } - } as RequestFunctions.Params0) - .GET(CAPTURE_HEADERS.getPath()).routingTo({request -> - controller(CAPTURE_HEADERS) { - def result = Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()) - request.header("X-Test-Request").ifPresent({ value -> - result = result.withHeader("X-Test-Response", value) - }) - result - } - } as RequestFunctions.Params0) - .GET(INDEXED_CHILD.getPath()).routingTo({request -> - controller(INDEXED_CHILD) { - INDEXED_CHILD.collectSpanAttributes { name -> request.queryString(name).get() } - Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()) - } - } as RequestFunctions.Params0) - .build() - } - } - - @Override - void stopServer(Server server) { - server.stop() - } - - @Override - boolean hasHandlerSpan(ServerEndpoint endpoint) { - true - } - - @Override - boolean testHttpPipelining() { - false - } - - // play does not emit a span at all when a non standard HTTP method is used - @Override - boolean testNonStandardHttpMethod() { - false - } - - @Override - void handlerSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - trace.span(index) { - name "play.request" - kind INTERNAL - childOf((SpanData) parent) - if (endpoint == EXCEPTION) { - status StatusCode.ERROR - errorEvent(Exception, EXCEPTION.body) - } - } - } - - @Override - Set> httpAttributes(ServerEndpoint endpoint) { - [] - } -} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java new file mode 100644 index 000000000000..abe4d2e3d7c4 --- /dev/null +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java @@ -0,0 +1,130 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package server; + +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import play.Mode; +import play.libs.concurrent.HttpExecution; +import play.mvc.Result; +import play.mvc.Results; +import play.routing.RoutingDsl; +import play.server.Server; +import scala.concurrent.ExecutionContextExecutor; + +class PlayAsyncServerTest extends PlayServerTest { + + private static final ExecutorService executor = Executors.newCachedThreadPool(); + + @Override + protected Server setupServer(int port) { + ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); + return Server.forRouter( + Mode.TEST, + port, + components -> + RoutingDsl.fromComponents(components) + .GET(SUCCESS.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> + controller( + SUCCESS, + () -> Results.status(SUCCESS.getStatus(), SUCCESS.getBody())), + executionContextExecutor)) + .GET(QUERY_PARAM.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> + controller( + QUERY_PARAM, + () -> + Results.status( + QUERY_PARAM.getStatus(), QUERY_PARAM.getBody())), + executionContextExecutor)) + .GET(REDIRECT.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> controller(REDIRECT, () -> Results.found(REDIRECT.getBody())), + executionContextExecutor)) + .GET(ERROR.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> + controller( + ERROR, + () -> Results.status(ERROR.getStatus(), ERROR.getBody())), + executionContextExecutor)) + .GET(EXCEPTION.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> { + controller( + EXCEPTION, + () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + }); + return null; + }, + executionContextExecutor)) + .GET(CAPTURE_HEADERS.getPath()) + .routingAsync( + request -> + CompletableFuture.supplyAsync( + () -> + controller( + CAPTURE_HEADERS, + () -> { + Result result = + Results.status( + CAPTURE_HEADERS.getStatus(), + CAPTURE_HEADERS.getBody()); + request + .header("X-Test-Request") + .ifPresent( + value -> result.withHeader("X-Test-Response", value)); + return result; + }), + executionContextExecutor)) + .GET(INDEXED_CHILD.getPath()) + .routingAsync( + request -> { + String id = request.queryString("id").orElse(null); + return CompletableFuture.supplyAsync( + () -> + controller( + INDEXED_CHILD, + () -> { + INDEXED_CHILD.collectSpanAttributes( + name -> "id".equals(name) ? id : null); + return Results.status( + INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + }), + executionContextExecutor); + }) + .build()); + } + + @Override + protected void stopServer(Server server) { + server.stop(); + executor.shutdown(); + } +} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java new file mode 100644 index 000000000000..f3cfdc43ca16 --- /dev/null +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java @@ -0,0 +1,124 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package server; + +import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static java.util.Collections.emptySet; + +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; +import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.sdk.trace.data.StatusData; +import org.junit.jupiter.api.extension.RegisterExtension; +import play.Mode; +import play.mvc.Result; +import play.mvc.Results; +import play.routing.RoutingDsl; +import play.server.Server; + +abstract class PlayServerTest extends AbstractHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected Server setupServer() { + return Server.forRouter( + Mode.TEST, + port, + components -> + RoutingDsl.fromComponents(components) + .GET(SUCCESS.getPath()) + .routingTo( + request -> + controller( + SUCCESS, () -> Results.status(SUCCESS.getStatus(), SUCCESS.getBody()))) + .GET(QUERY_PARAM.getPath()) + .routingTo( + request -> + controller( + QUERY_PARAM, + () -> Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()))) + .GET(REDIRECT.getPath()) + .routingTo(request -> controller(REDIRECT, () -> Results.found(REDIRECT.getBody()))) + .GET(ERROR.getPath()) + .routingTo( + request -> + controller(ERROR, () -> Results.status(ERROR.getStatus(), ERROR.getBody()))) + .GET(EXCEPTION.getPath()) + .routingTo( + request -> + controller( + EXCEPTION, + () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + })) + .GET(CAPTURE_HEADERS.getPath()) + .routingTo( + request -> + controller( + CAPTURE_HEADERS, + () -> { + Result result = + Results.status( + CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); + request + .header("X-Test-Request") + .ifPresent(value -> result.withHeader("X-Test-Response", value)); + return result; + })) + .GET(INDEXED_CHILD.getPath()) + .routingTo( + request -> + controller( + INDEXED_CHILD, + () -> { + INDEXED_CHILD.collectSpanAttributes( + name -> request.queryString(name).orElse(null)); + return Results.status( + INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + })) + .build()); + } + + protected abstract Server setupServer(int port); + + @Override + protected void stopServer(Server server) { + server.stop(); + } + + @Override + protected void configure(HttpServerTestOptions options) { + options.setHasHandlerSpan(unused -> true); + options.setTestHttpPipelining(false); + options.setHttpAttributes(endpoint -> emptySet()); + + options.setExpectedException(new IllegalArgumentException(EXCEPTION.getBody())); + options.disableTestNonStandardHttpMethod(); + } + + @Override + public SpanDataAssert assertHandlerSpan( + SpanDataAssert span, String method, ServerEndpoint endpoint) { + span.hasName("play.request").hasKind(INTERNAL); + if (endpoint == EXCEPTION) { + span.hasStatus(StatusData.error()); + span.hasException(new IllegalArgumentException(EXCEPTION.getBody())); + } + return span; + } +} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayAsyncServerTest.groovy b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayAsyncServerTest.groovy deleted file mode 100644 index c78c00540411..000000000000 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayAsyncServerTest.groovy +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package server - -import play.BuiltInComponents -import play.Mode -import play.libs.concurrent.HttpExecution -import play.mvc.Controller -import play.mvc.Results -import play.routing.RoutingDsl -import play.server.Server -import spock.lang.Shared - -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executors -import java.util.function.Supplier - -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS - -class PlayAsyncServerTest extends PlayServerTest { - @Shared - def executor = Executors.newCachedThreadPool() - - def cleanupSpec() { - executor.shutdown() - } - - @Override - Server startServer(int port) { - def execContext = HttpExecution.fromThread(executor) - return Server.forRouter(Mode.TEST, port) { BuiltInComponents components -> - RoutingDsl.fromComponents(components) - .GET(SUCCESS.getPath()).routeAsync({ - CompletableFuture.supplyAsync({ - controller(SUCCESS) { - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - } - }, execContext) - } as Supplier) - .GET(QUERY_PARAM.getPath()).routeAsync({ - CompletableFuture.supplyAsync({ - controller(QUERY_PARAM) { - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - } - }, execContext) - } as Supplier) - .GET(REDIRECT.getPath()).routeAsync({ - CompletableFuture.supplyAsync({ - controller(REDIRECT) { - Results.found(REDIRECT.getBody()) - } - }, execContext) - } as Supplier) - .GET(ERROR.getPath()).routeAsync({ - CompletableFuture.supplyAsync({ - controller(ERROR) { - Results.status(ERROR.getStatus(), ERROR.getBody()) - } - }, execContext) - } as Supplier) - .GET(EXCEPTION.getPath()).routeAsync({ - CompletableFuture.supplyAsync({ - controller(EXCEPTION) { - throw new Exception(EXCEPTION.getBody()) - } - }, execContext) - } as Supplier) - .GET(CAPTURE_HEADERS.getPath()).routeAsync({ - def request = Controller.request() - def response = Controller.response() - CompletableFuture.supplyAsync({ - controller(CAPTURE_HEADERS) { - request.header("X-Test-Request").ifPresent({ value -> - response.setHeader("X-Test-Response", value) - }) - Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()) - } - }, execContext) - } as Supplier) - .GET(INDEXED_CHILD.getPath()).routeAsync({ - String id = Controller.request().getQueryString("id") - CompletableFuture.supplyAsync({ - controller(INDEXED_CHILD) { - INDEXED_CHILD.collectSpanAttributes { name -> name == "id" ? id : null } - Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()) - } - }, execContext) - } as Supplier) - .build() - } - } - - @Override - boolean testHttpPipelining() { - false - } -} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy deleted file mode 100644 index 9f3ab3cb7759..000000000000 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package server - -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.api.trace.StatusCode -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.asserts.TraceAssert -import io.opentelemetry.instrumentation.test.base.HttpServerTest -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint -import io.opentelemetry.sdk.trace.data.SpanData -import play.BuiltInComponents -import play.Mode -import play.mvc.Controller -import play.mvc.Results -import play.routing.RoutingDsl -import play.server.Server - -import java.util.function.Supplier - -import static io.opentelemetry.api.trace.SpanKind.INTERNAL -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS - -class PlayServerTest extends HttpServerTest implements AgentTestTrait { - @Override - Server startServer(int port) { - return Server.forRouter(Mode.TEST, port) { BuiltInComponents components -> - RoutingDsl.fromComponents(components) - .GET(SUCCESS.getPath()).routeTo({ - controller(SUCCESS) { - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - } - } as Supplier) - .GET(QUERY_PARAM.getPath()).routeTo({ - controller(QUERY_PARAM) { - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - } - } as Supplier) - .GET(REDIRECT.getPath()).routeTo({ - controller(REDIRECT) { - Results.found(REDIRECT.getBody()) - } - } as Supplier) - .GET(ERROR.getPath()).routeTo({ - controller(ERROR) { - Results.status(ERROR.getStatus(), ERROR.getBody()) - } - } as Supplier) - .GET(EXCEPTION.getPath()).routeTo({ - controller(EXCEPTION) { - throw new Exception(EXCEPTION.getBody()) - } - } as Supplier) - .GET(CAPTURE_HEADERS.getPath()).routeTo({ - controller(CAPTURE_HEADERS) { - Controller.request().header("X-Test-Request").ifPresent({ value -> - Controller.response().setHeader("X-Test-Response", value) - }) - Results.status(CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()) - } - } as Supplier) - .GET(INDEXED_CHILD.getPath()).routeTo({ - controller(INDEXED_CHILD) { - INDEXED_CHILD.collectSpanAttributes { name -> Controller.request().getQueryString(name) } - Results.status(INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()) - } - } as Supplier) - .build() - } - } - - @Override - void stopServer(Server server) { - server.stop() - } - - @Override - boolean hasHandlerSpan(ServerEndpoint endpoint) { - true - } - - @Override - void handlerSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - trace.span(index) { - name "play.request" - kind INTERNAL - childOf((SpanData) parent) - if (endpoint == EXCEPTION) { - status StatusCode.ERROR - errorEvent(Exception, EXCEPTION.body) - } - } - } - - @Override - Set> httpAttributes(ServerEndpoint endpoint) { - [] - } - - @Override - boolean testNonStandardHttpMethod() { - // instrumentation does not create a server span at all - false - } -} diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java index 60c9b87dbb1d..a884918b0220 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -30,7 +30,7 @@ class PlayAsyncServerTest extends PlayServerTest { private static final ExecutorService executor = Executors.newCachedThreadPool(); @Override - public Server setupServer() { + protected Server setupServer() { ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); return Server.forRouter( Mode.TEST, diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index d8abc0ba3ac8..363079b49ba3 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -123,7 +123,7 @@ protected void configure(HttpServerTestOptions options) { } @Override - public SpanDataAssert assertHandlerSpan( + protected SpanDataAssert assertHandlerSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { span.hasName("play.request").hasKind(INTERNAL); if (endpoint == EXCEPTION) { From 4fa154caea026cf43415ef3d300c20f067c841c1 Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 14:59:15 -0700 Subject: [PATCH 4/9] Update package --- .../instrumentation/play/v2_6}/PlayAsyncServerTest.java | 2 +- .../javaagent/instrumentation/play/v2_6}/PlayServerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/{server => io/opentelemetry/javaagent/instrumentation/play/v2_6}/PlayAsyncServerTest.java (98%) rename instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/{server => io/opentelemetry/javaagent/instrumentation/play/v2_6}/PlayServerTest.java (98%) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java similarity index 98% rename from instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java rename to instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java index abe4d2e3d7c4..bb2030d11589 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayAsyncServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package server; +package io.opentelemetry.javaagent.instrumentation.play.v2_6; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java similarity index 98% rename from instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java rename to instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index f3cfdc43ca16..6da9af7cb9bf 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/server/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package server; +package io.opentelemetry.javaagent.instrumentation.play.v2_6; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; From 2482ddf9bfa23230066af200ccd4e4a2bf431b44 Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 15:19:47 -0700 Subject: [PATCH 5/9] Fix --- .../play/v2_6/PlayAsyncServerTest.java | 2 +- .../play/v2_6/PlayServerTest.java | 4 +--- .../play/v2_6/PlayServerTest.java | 18 ++---------------- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java index bb2030d11589..2ccd27f0379b 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -29,7 +29,7 @@ class PlayAsyncServerTest extends PlayServerTest { private static final ExecutorService executor = Executors.newCachedThreadPool(); @Override - protected Server setupServer(int port) { + protected Server setupServer() { ExecutionContextExecutor executionContextExecutor = HttpExecution.fromThread(executor); return Server.forRouter( Mode.TEST, diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index 6da9af7cb9bf..c3160f565fa6 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -94,8 +94,6 @@ protected Server setupServer() { .build()); } - protected abstract Server setupServer(int port); - @Override protected void stopServer(Server server) { server.stop(); @@ -112,7 +110,7 @@ protected void configure(HttpServerTestOptions options) { } @Override - public SpanDataAssert assertHandlerSpan( + protected SpanDataAssert assertHandlerSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { span.hasName("play.request").hasKind(INTERNAL); if (endpoint == EXCEPTION) { diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index 363079b49ba3..1aefeff9f5ba 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -13,8 +13,8 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static java.util.Collections.emptySet; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; @@ -22,9 +22,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.HttpAttributes; -import java.util.HashSet; -import java.util.Set; import org.junit.jupiter.api.extension.RegisterExtension; import play.Mode; import play.mvc.Controller; @@ -106,18 +103,7 @@ protected void stopServer(Server server) throws Exception { @Override protected void configure(HttpServerTestOptions options) { options.setHasHandlerSpan(unused -> true); - options.setTestHttpPipelining(false); - options.setResponseCodeOnNonStandardHttpMethod(404); - // server spans are ended inside of the controller spans - options.setVerifyServerSpanEndTime(false); - options.setHttpAttributes( - serverEndpoint -> { - Set> attributes = - new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); - return attributes; - }); - + options.setHttpAttributes(endpoint -> emptySet()); options.setExpectedException(new IllegalArgumentException(EXCEPTION.getBody())); options.disableTestNonStandardHttpMethod(); } From 4a673161c597f24ff6a19452fb82a1dba73ba0f9 Mon Sep 17 00:00:00 2001 From: heyams Date: Thu, 26 Sep 2024 15:43:41 -0700 Subject: [PATCH 6/9] Enable latestDepTest test --- .../play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts index b310b68ac5f5..c1dd2da1d290 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts @@ -66,8 +66,9 @@ tasks { named("test") { enabled = false } - named("compileTestGroovy") { - enabled = false + + named("latestDepTest") { + enabled = true } check { From 4c926e41eb5b6509b6763758e334103c59c0468a Mon Sep 17 00:00:00 2001 From: heyams Date: Mon, 30 Sep 2024 11:45:10 -0700 Subject: [PATCH 7/9] Fix --- .../play-mvc-2.6/javaagent/build.gradle.kts | 15 ++++++++------- .../play/v2_6/PlayAsyncServerTest.java | 7 +++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts index c1dd2da1d290..47ae9d237af9 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts @@ -60,20 +60,21 @@ testing { } } +val testLatestDeps = findProperty("testLatestDeps") as Boolean tasks { - if (findProperty("testLatestDeps") as Boolean) { + if (testLatestDeps) { // disable regular test running and compiling tasks when latest dep test task is run named("test") { enabled = false } + } - named("latestDepTest") { - enabled = true - } + named("latestDepTest") { + enabled = testLatestDeps + } - check { - dependsOn(testing.suites) - } + check { + dependsOn(testing.suites) } } diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java index a884918b0220..9bf063fdc50c 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -13,6 +13,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -126,4 +127,10 @@ protected void stopServer(Server server) { server.stop(); executor.shutdown(); } + + @Override + protected void configure(HttpServerTestOptions options) { + super.configure(options); + options.setTestHttpPipelining(false); + } } From 2fa61d1fdffe2ce9bf7b01df8d459e149e34e4e2 Mon Sep 17 00:00:00 2001 From: heyams Date: Tue, 1 Oct 2024 12:52:17 -0700 Subject: [PATCH 8/9] Fix latestDepTest asyncserver test --- .../play/v2_6/PlayAsyncServerTest.java | 21 ++++++++----------- .../play/v2_6/PlayServerTest.java | 1 + .../play/v2_6/PlayServerTest.java | 1 + 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java index 2ccd27f0379b..8ebe7e0d3567 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAsyncServerTest.java @@ -75,14 +75,12 @@ protected Server setupServer() { .routingAsync( request -> CompletableFuture.supplyAsync( - () -> { - controller( - EXCEPTION, - () -> { - throw new IllegalArgumentException(EXCEPTION.getBody()); - }); - return null; - }, + () -> + controller( + EXCEPTION, + () -> { + throw new IllegalArgumentException(EXCEPTION.getBody()); + }), executionContextExecutor)) .GET(CAPTURE_HEADERS.getPath()) .routingAsync( @@ -96,11 +94,10 @@ protected Server setupServer() { Results.status( CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); - request + return request .header("X-Test-Request") - .ifPresent( - value -> result.withHeader("X-Test-Response", value)); - return result; + .map(value -> result.withHeader("X-Test-Response", value)) + .orElse(result); }), executionContextExecutor)) .GET(INDEXED_CHILD.getPath()) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index c3160f565fa6..4567ee9d766c 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -101,6 +101,7 @@ protected void stopServer(Server server) { @Override protected void configure(HttpServerTestOptions options) { + super.configure(options); options.setHasHandlerSpan(unused -> true); options.setTestHttpPipelining(false); options.setHttpAttributes(endpoint -> emptySet()); diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index 1aefeff9f5ba..b1be98ba0674 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -102,6 +102,7 @@ protected void stopServer(Server server) throws Exception { @Override protected void configure(HttpServerTestOptions options) { + super.configure(options); options.setHasHandlerSpan(unused -> true); options.setHttpAttributes(endpoint -> emptySet()); options.setExpectedException(new IllegalArgumentException(EXCEPTION.getBody())); From cb7e13cf72342952ff8037b87a67a875349bc4af Mon Sep 17 00:00:00 2001 From: heyams Date: Wed, 9 Oct 2024 10:15:17 -0700 Subject: [PATCH 9/9] Update --- .../play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts index 47ae9d237af9..a19052c386f7 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts @@ -69,10 +69,6 @@ tasks { } } - named("latestDepTest") { - enabled = testLatestDeps - } - check { dependsOn(testing.suites) }