From 640121f05a0457c812418a3843dec4af82b13ce4 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 30 May 2025 13:34:53 +0300 Subject: [PATCH] Work around flaky java http client http/2 tests --- .../javahttpclient/JavaHttpClientTest.java | 3 --- .../javahttpclient/JavaHttpClientTest.java | 3 --- .../javahttpclient/AbstractJavaHttpClientTest.java | 6 ++++++ .../testing/junit/http/HttpClientTestServer.java | 10 +++++++++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java index 0f7477ff0e36..97e3b9917b1d 100644 --- a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -11,8 +11,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import java.net.http.HttpClient; import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.condition.DisabledForJreRange; -import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.extension.RegisterExtension; public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { @@ -34,7 +32,6 @@ protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) } } - @DisabledForJreRange(min = JRE.JAVA_25) // flaky on jdk25-ea @Nested static class Http2ClientTest extends JavaHttpClientTest { diff --git a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java index 5ce092036eb3..e490d7134523 100644 --- a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -12,8 +12,6 @@ import java.net.http.HttpClient; import java.util.Collections; import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.condition.DisabledForJreRange; -import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.extension.RegisterExtension; public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { @@ -41,7 +39,6 @@ protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) } } - @DisabledForJreRange(min = JRE.JAVA_25) // flaky on jdk25-ea @Nested static class Http2ClientTest extends JavaHttpClientTest { diff --git a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java index 9c0c10b3c0c7..d87968b09208 100644 --- a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java +++ b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java @@ -45,6 +45,12 @@ public HttpRequest buildRequest(String method, URI uri, Map head HttpRequest.Builder requestBuilder = HttpRequest.newBuilder().uri(uri).method(method, HttpRequest.BodyPublishers.noBody()); headers.forEach(requestBuilder::header); + if (client.version() == HttpClient.Version.HTTP_2) { + // notify HttpClientTestServer that the request comes from java http client using http/2 so + // that the server can work around http/2 tests failing with java.io.IOException: RST_STREAM + // received + requestBuilder.header("java-http-client-http2", "true"); + } if (uri.toString().contains("/read-timeout")) { requestBuilder.timeout(READ_TIMEOUT); } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpClientTestServer.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpClientTestServer.java index 5f8e57217b73..014d03acbf68 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpClientTestServer.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpClientTestServer.java @@ -147,7 +147,15 @@ protected void configure(ServerBuilder sb) throws Exception { } span.startSpan().end(); - return delegate.serve(ctx, req); + // this header is set by java http client http/2 tests + // we delay the response a bit to ensure that client can send the full request before + // it receives the response + // this is a workaround for http/2 tests failing with java.io.IOException: RST_STREAM + // received + boolean delay = req.headers().get("java-http-client-http2") != null; + + HttpResponse response = delegate.serve(ctx, req); + return delay ? HttpResponse.delayed(response, Duration.ofMillis(10)) : response; }) .decorator(LoggingService.newDecorator()); }