From 171e9d170a496d9d982606578291daf829dc8704 Mon Sep 17 00:00:00 2001 From: Helen <56097766+heyams@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:24:26 -0700 Subject: [PATCH] Convert grizzly groovy to java (#12248) --- .../GrizzlyFilterchainServerTest.groovy | 243 ------------------ .../test/groovy/GrizzlyIOStrategyTest.groovy | 45 ---- .../src/test/groovy/GrizzlyTest.groovy | 111 -------- .../grizzly/GrizzlyFilterchainServerTest.java | 236 +++++++++++++++++ .../grizzly/GrizzlyIoStrategyTest.java | 20 ++ .../instrumentation/grizzly/GrizzlyTest.java | 121 +++++++++ .../grizzly/LeaderFollowerTest.java | 17 ++ .../grizzly/SameThreadTest.java | 17 ++ .../grizzly/SimpleDynamicTest.java | 17 ++ 9 files changed, 428 insertions(+), 399 deletions(-) delete mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy delete mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyIOStrategyTest.groovy delete mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyTest.groovy create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyIoStrategyTest.java create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/LeaderFollowerTest.java create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SameThreadTest.java create mode 100644 instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SimpleDynamicTest.java diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy b/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy deleted file mode 100644 index 9924891803..0000000000 --- a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.base.HttpServerTest -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint -import io.opentelemetry.semconv.HttpAttributes -import org.glassfish.grizzly.filterchain.BaseFilter -import org.glassfish.grizzly.filterchain.FilterChain -import org.glassfish.grizzly.filterchain.FilterChainBuilder -import org.glassfish.grizzly.filterchain.FilterChainContext -import org.glassfish.grizzly.filterchain.NextAction -import org.glassfish.grizzly.filterchain.TransportFilter -import org.glassfish.grizzly.http.HttpContent -import org.glassfish.grizzly.http.HttpHeader -import org.glassfish.grizzly.http.HttpRequestPacket -import org.glassfish.grizzly.http.HttpResponsePacket -import org.glassfish.grizzly.http.HttpServerFilter -import org.glassfish.grizzly.http.server.HttpServer -import org.glassfish.grizzly.http.util.Parameters -import org.glassfish.grizzly.nio.transport.TCPNIOServerConnection -import org.glassfish.grizzly.nio.transport.TCPNIOTransport -import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder -import org.glassfish.grizzly.utils.DelayedExecutor -import org.glassfish.grizzly.utils.IdleTimeoutFilter - -import java.nio.charset.StandardCharsets -import java.util.concurrent.Executors - -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.AUTH_REQUIRED -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.NOT_FOUND -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM -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.lang.String.valueOf -import static java.nio.charset.Charset.defaultCharset -import static java.util.concurrent.TimeUnit.MILLISECONDS -import static org.glassfish.grizzly.memory.Buffers.wrap - -class GrizzlyFilterchainServerTest extends HttpServerTest implements AgentTestTrait { - - private TCPNIOTransport transport - private TCPNIOServerConnection serverConnection - - @Override - HttpServer startServer(int port) { - FilterChain filterChain = setUpFilterChain() - setUpTransport(filterChain) - - serverConnection = transport.bind("127.0.0.1", port) - transport.start() - return null - } - - @Override - void stopServer(HttpServer httpServer) { - transport.shutdownNow() - } - - @Override - Set> httpAttributes(ServerEndpoint endpoint) { - def attributes = super.httpAttributes(endpoint) - attributes.remove(HttpAttributes.HTTP_ROUTE) - attributes - } - - @Override - boolean testException() { - // justification: grizzly async closes the channel which - // looks like a ConnectException to the client when this happens - false - } - - @Override - boolean testCapturedHttpHeaders() { - false - } - - @Override - boolean verifyServerSpanEndTime() { - // server spans are ended inside of the controller spans - return false - } - - void setUpTransport(FilterChain filterChain) { - TCPNIOTransportBuilder transportBuilder = TCPNIOTransportBuilder.newInstance() - .setOptimizedForMultiplexing(true) - - transportBuilder.setTcpNoDelay(true) - transportBuilder.setKeepAlive(false) - transportBuilder.setReuseAddress(true) - transportBuilder.setServerConnectionBackLog(50) - transportBuilder.setServerSocketSoTimeout(80000) - - transport = transportBuilder.build() - transport.setProcessor(filterChain) - } - - FilterChain setUpFilterChain() { - return FilterChainBuilder.stateless() - .add(createTransportFilter()) - .add(createIdleTimeoutFilter()) - .add(new HttpServerFilter()) - .add(new LastFilter()) - .build() - } - - TransportFilter createTransportFilter() { - return new TransportFilter() - } - - IdleTimeoutFilter createIdleTimeoutFilter() { - return new IdleTimeoutFilter(new DelayedExecutor(Executors.newCachedThreadPool()), 80000, MILLISECONDS) - } - - static class LastFilter extends BaseFilter { - - @Override - NextAction handleRead(final FilterChainContext ctx) throws IOException { - if (ctx.getMessage() instanceof HttpContent) { - HttpContent httpContent = ctx.getMessage() - HttpHeader httpHeader = httpContent.getHttpHeader() - if (httpHeader instanceof HttpRequestPacket) { - HttpRequestPacket request = (HttpRequestPacket) httpContent.getHttpHeader() - ResponseParameters responseParameters = buildResponse(request) - HttpResponsePacket.Builder builder = HttpResponsePacket.builder(request) - .status(responseParameters.getStatus()) - .header("Content-Length", valueOf(responseParameters.getResponseBody().length)) - responseParameters.fillHeaders(builder) - HttpResponsePacket responsePacket = builder.build() - controller(responseParameters.getEndpoint()) { - responseParameters.execute() - ctx.write(HttpContent.builder(responsePacket) - .content(wrap(ctx.getMemoryManager(), responseParameters.getResponseBody())) - .build()) - } - } - } - return ctx.getStopAction() - } - - ResponseParameters buildResponse(HttpRequestPacket request) { - String uri = request.getRequestURI() - Map headers = new HashMap<>() - - ServerEndpoint endpoint - Closure closure - switch (uri) { - case "/success": - endpoint = SUCCESS - break - case "/redirect": - endpoint = REDIRECT - headers.put("location", REDIRECT.body) - break - case "/error-status": - endpoint = ERROR - break - case "/exception": - throw new Exception(EXCEPTION.body) - case "/query": - endpoint = QUERY_PARAM - break - case "/path/123/param": - endpoint = PATH_PARAM - break - case "/authRequired": - endpoint = AUTH_REQUIRED - break - case "/child": - endpoint = INDEXED_CHILD - Parameters parameters = new Parameters() - parameters.setQuery(request.getQueryStringDC()) - parameters.setQueryStringEncoding(StandardCharsets.UTF_8) - parameters.handleQueryParameters() - closure = { - INDEXED_CHILD.collectSpanAttributes { name -> parameters.getParameter(name) } - } - break - default: - endpoint = NOT_FOUND - break - } - - int status = endpoint.status - String responseBody = endpoint == REDIRECT ? "" : endpoint.body - - byte[] responseBodyBytes = responseBody.getBytes(defaultCharset()) - return new ResponseParameters(endpoint, status, responseBodyBytes, headers, closure) - } - - static class ResponseParameters { - Map headers - ServerEndpoint endpoint - int status - byte[] responseBody - Closure closure - - ResponseParameters(ServerEndpoint endpoint, - int status, - byte[] responseBody, - Map headers, - Closure closure) { - this.endpoint = endpoint - this.status = status - this.responseBody = responseBody - this.headers = headers - this.closure = closure - } - - int getStatus() { - return status - } - - byte[] getResponseBody() { - return responseBody - } - - ServerEndpoint getEndpoint() { - return endpoint - } - - void fillHeaders(HttpResponsePacket.Builder builder) { - for (Map.Entry header : headers.entrySet()) { - builder.header(header.getKey(), header.getValue()) - } - } - - void execute() { - if (closure != null) { - closure.run() - } - } - } - } -} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyIOStrategyTest.groovy b/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyIOStrategyTest.groovy deleted file mode 100644 index 261ae176ce..0000000000 --- a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyIOStrategyTest.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import org.glassfish.grizzly.IOStrategy -import org.glassfish.grizzly.http.server.NetworkListener -import org.glassfish.grizzly.strategies.LeaderFollowerNIOStrategy -import org.glassfish.grizzly.strategies.SameThreadIOStrategy -import org.glassfish.grizzly.strategies.SimpleDynamicNIOStrategy - -abstract class GrizzlyIOStrategyTest extends GrizzlyTest { - - @Override - void configureListener(NetworkListener listener) { - // Default in NIOTransportBuilder is WorkerThreadIOStrategy, so don't need to retest that. - listener.getTransport().setIOStrategy(strategy()) - } - - abstract IOStrategy strategy() -} - -class LeaderFollowerTest extends GrizzlyIOStrategyTest { - - @Override - IOStrategy strategy() { - return LeaderFollowerNIOStrategy.instance - } -} - -class SameThreadTest extends GrizzlyIOStrategyTest { - - @Override - IOStrategy strategy() { - return SameThreadIOStrategy.instance - } -} - -class SimpleDynamicTest extends GrizzlyIOStrategyTest { - - @Override - IOStrategy strategy() { - return SimpleDynamicNIOStrategy.instance - } -} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyTest.groovy b/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyTest.groovy deleted file mode 100644 index eeddf36f0e..0000000000 --- a/instrumentation/grizzly-2.3/javaagent/src/test/groovy/GrizzlyTest.groovy +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.base.HttpServerTest -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint -import io.opentelemetry.semconv.HttpAttributes -import org.glassfish.grizzly.http.server.HttpHandler -import org.glassfish.grizzly.http.server.HttpServer -import org.glassfish.grizzly.http.server.NetworkListener -import org.glassfish.grizzly.http.server.Request -import org.glassfish.grizzly.http.server.Response -import org.glassfish.grizzly.http.server.ServerConfiguration - -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.NOT_FOUND -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 GrizzlyTest extends HttpServerTest implements AgentTestTrait { - - @Override - HttpServer startServer(int port) { - HttpServer server = new HttpServer() - NetworkListener listener = new NetworkListener("grizzly", "localhost", port) - configureListener(listener) - server.addListener(listener) - ServerConfiguration config = server.getServerConfiguration() - config.addHttpHandler(new HttpHandler() { - @Override - void service(Request request, Response response) throws Exception { - def endpoint = ServerEndpoint.forPath(request.getDecodedRequestURI()) - controller(endpoint) { - switch (endpoint) { - case SUCCESS: - response.status = endpoint.status - response.writer.write(endpoint.body) - break - case INDEXED_CHILD: - response.status = endpoint.status - endpoint.collectSpanAttributes { request.getParameter(it) } - break - case QUERY_PARAM: - response.status = endpoint.status - response.writer.write(request.queryString) - break - case REDIRECT: - response.sendRedirect(endpoint.body) - break - case ERROR: - response.sendError(endpoint.status, endpoint.body) - break - case NOT_FOUND: - response.status = endpoint.status - break - case EXCEPTION: - throw new Exception(EXCEPTION.body) - default: - throw new IllegalStateException("unexpected endpoint " + endpoint) - } - } - } - }, "/") - - server.start() - - return server - } - - void configureListener(NetworkListener listener) { - } - - @Override - Set> httpAttributes(ServerEndpoint endpoint) { - def attributes = super.httpAttributes(endpoint) - attributes.remove(HttpAttributes.HTTP_ROUTE) - attributes - } - - @Override - void stopServer(HttpServer server) { - server.stop() - } - - @Override - boolean hasResponseCustomizer(ServerEndpoint endpoint) { - true - } - - @Override - boolean testCapturedHttpHeaders() { - false - } - - @Override - boolean verifyServerSpanEndTime() { - // fails for redirect test - false - } - - @Override - boolean testErrorBody() { - false - } -} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java new file mode 100644 index 0000000000..0e6705839e --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java @@ -0,0 +1,236 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +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.REDIRECT; +import static java.nio.charset.Charset.defaultCharset; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.glassfish.grizzly.memory.Buffers.wrap; + +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.semconv.HttpAttributes; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Executors; +import org.glassfish.grizzly.Transport; +import org.glassfish.grizzly.filterchain.BaseFilter; +import org.glassfish.grizzly.filterchain.FilterChain; +import org.glassfish.grizzly.filterchain.FilterChainBuilder; +import org.glassfish.grizzly.filterchain.FilterChainContext; +import org.glassfish.grizzly.filterchain.NextAction; +import org.glassfish.grizzly.filterchain.TransportFilter; +import org.glassfish.grizzly.http.HttpContent; +import org.glassfish.grizzly.http.HttpHeader; +import org.glassfish.grizzly.http.HttpRequestPacket; +import org.glassfish.grizzly.http.HttpResponsePacket; +import org.glassfish.grizzly.http.HttpServerFilter; +import org.glassfish.grizzly.http.util.Parameters; +import org.glassfish.grizzly.nio.transport.TCPNIOTransport; +import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder; +import org.glassfish.grizzly.utils.DelayedExecutor; +import org.glassfish.grizzly.utils.IdleTimeoutFilter; +import org.junit.jupiter.api.extension.RegisterExtension; + +class GrizzlyFilterchainServerTest extends AbstractHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + private TCPNIOTransport transport; + + @Override + protected Transport setupServer() throws Exception { + FilterChain filterChain = setUpFilterChain(); + setUpTransport(filterChain); + + transport.bind("127.0.0.1", port); + transport.start(); + return transport; + } + + @Override + protected void stopServer(Transport transport) throws IOException { + transport.stop(); + } + + @Override + protected void configure(HttpServerTestOptions options) { + options.setHttpAttributes( + serverEndpoint -> { + Set> attributes = + new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); + attributes.remove(HttpAttributes.HTTP_ROUTE); + return attributes; + }); + + // justification: grizzly async closes the channel which + // looks like a ConnectException to the client when this happens + options.setTestException(false); + + options.setTestCaptureHttpHeaders(false); + + // server spans are ended inside of the controller spans + options.setVerifyServerSpanEndTime(false); + options.setTestErrorBody(false); + } + + private void setUpTransport(FilterChain filterChain) { + TCPNIOTransportBuilder transportBuilder = + TCPNIOTransportBuilder.newInstance().setOptimizedForMultiplexing(true); + + transportBuilder.setTcpNoDelay(true); + transportBuilder.setKeepAlive(false); + transportBuilder.setReuseAddress(true); + transportBuilder.setServerConnectionBackLog(50); + transportBuilder.setServerSocketSoTimeout(80000); + + transport = transportBuilder.build(); + transport.setProcessor(filterChain); + } + + @SuppressWarnings( + "deprecation") // Constructor has been deprecated in favor of builder pattern promised to be + // released in a next major release version, but it is not yet available. + private static FilterChain setUpFilterChain() { + return FilterChainBuilder.stateless() + .add(createTransportFilter()) + .add(createIdleTimeoutFilter()) + .add(new HttpServerFilter()) + .add(new LastFilter()) + .build(); + } + + private static TransportFilter createTransportFilter() { + return new TransportFilter(); + } + + private static IdleTimeoutFilter createIdleTimeoutFilter() { + return new IdleTimeoutFilter( + new DelayedExecutor(Executors.newCachedThreadPool()), 80000, MILLISECONDS); + } + + private static class LastFilter extends BaseFilter { + @Override + public NextAction handleRead(FilterChainContext ctx) throws IOException { + if (ctx.getMessage() instanceof HttpContent) { + HttpContent httpContent = ctx.getMessage(); + HttpHeader httpHeader = httpContent.getHttpHeader(); + if (httpHeader instanceof HttpRequestPacket) { + HttpRequestPacket request = (HttpRequestPacket) httpContent.getHttpHeader(); + ResponseParameters responseParameters = buildResponse(request); + HttpResponsePacket.Builder builder = + HttpResponsePacket.builder(request) + .status(responseParameters.getStatus()) + .header( + "Content-Length", + String.valueOf(responseParameters.getResponseBody().length)); + responseParameters.fillHeaders(builder); + HttpResponsePacket responsePacket = builder.build(); + controller( + responseParameters.getEndpoint(), + () -> { + responseParameters.execute(); + ctx.write( + HttpContent.builder(responsePacket) + .content(wrap(ctx.getMemoryManager(), responseParameters.getResponseBody())) + .build()); + return responsePacket; + }); + } + } + return ctx.getStopAction(); + } + + private static ResponseParameters buildResponse(HttpRequestPacket request) { + String uri = request.getRequestURI(); + Map headers = new HashMap<>(); + + ServerEndpoint endpoint = ServerEndpoint.forPath(uri); + Runnable closure = null; + if (endpoint == REDIRECT) { + headers.put("location", REDIRECT.getBody()); + } + if (endpoint == EXCEPTION) { + throw new IllegalArgumentException(EXCEPTION.getBody()); + } + if (endpoint == INDEXED_CHILD) { + Parameters parameters = new Parameters(); + parameters.setQuery(request.getQueryStringDC()); + parameters.setQueryStringEncoding(StandardCharsets.UTF_8); + parameters.handleQueryParameters(); + closure = + new Runnable() { + @Override + public void run() { + INDEXED_CHILD.collectSpanAttributes(parameters::getParameter); + } + }; + } + + int status = endpoint.getStatus(); + String responseBody = endpoint == REDIRECT ? "" : endpoint.getBody(); + + byte[] responseBodyBytes = responseBody.getBytes(defaultCharset()); + return new ResponseParameters(endpoint, status, responseBodyBytes, headers, closure); + } + } + + private static class ResponseParameters { + private final Map headers; + private final ServerEndpoint endpoint; + private final int status; + private final byte[] responseBody; + private final Runnable closure; + + ResponseParameters( + ServerEndpoint endpoint, + int status, + byte[] responseBody, + Map headers, + Runnable closure) { + this.endpoint = endpoint; + this.status = status; + this.responseBody = responseBody; + this.headers = headers; + this.closure = closure; + } + + int getStatus() { + return status; + } + + byte[] getResponseBody() { + return responseBody; + } + + ServerEndpoint getEndpoint() { + return endpoint; + } + + void fillHeaders(HttpResponsePacket.Builder builder) { + for (Map.Entry header : headers.entrySet()) { + builder.header(header.getKey(), header.getValue()); + } + } + + void execute() { + if (closure != null) { + closure.run(); + } + } + } +} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyIoStrategyTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyIoStrategyTest.java new file mode 100644 index 0000000000..2c2e12631e --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyIoStrategyTest.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +import org.glassfish.grizzly.IOStrategy; +import org.glassfish.grizzly.http.server.NetworkListener; + +abstract class GrizzlyIoStrategyTest extends GrizzlyTest { + + @Override + public void configureListener(NetworkListener listener) { + // Default in NIOTransportBuilder is WorkerThreadIOStrategy, so don't need to retest that. + listener.getTransport().setIOStrategy(strategy()); + } + + abstract IOStrategy strategy(); +} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java new file mode 100644 index 0000000000..dee567d5a9 --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java @@ -0,0 +1,121 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +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.NOT_FOUND; +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.semconv.HttpAttributes; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import org.glassfish.grizzly.http.server.HttpHandler; +import org.glassfish.grizzly.http.server.HttpServer; +import org.glassfish.grizzly.http.server.NetworkListener; +import org.glassfish.grizzly.http.server.Request; +import org.glassfish.grizzly.http.server.Response; +import org.glassfish.grizzly.http.server.ServerConfiguration; +import org.junit.jupiter.api.extension.RegisterExtension; + +abstract class GrizzlyTest extends AbstractHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected HttpServer setupServer() throws Exception { + HttpServer server = new HttpServer(); + NetworkListener listener = new NetworkListener("grizzly", "localhost", port); + configureListener(listener); + server.addListener(listener); + ServerConfiguration config = server.getServerConfiguration(); + config.addHttpHandler( + new HttpHandler() { + @Override + public void service(Request request, Response response) throws Exception { + ServerEndpoint endpoint = ServerEndpoint.forPath(request.getDecodedRequestURI()); + controller( + endpoint, + () -> { + if (endpoint.equals(SUCCESS)) { + try { + response.getWriter().write(endpoint.getBody()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (endpoint.equals(INDEXED_CHILD)) { + response.setStatus(endpoint.getStatus()); + endpoint.collectSpanAttributes(request::getParameter); + } else if (endpoint.equals(QUERY_PARAM)) { + response.setStatus(endpoint.getStatus()); + try { + response.getWriter().write(request.getQueryString()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (endpoint.equals(REDIRECT)) { + try { + response.sendRedirect(endpoint.getBody()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (endpoint.equals(ERROR)) { + try { + response.sendError(endpoint.getStatus(), endpoint.getBody()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (endpoint.equals(NOT_FOUND)) { + response.setStatus(endpoint.getStatus()); + } else if (endpoint.equals(EXCEPTION)) { + throw new IllegalArgumentException(EXCEPTION.getBody()); + } else { + throw new IllegalStateException("unexpected endpoint " + endpoint); + } + return response; + }); + } + }, + "/"); + + server.start(); + return server; + } + + protected abstract void configureListener(NetworkListener listener); + + @Override + protected void stopServer(HttpServer server) { + server.stop(); + } + + @Override + protected void configure(HttpServerTestOptions options) { + options.setHttpAttributes( + serverEndpoint -> { + Set> attributes = + new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); + attributes.remove(HttpAttributes.HTTP_ROUTE); + return attributes; + }); + options.setTestCaptureHttpHeaders(false); + options.setHasResponseCustomizer(serverEndpoint -> true); + options.setVerifyServerSpanEndTime(false); // fails for redirect test + options.setTestErrorBody(false); + options.setExpectedException(new IllegalArgumentException(EXCEPTION.getBody())); + } +} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/LeaderFollowerTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/LeaderFollowerTest.java new file mode 100644 index 0000000000..2818423b9b --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/LeaderFollowerTest.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +import org.glassfish.grizzly.IOStrategy; +import org.glassfish.grizzly.strategies.LeaderFollowerNIOStrategy; + +class LeaderFollowerTest extends GrizzlyIoStrategyTest { + + @Override + IOStrategy strategy() { + return LeaderFollowerNIOStrategy.getInstance(); + } +} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SameThreadTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SameThreadTest.java new file mode 100644 index 0000000000..37c7017c17 --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SameThreadTest.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +import org.glassfish.grizzly.IOStrategy; +import org.glassfish.grizzly.strategies.SameThreadIOStrategy; + +class SameThreadTest extends GrizzlyIoStrategyTest { + + @Override + IOStrategy strategy() { + return SameThreadIOStrategy.getInstance(); + } +} diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SimpleDynamicTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SimpleDynamicTest.java new file mode 100644 index 0000000000..223130d561 --- /dev/null +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/SimpleDynamicTest.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +import org.glassfish.grizzly.IOStrategy; +import org.glassfish.grizzly.strategies.SimpleDynamicNIOStrategy; + +class SimpleDynamicTest extends GrizzlyIoStrategyTest { + + @Override + IOStrategy strategy() { + return SimpleDynamicNIOStrategy.getInstance(); + } +}