Skip to content

Commit 9372443

Browse files
authored
Fix testLatestDeps for spring-webflux 7 (#15574)
1 parent bb926c0 commit 9372443

File tree

31 files changed

+1413
-812
lines changed

31 files changed

+1413
-812
lines changed

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,9 @@ dependencies {
6060
testLibrary("org.springframework.boot:spring-boot-starter-test:2.0.0.RELEASE")
6161
testLibrary("org.springframework.boot:spring-boot-starter-reactor-netty:2.0.0.RELEASE")
6262

63-
// tests don't work with spring boot 4 yet
64-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-webflux:3.+") // documented limitation
65-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-test:3.+") // documented limitation
66-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-reactor-netty:3.+") // documented limitation
63+
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-webflux:3.+") // see testing-webflux7 module
64+
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-test:3.+") // see testing-webflux7 module
65+
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-reactor-netty:3.+") // see testing-webflux7 module
6766
}
6867

6968
val latestDepTest = findProperty("testLatestDeps") as Boolean

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java

Lines changed: 2 additions & 741 deletions
Large diffs are not rendered by default.

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/base/DelayedControllerSpringWebFluxServerTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base;
77

8+
import io.opentelemetry.instrumentation.spring.webflux.server.AbstractControllerSpringWebFluxServerTest;
9+
import io.opentelemetry.instrumentation.spring.webflux.server.ServerTestController;
810
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
911
import java.time.Duration;
1012
import java.util.function.Supplier;
@@ -20,7 +22,7 @@
2022
* within a Mono map step, which follows a delay step. For exception endpoint, the exception is
2123
* thrown within the last map step.
2224
*/
23-
class DelayedControllerSpringWebFluxServerTest extends ControllerSpringWebFluxServerTest {
25+
class DelayedControllerSpringWebFluxServerTest extends AbstractControllerSpringWebFluxServerTest {
2426
@Override
2527
protected Class<?> getApplicationClass() {
2628
return Application.class;

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/base/DelayedHandlerSpringWebFluxServerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base;
77

8+
import io.opentelemetry.instrumentation.spring.webflux.server.AbstractHandlerSpringWebFluxServerTest;
89
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
910
import java.time.Duration;
1011
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -20,7 +21,7 @@
2021
* map step, which follows a delay step. For exception endpoint, the exception is thrown within the
2122
* last map step.
2223
*/
23-
class DelayedHandlerSpringWebFluxServerTest extends HandlerSpringWebFluxServerTest {
24+
class DelayedHandlerSpringWebFluxServerTest extends AbstractHandlerSpringWebFluxServerTest {
2425
@Override
2526
protected Class<?> getApplicationClass() {
2627
return Application.class;

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/base/ImmediateControllerSpringWebFluxServerTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base;
77

8+
import io.opentelemetry.instrumentation.spring.webflux.server.AbstractControllerSpringWebFluxServerTest;
9+
import io.opentelemetry.instrumentation.spring.webflux.server.ServerTestController;
810
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
911
import java.util.function.Supplier;
1012
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -20,7 +22,7 @@
2022
* <p>{@code Mono<String>} from a handler is already a fully constructed response with no deferred
2123
* actions. For exception endpoint, the exception is thrown within controller method scope.
2224
*/
23-
class ImmediateControllerSpringWebFluxServerTest extends ControllerSpringWebFluxServerTest {
25+
class ImmediateControllerSpringWebFluxServerTest extends AbstractControllerSpringWebFluxServerTest {
2426
@Override
2527
protected Class<?> getApplicationClass() {
2628
return Application.class;

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/base/ImmediateHandlerSpringWebFluxServerTest.java

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base;
77

8-
import static org.assertj.core.api.Assertions.assertThat;
9-
import static org.junit.jupiter.api.Assumptions.assumeTrue;
10-
8+
import io.opentelemetry.instrumentation.spring.webflux.server.AbstractImmediateHandlerSpringWebFluxServerTest;
119
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
12-
import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest;
13-
import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse;
14-
import org.junit.jupiter.api.Test;
1510
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
1611
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
1712
import org.springframework.context.annotation.Bean;
@@ -20,14 +15,8 @@
2015
import org.springframework.web.reactive.function.server.ServerResponse;
2116
import reactor.core.publisher.Mono;
2217

23-
/**
24-
* Tests the case where "controller" span is created within the route handler method scope, and the
25-
*
26-
* <p>{@code Mono<ServerResponse>} from a handler is already a fully constructed response with no
27-
* deferred actions. For exception endpoint, the exception is thrown within route handler method
28-
* scope.
29-
*/
30-
class ImmediateHandlerSpringWebFluxServerTest extends HandlerSpringWebFluxServerTest {
18+
class ImmediateHandlerSpringWebFluxServerTest
19+
extends AbstractImmediateHandlerSpringWebFluxServerTest {
3120
@Override
3221
protected Class<?> getApplicationClass() {
3322
return Application.class;
@@ -60,18 +49,4 @@ protected Mono<ServerResponse> wrapResponse(
6049
});
6150
}
6251
}
63-
64-
@Test
65-
void nestedPath() {
66-
assumeTrue(Boolean.getBoolean("testLatestDeps"));
67-
68-
String method = "GET";
69-
AggregatedHttpRequest request = request(NESTED_PATH, method);
70-
AggregatedHttpResponse response = client.execute(request).aggregate().join();
71-
assertThat(response.status().code()).isEqualTo(NESTED_PATH.getStatus());
72-
assertThat(response.contentUtf8()).isEqualTo(NESTED_PATH.getBody());
73-
assertResponseHasCustomizedHeaders(response, NESTED_PATH, null);
74-
75-
assertTheTraces(1, null, null, null, method, NESTED_PATH);
76-
}
7752
}

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/base/ServerTestRouteFactory.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base;
77

8-
import static io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server.base.SpringWebFluxServerTest.NESTED_PATH;
8+
import static io.opentelemetry.instrumentation.spring.webflux.server.AbstractSpringWebFluxServerTest.NESTED_PATH;
99
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
1010
import static org.springframework.web.reactive.function.server.RequestPredicates.path;
1111
import static org.springframework.web.reactive.function.server.RouterFunctions.nest;
@@ -106,12 +106,7 @@ public RouterFunction<ServerResponse> createRoutes() {
106106
path("/nestedPath"),
107107
nest(
108108
path("/hello"),
109-
route(
110-
path("/world"),
111-
request -> {
112-
ServerEndpoint endpoint = NESTED_PATH;
113-
return respond(endpoint, null, null, null);
114-
})));
109+
route(path("/world"), request -> respond(NESTED_PATH, null, null, null))));
115110
}
116111

117112
protected Mono<ServerResponse> respond(
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
plugins {
2+
id("otel.javaagent-testing")
3+
}
4+
5+
dependencies {
6+
testInstrumentation(project(":instrumentation:spring:spring-core-2.0:javaagent"))
7+
testInstrumentation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.0:javaagent"))
8+
testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent"))
9+
testInstrumentation(project(":instrumentation:reactor:reactor-3.1:javaagent"))
10+
testInstrumentation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent"))
11+
12+
testImplementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.0:testing"))
13+
testImplementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:testing"))
14+
15+
testImplementation("org.springframework.boot:spring-boot-starter-webflux:4.0.0")
16+
testImplementation("org.springframework:spring-web:7.0.0")
17+
testImplementation("org.springframework.boot:spring-boot-starter-test:4.0.0")
18+
testImplementation("org.springframework.boot:spring-boot-starter-reactor-netty:4.0.0")
19+
}
20+
21+
otelJava {
22+
minJavaVersionSupported.set(JavaVersion.VERSION_17)
23+
}
24+
25+
tasks.withType<Test>().configureEach {
26+
jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true")
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v7_0.client;
7+
8+
import io.opentelemetry.instrumentation.spring.webflux.client.AbstractSpringWebfluxClientInstrumentationTest;
9+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension;
11+
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions;
12+
import org.junit.jupiter.api.condition.OS;
13+
import org.junit.jupiter.api.extension.RegisterExtension;
14+
import org.springframework.web.reactive.function.client.WebClient;
15+
16+
class SpringWebfluxClientInstrumentationTest
17+
extends AbstractSpringWebfluxClientInstrumentationTest {
18+
19+
@RegisterExtension
20+
static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent();
21+
22+
@Override
23+
protected WebClient.Builder instrument(WebClient.Builder builder) {
24+
return builder;
25+
}
26+
27+
@Override
28+
protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
29+
super.configure(optionsBuilder);
30+
31+
// Disable remote connection tests on Windows due to reactor-netty creating extra spans
32+
if (OS.WINDOWS.isCurrentOs()) {
33+
optionsBuilder.setTestRemoteConnection(false);
34+
}
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v7_0.server;
7+
8+
import org.springframework.boot.reactor.netty.NettyReactiveWebServerFactory;
9+
import org.springframework.boot.test.context.SpringBootTest;
10+
import org.springframework.boot.test.context.TestConfiguration;
11+
import org.springframework.context.annotation.Bean;
12+
import reactor.netty.resources.LoopResources;
13+
import server.SpringWebFluxTestApplication;
14+
15+
/**
16+
* Run all Webflux tests under netty event loop having only 1 thread. Some of the bugs are better
17+
* visible in this setup because same thread is reused for different requests.
18+
*/
19+
@SpringBootTest(
20+
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
21+
classes = {
22+
SpringWebFluxTestApplication.class,
23+
SpringThreadedSpringWebfluxTest.ForceSingleThreadedNettyAutoConfiguration.class
24+
})
25+
class SpringThreadedSpringWebfluxTest extends SpringWebfluxTest {
26+
27+
@TestConfiguration
28+
static class ForceSingleThreadedNettyAutoConfiguration {
29+
@Bean
30+
NettyReactiveWebServerFactory nettyFactory() {
31+
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
32+
// Configure single-threaded event loop for Spring Boot 4
33+
factory.addServerCustomizers(
34+
server -> server.runOn(LoopResources.create("my-http", 1, true)));
35+
return factory;
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)