opentelemetry-java-instrume.../instrumentation/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/groovy/client/VertxHttpClientTest.groovy

98 lines
3.0 KiB
Groovy

/*
* 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.AbstractHttpClientTest
import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
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 spock.lang.Shared
import java.util.concurrent.CompletableFuture
class VertxHttpClientTest extends HttpClientTest<HttpClientRequest> 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
HttpClientRequest buildRequest(String method, URI uri, Map<String, String> headers) {
def request = httpClient.requestAbs(HttpMethod.valueOf(method), "$uri")
headers.each { request.putHeader(it.key, it.value) }
return request
}
CompletableFuture<Integer> sendRequest(HttpClientRequest request) {
CompletableFuture<Integer> future = new CompletableFuture<>()
request.handler { response ->
future.complete(response.statusCode())
}.exceptionHandler { throwable ->
future.completeExceptionally(throwable)
}
request.end()
return future
}
@Override
int sendRequest(HttpClientRequest request, String method, URI uri, Map<String, String> headers) {
// Vertx doesn't seem to provide any synchronous API so bridge through a callback
return sendRequest(request).get()
}
@Override
void sendRequestWithCallback(HttpClientRequest request, String method, URI uri, Map<String, String> headers, AbstractHttpClientTest.RequestResult 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
Set<AttributeKey<?>> httpAttributes(URI uri) {
def attributes = super.httpAttributes(uri)
attributes.remove(SemanticAttributes.HTTP_FLAVOR)
attributes.remove(SemanticAttributes.NET_PEER_NAME)
attributes.remove(SemanticAttributes.NET_PEER_PORT)
return attributes
}
@Override
SingleConnection createSingleConnection(String host, int port) {
//This test fails on Vert.x 3.0 and only works starting from 3.1
//Most probably due to https://github.com/eclipse-vertx/vert.x/pull/1126
boolean shouldRun = Boolean.getBoolean("testLatestDeps")
return shouldRun ? new VertxSingleConnection(host, port) : null
}
}