Skip to content

Commit c458d88

Browse files
committed
Add framework:webclient-netty smoke test
See related spring-projects/spring-framework#31178 and spring-projects/spring-framework#31180 issues. Closes gh-20
1 parent a1aa13c commit c458d88

File tree

9 files changed

+195
-0
lines changed

9 files changed

+195
-0
lines changed

framework/webclient-netty/README.adoc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Tests if `WebClient` works with Reactor Netty.
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
id "java"
3+
id "org.springframework.boot"
4+
id "org.springframework.cr.smoke-test"
5+
}
6+
7+
dependencies {
8+
implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
9+
constraints {
10+
implementation("org.springframework:spring-web:6.1.0-SNAPSHOT")
11+
}
12+
implementation("org.springframework.boot:spring-boot-starter-webflux")
13+
implementation("org.crac:crac:$cracVersion")
14+
implementation(project(":cr-listener"))
15+
16+
testImplementation("org.springframework.boot:spring-boot-starter-test")
17+
18+
appTestImplementation(project(":cr-smoke-test-support"))
19+
appTestImplementation("org.awaitility:awaitility:4.2.0")
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
version: '3'
2+
services:
3+
httpbin:
4+
image: 'mccutchen/go-httpbin:v2.10.0'
5+
ports:
6+
- '8080'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.example.webclient;
2+
3+
import java.net.http.HttpClient;
4+
import java.time.Duration;
5+
6+
import org.awaitility.Awaitility;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable;
9+
10+
import org.springframework.cr.smoketest.support.assertj.AssertableOutput;
11+
import org.springframework.cr.smoketest.support.junit.ApplicationTest;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
@ApplicationTest
16+
class WebClientApplicationTests {
17+
18+
@Test
19+
@DisabledIfEnvironmentVariable(named = "CI", matches = "true", disabledReason = "HTTP is blocked on CI")
20+
void httpWorks(AssertableOutput output) {
21+
Awaitility.await()
22+
.atMost(Duration.ofSeconds(30))
23+
.untilAsserted(() -> assertThat(output)
24+
.hasLineMatching("http: DataDto\\{url='http:\\/\\/\\w+:\\d+\\/anything', method='GET'\\}"));
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.example.webclient;
2+
3+
public class DataDto {
4+
5+
private String url;
6+
7+
private String method;
8+
9+
public DataDto() {
10+
}
11+
12+
public String getUrl() {
13+
return url;
14+
}
15+
16+
public void setUrl(String url) {
17+
this.url = url;
18+
}
19+
20+
public String getMethod() {
21+
return method;
22+
}
23+
24+
public void setMethod(String method) {
25+
this.method = method;
26+
}
27+
28+
@Override
29+
public String toString() {
30+
return "DataDto{" + "url='" + url + '\'' + ", method='" + method + '\'' + '}';
31+
}
32+
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.example.webclient;
2+
3+
import java.time.Duration;
4+
import java.util.function.Supplier;
5+
6+
import org.springframework.boot.CommandLineRunner;
7+
import org.springframework.context.SmartLifecycle;
8+
import org.springframework.core.annotation.Order;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.web.reactive.function.client.WebClient;
11+
12+
@Component
13+
class DataRequester implements SmartLifecycle {
14+
15+
private final WebClient webClient;
16+
17+
private volatile boolean running = false;
18+
19+
DataRequester(WebClient webClient) {
20+
this.webClient = webClient;
21+
}
22+
23+
@Override
24+
public void start() {
25+
if (!isRunning()) {
26+
this.running = true;
27+
http();
28+
}
29+
}
30+
31+
@Override
32+
public void stop() {
33+
if (isRunning()) {
34+
this.running = false;
35+
}
36+
}
37+
38+
private void http() {
39+
try {
40+
DataDto dto = this.webClient.get()
41+
.uri("/anything")
42+
.retrieve()
43+
.bodyToMono(DataDto.class)
44+
.timeout(Duration.ofSeconds(10))
45+
.block();
46+
System.out.printf("http: %s%n", dto);
47+
}
48+
catch (Exception ex) {
49+
System.out.println("http failed:");
50+
ex.printStackTrace(System.out);
51+
}
52+
}
53+
54+
@Override
55+
public boolean isRunning() {
56+
return this.running;
57+
}
58+
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.example.webclient;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.WebApplicationType;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
public class WebClientApplication {
9+
10+
public static void main(String[] args) throws InterruptedException {
11+
SpringApplication application = new SpringApplication(WebClientApplication.class);
12+
application.setWebApplicationType(WebApplicationType.NONE);
13+
application.run(args);
14+
Thread.currentThread().join(); // To be able to measure memory consumption
15+
}
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.example.webclient;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.http.client.reactive.ClientHttpConnector;
6+
import org.springframework.util.StringUtils;
7+
import org.springframework.web.reactive.function.client.WebClient;
8+
9+
@Configuration(proxyBeanMethods = false)
10+
class WebClientConfiguration {
11+
12+
@Bean
13+
WebClient webClient(WebClient.Builder builder, ClientHttpConnector clientHttpConnector) {
14+
// TODO Check why run-dev-container.sh is broken by the commented line below
15+
//String host = env("HTTPBIN_HOST", "localhost");
16+
String host = "localhost";
17+
int port = env("HTTPBIN_PORT_8080", 8080);
18+
return builder.baseUrl("http://%s:%d/".formatted(host, port))
19+
.clientConnector(clientHttpConnector).build();
20+
}
21+
22+
private static String env(String name, String def) {
23+
String value = System.getenv(name);
24+
return StringUtils.hasLength(value) ? value : def;
25+
}
26+
27+
private static int env(String name, int def) {
28+
String value = System.getenv(name);
29+
return StringUtils.hasLength(value) ? Integer.parseInt(value) : def;
30+
}
31+
32+
}

framework/webclient-netty/src/main/resources/application.properties

Whitespace-only changes.

0 commit comments

Comments
 (0)