diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java index c012b3996da8..7465f205df5f 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java @@ -9,7 +9,6 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import client.VertxSingleConnection; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/client/VertxSingleConnection.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxSingleConnection.java similarity index 93% rename from instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/client/VertxSingleConnection.java rename to instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxSingleConnection.java index 9e7a90f82eb7..153c10ee42ff 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/client/VertxSingleConnection.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxSingleConnection.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package client; +package io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client; import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection; import io.vertx.core.Vertx; @@ -18,7 +18,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -public class VertxSingleConnection implements SingleConnection { +class VertxSingleConnection implements SingleConnection { private final HttpClient httpClient; private final String host; diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/groovy/client/VertxHttpClientTest.groovy b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/groovy/client/VertxHttpClientTest.groovy deleted file mode 100644 index 7901fc442df9..000000000000 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/groovy/client/VertxHttpClientTest.groovy +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package client - -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.base.HttpClientTest -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult -import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection -import io.vertx.core.Future -import io.vertx.core.Vertx -import io.vertx.core.VertxOptions -import io.vertx.core.http.HttpClientOptions -import io.vertx.core.http.HttpClientRequest -import io.vertx.core.http.HttpMethod -import io.vertx.core.http.RequestOptions -import spock.lang.Shared - -import java.util.concurrent.CompletableFuture - -class VertxHttpClientTest extends HttpClientTest> implements AgentTestTrait { - - @Shared - def vertx = Vertx.vertx(new VertxOptions()) - @Shared - def clientOptions = new HttpClientOptions().setConnectTimeout(CONNECT_TIMEOUT_MS) - @Shared - def httpClient = vertx.createHttpClient(clientOptions) - - @Override - Future buildRequest(String method, URI uri, Map headers) { - RequestOptions requestOptions = new RequestOptions() - .setMethod(HttpMethod.valueOf(method)) - .setAbsoluteURI(uri.toString()) - headers.each { requestOptions.putHeader(it.key, it.value) } - return httpClient.request(requestOptions) - } - - CompletableFuture sendRequest(Future request) { - CompletableFuture future = new CompletableFuture<>() - - request.compose { req -> - req.send().onComplete { asyncResult -> - if (asyncResult.succeeded()) { - future.complete(asyncResult.result().statusCode()) - } else { - future.completeExceptionally(asyncResult.cause()) - } - } - }.onFailure { throwable -> - future.completeExceptionally(throwable) - } - - return future - } - - @Override - int sendRequest(Future request, String method, URI uri, Map headers) { - // Vertx doesn't seem to provide any synchronous API so bridge through a callback - return sendRequest(request).get() - } - - @Override - void sendRequestWithCallback(Future request, String method, URI uri, Map headers, HttpClientResult requestResult) { - sendRequest(request).whenComplete { status, throwable -> - requestResult.complete({ status }, throwable) - } - } - - @Override - boolean testRedirects() { - false - } - - @Override - boolean testReusedRequest() { - // vertx requests can't be reused - false - } - - @Override - boolean testHttps() { - false - } - - @Override - boolean testReadTimeout() { - false - } - - @Override - String expectedClientSpanName(URI uri, String method) { - switch (uri.toString()) { - case "http://localhost:61/": // unopened port - case "http://192.0.2.1/": // non routable address - return "CONNECT" - default: - return super.expectedClientSpanName(uri, method) - } - } - - @Override - Set> httpAttributes(URI uri) { - switch (uri.toString()) { - case "http://localhost:61/": // unopened port - case "http://192.0.2.1/": // non routable address - return [] - } - return super.httpAttributes(uri) - } - - @Override - SingleConnection createSingleConnection(String host, int port) { - new VertxSingleConnection(host, port) - } -} diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxHttpClientTest.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxHttpClientTest.java new file mode 100644 index 000000000000..05e42f732565 --- /dev/null +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxHttpClientTest.java @@ -0,0 +1,123 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.client; + +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.AbstractHttpClientTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; +import io.vertx.core.Future; +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; +import io.vertx.core.http.HttpClient; +import io.vertx.core.http.HttpClientOptions; +import io.vertx.core.http.HttpClientRequest; +import io.vertx.core.http.HttpMethod; +import io.vertx.core.http.RequestOptions; +import java.net.URI; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.extension.RegisterExtension; + +class VertxHttpClientTest extends AbstractHttpClientTest> { + + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent(); + + private final HttpClient httpClient = buildClient(); + + private static HttpClient buildClient() { + Vertx vertx = Vertx.vertx(new VertxOptions()); + HttpClientOptions clientOptions = + new HttpClientOptions().setConnectTimeout(Math.toIntExact(CONNECTION_TIMEOUT.toMillis())); + return vertx.createHttpClient(clientOptions); + } + + @Override + public Future buildRequest( + String method, URI uri, Map headers) { + RequestOptions requestOptions = + new RequestOptions().setMethod(HttpMethod.valueOf(method)).setAbsoluteURI(uri.toString()); + headers.forEach(requestOptions::putHeader); + return httpClient.request(requestOptions); + } + + private static CompletableFuture sendRequest(Future request) { + CompletableFuture future = new CompletableFuture<>(); + + request + .compose( + req -> + req.send() + .onComplete( + asyncResult -> { + if (asyncResult.succeeded()) { + future.complete(asyncResult.result().statusCode()); + } else { + future.completeExceptionally(asyncResult.cause()); + } + })) + .onFailure(future::completeExceptionally); + + return future; + } + + @Override + public int sendRequest( + Future request, String method, URI uri, Map headers) + throws Exception { + // Vertx doesn't seem to provide any synchronous API so bridge through a callback + return sendRequest(request).get(30, TimeUnit.SECONDS); + } + + @Override + public void sendRequestWithCallback( + Future request, + String method, + URI uri, + Map headers, + HttpClientResult httpClientResult) { + sendRequest(request) + .whenComplete((status, throwable) -> httpClientResult.complete(() -> status, throwable)); + } + + @Override + protected void configure(HttpClientTestOptions.Builder optionsBuilder) { + optionsBuilder.disableTestRedirects(); + optionsBuilder.disableTestReusedRequest(); + optionsBuilder.disableTestHttps(); + optionsBuilder.disableTestReadTimeout(); + optionsBuilder.setHttpAttributes(VertxHttpClientTest::getHttpAttributes); + optionsBuilder.setExpectedClientSpanNameMapper(VertxHttpClientTest::getExpectedClientSpanName); + + optionsBuilder.setSingleConnectionFactory(VertxSingleConnection::new); + } + + private static Set> getHttpAttributes(URI uri) { + String uriString = uri.toString(); + // http://localhost:61/ => unopened port, http://192.0.2.1/ => non routable address + if ("http://localhost:61/".equals(uriString) || "http://192.0.2.1/".equals(uriString)) { + return emptySet(); + } + return HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES; + } + + private static String getExpectedClientSpanName(URI uri, String method) { + switch (uri.toString()) { + case "http://localhost:61/": // unopened port + case "http://192.0.2.1/": // non routable address + return "CONNECT"; + default: + return HttpClientTestOptions.DEFAULT_EXPECTED_CLIENT_SPAN_NAME_MAPPER.apply(uri, method); + } + } +} diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/client/VertxSingleConnection.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxSingleConnection.java similarity index 88% rename from instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/client/VertxSingleConnection.java rename to instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxSingleConnection.java index 562da8066a91..fe257ad2117a 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/client/VertxSingleConnection.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/client/VertxSingleConnection.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package client; +package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.client; import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection; import io.vertx.core.Future; @@ -18,7 +18,7 @@ import java.util.Objects; import java.util.concurrent.ExecutionException; -public class VertxSingleConnection implements SingleConnection { +class VertxSingleConnection implements SingleConnection { private final HttpClient httpClient; private final String host; @@ -41,7 +41,7 @@ public int doRequest(String path, Map headers) Future request = httpClient.request(requestOptions); HttpClientResponse response = - request.compose(req -> req.send()).toCompletionStage().toCompletableFuture().get(); + request.compose(HttpClientRequest::send).toCompletionStage().toCompletableFuture().get(); String responseId = response.getHeader(REQUEST_ID_HEADER); if (!requestId.equals(responseId)) {