Skip to content

Commit 49ddd93

Browse files
committed
Fix tests on Windows
1 parent 2cfa4d2 commit 49ddd93

File tree

26 files changed

+233
-63
lines changed

26 files changed

+233
-63
lines changed

instrumentation/akka/akka-http-10.0/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/akkahttp/AkkaHttpClientInstrumentationTest.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.{
2626
import java.net.URI
2727
import java.util
2828
import java.util.concurrent.Executor
29+
import org.junit.jupiter.api.condition.OS
2930
import org.junit.jupiter.api.extension.RegisterExtension
3031

3132
import java.util.function.BiFunction
@@ -119,6 +120,11 @@ class AkkaHttpClientInstrumentationTest
119120
): Unit = {
120121
options.disableTestRedirects()
121122
options.disableTestNonStandardHttpMethod()
123+
// On Windows, non-routable addresses timeout instead of failing fast, causing test timeout
124+
// before the HTTP client can create a span, resulting in only the parent span.
125+
if (OS.WINDOWS.isCurrentOs()) {
126+
options.disableTestRemoteConnection()
127+
}
122128
// singleConnection test would require instrumentation to support requests made through pools
123129
// (newHostConnectionPool, superPool, etc), which is currently not supported.
124130
options.setSingleConnectionFactory(

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.asynchttpclient.RequestBuilder;
2424
import org.asynchttpclient.Response;
2525
import org.asynchttpclient.uri.Uri;
26+
import org.junit.jupiter.api.condition.OS;
2627
import org.junit.jupiter.api.extension.RegisterExtension;
2728

2829
class AsyncHttpClientTest extends AbstractHttpClientTest<Request> {
@@ -97,5 +98,10 @@ public void onThrowable(Throwable throwable) {
9798
protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
9899
optionsBuilder.disableTestRedirects();
99100
optionsBuilder.spanEndsAfterBody();
101+
// On Windows, non-routable addresses timeout instead of failing fast, causing test timeout
102+
// before the HTTP client can create a span, resulting in only the parent span.
103+
if (OS.WINDOWS.isCurrentOs()) {
104+
optionsBuilder.disableTestRemoteConnection();
105+
}
100106
}
101107
}

instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/ClientTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.opentelemetry.javaagent.instrumentation.finaglehttp.v23_11.Utils.ClientType;
3535
import java.net.ConnectException;
3636
import java.net.URI;
37+
import java.nio.channels.ClosedChannelException;
3738
import java.util.Collections;
3839
import java.util.HashSet;
3940
import java.util.Locale;
@@ -143,7 +144,12 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
143144
.cause()
144145
.isInstanceOf(ConnectionFailedException.class)
145146
.cause()
146-
.isInstanceOf(ConnectException.class);
147+
// On Linux: ConnectException, On Windows: ClosedChannelException
148+
.satisfies(
149+
cause -> {
150+
assertThat(cause)
151+
.isInstanceOfAny(ConnectException.class, ClosedChannelException.class);
152+
});
147153
error = error.getCause().getCause().getCause();
148154
} else if (uri.getPath().endsWith("/read-timeout")) {
149155
// not a connect() exception like the above, so is not wrapped as above;

instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.junit.jupiter.api.AfterAll;
5757
import org.junit.jupiter.api.BeforeAll;
5858
import org.junit.jupiter.api.Test;
59+
import org.junit.jupiter.api.condition.OS;
5960

6061
@SuppressWarnings("deprecation") // using deprecated semconv
6162
class LettuceAsyncClientTest extends AbstractLettuceClientTest {
@@ -149,6 +150,11 @@ void testConnectExceptionInsideTheConnectionFuture() {
149150

150151
assertThat(exception).isInstanceOf(ExecutionException.class);
151152

153+
// Windows includes "getsockopt: " in the connection refused message
154+
String windowsGetsockopt = OS.WINDOWS.isCurrentOs() ? "getsockopt: " : "";
155+
String expectedMessage =
156+
"Connection refused: " + windowsGetsockopt + host + "/" + ip + ":" + incorrectPort;
157+
152158
testing.waitAndAssertTraces(
153159
trace ->
154160
trace.hasSpansSatisfyingExactly(
@@ -171,12 +177,7 @@ void testConnectExceptionInsideTheConnectionFuture() {
171177
"io.netty.channel.AbstractChannel.AnnotatedConnectException"),
172178
equalTo(
173179
AttributeKey.stringKey("exception.message"),
174-
"Connection refused: "
175-
+ host
176-
+ "/"
177-
+ ip
178-
+ ":"
179-
+ incorrectPort),
180+
expectedMessage),
180181
satisfies(
181182
AttributeKey.stringKey("exception.stacktrace"),
182183
val -> val.isNotNull())))));

instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.junit.jupiter.api.AfterAll;
3333
import org.junit.jupiter.api.BeforeAll;
3434
import org.junit.jupiter.api.Test;
35+
import org.junit.jupiter.api.condition.OS;
3536

3637
@SuppressWarnings("deprecation") // using deprecated semconv
3738
class LettuceSyncClientTest extends AbstractLettuceClientTest {
@@ -109,6 +110,11 @@ void testConnectException() {
109110

110111
assertThat(exception).isInstanceOf(RedisConnectionException.class);
111112

113+
// Windows includes "getsockopt: " in the connection refused message
114+
String windowsGetsockopt = OS.WINDOWS.isCurrentOs() ? "getsockopt: " : "";
115+
String expectedMessage =
116+
"Connection refused: " + windowsGetsockopt + host + "/" + ip + ":" + incorrectPort;
117+
112118
testing.waitAndAssertTraces(
113119
trace ->
114120
trace.hasSpansSatisfyingExactly(
@@ -131,12 +137,7 @@ void testConnectException() {
131137
"io.netty.channel.AbstractChannel.AnnotatedConnectException"),
132138
equalTo(
133139
AttributeKey.stringKey("exception.message"),
134-
"Connection refused: "
135-
+ host
136-
+ "/"
137-
+ ip
138-
+ ":"
139-
+ incorrectPort),
140+
expectedMessage),
140141
satisfies(
141142
AttributeKey.stringKey("exception.stacktrace"),
142143
val -> val.isNotNull())))));

instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/Netty38ClientTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.Map;
3232
import java.util.Set;
3333
import org.junit.jupiter.api.BeforeEach;
34+
import org.junit.jupiter.api.condition.OS;
3435
import org.junit.jupiter.api.extension.RegisterExtension;
3536

3637
class Netty38ClientTest extends AbstractHttpClientTest<Request> {
@@ -139,6 +140,11 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
139140
optionsBuilder.disableTestHttps();
140141
optionsBuilder.disableTestReadTimeout();
141142

143+
// On Windows, non-routable addresses behave differently, causing test failures.
144+
if (OS.WINDOWS.isCurrentOs()) {
145+
optionsBuilder.disableTestRemoteConnection();
146+
}
147+
142148
optionsBuilder.setExpectedClientSpanNameMapper(
143149
(uri, method) -> {
144150
// unopened port or non routable address

instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.util.concurrent.TimeUnit;
4040
import org.jetbrains.annotations.NotNull;
4141
import org.junit.jupiter.api.AfterAll;
42+
import org.junit.jupiter.api.condition.OS;
4243
import org.junit.jupiter.api.extension.RegisterExtension;
4344

4445
class Netty40ClientTest extends AbstractHttpClientTest<DefaultFullHttpRequest> {
@@ -141,6 +142,10 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
141142

142143
optionsBuilder.setExpectedClientSpanNameMapper(Netty40ClientTest::expectedClientSpanName);
143144
optionsBuilder.setHttpAttributes(Netty40ClientTest::httpAttributes);
145+
// On Windows, non-routable addresses behave differently, causing test failures.
146+
if (OS.WINDOWS.isCurrentOs()) {
147+
optionsBuilder.disableTestRemoteConnection();
148+
}
144149
}
145150

146151
private static int getPort(URI uri) {

instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ClientTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.concurrent.TimeUnit;
3131
import java.util.concurrent.TimeoutException;
3232
import org.junit.jupiter.api.Test;
33+
import org.junit.jupiter.api.condition.OS;
3334

3435
public abstract class AbstractNetty41ClientTest
3536
extends AbstractHttpClientTest<DefaultFullHttpRequest> {
@@ -113,6 +114,11 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
113114

114115
optionsBuilder.disableTestRedirects();
115116
optionsBuilder.spanEndsAfterBody();
117+
// On Windows, non-routable addresses behave differently (SSL handshake vs CONNECT span,
118+
// or no error thrown), causing platform-specific test failures.
119+
if (OS.WINDOWS.isCurrentOs()) {
120+
optionsBuilder.disableTestRemoteConnection();
121+
}
116122
}
117123

118124
private static Set<AttributeKey<?>> getHttpAttributes(URI uri) {

instrumentation/powerjob-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobBasicProcessorTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.util.List;
2424
import javax.sql.DataSource;
2525
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.condition.DisabledOnOs;
27+
import org.junit.jupiter.api.condition.OS;
2628
import org.junit.jupiter.api.extension.RegisterExtension;
2729
import tech.powerjob.official.processors.impl.FileCleanupProcessor;
2830
import tech.powerjob.official.processors.impl.HttpProcessor;
@@ -172,6 +174,7 @@ void testMapReduceProcessor() throws Exception {
172174
});
173175
}
174176

177+
@DisabledOnOs(value = OS.WINDOWS, disabledReason = "ShellProcessor requires /bin/sh")
175178
@Test
176179
void testShellProcessor() throws Exception {
177180
long jobId = 1;

instrumentation/ratpack/ratpack-1.4/testing/src/main/java/io/opentelemetry/instrumentation/ratpack/client/AbstractRatpackHttpClientTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
141141
// these tests will pass, but they don't really test anything since REQUEST is Void
142142
optionsBuilder.disableTestReusedRequest();
143143

144+
// Connection error tests fail on Windows due to different exception handling by Netty
145+
// even with the unwrapping and error mapping logic above
146+
if (OS.WINDOWS.isCurrentOs()) {
147+
optionsBuilder.disableTestConnectionFailure();
148+
optionsBuilder.disableTestRemoteConnection();
149+
}
150+
144151
optionsBuilder.spanEndsAfterBody();
145152
}
146153

@@ -169,6 +176,15 @@ protected boolean useNettyClientAttributes() {
169176
}
170177

171178
private static Throwable nettyClientSpanErrorMapper(URI uri, Throwable exception) {
179+
// On Windows, Netty wraps exceptions in AbstractChannel.AnnotatedConnectException
180+
// Unwrap to get the actual exception type
181+
if (OS.WINDOWS.isCurrentOs()
182+
&& exception != null
183+
&& exception.getClass().getName().contains("AnnotatedConnectException")
184+
&& exception.getCause() != null) {
185+
exception = exception.getCause();
186+
}
187+
172188
if (uri.toString().equals("https://192.0.2.1/")) {
173189
return new ConnectTimeoutException(
174190
"connection timed out"

0 commit comments

Comments
 (0)