Skip to content

Commit 68edd23

Browse files
committed
Add test for onOpen exception on WS Next
1 parent 04ffd18 commit 68edd23

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package io.quarkus.websockets.next.test.telemetry;
2+
3+
import static io.quarkus.websockets.next.test.telemetry.MetricsAsserter.assertServerConnectionOpeningFailedTotal;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import java.net.URI;
8+
import java.time.Duration;
9+
import java.util.List;
10+
11+
import jakarta.inject.Inject;
12+
13+
import org.awaitility.Awaitility;
14+
import org.jboss.shrinkwrap.api.asset.StringAsset;
15+
import org.junit.jupiter.api.Test;
16+
import org.junit.jupiter.api.extension.RegisterExtension;
17+
18+
import io.quarkus.builder.Version;
19+
import io.quarkus.logging.Log;
20+
import io.quarkus.maven.dependency.Dependency;
21+
import io.quarkus.test.QuarkusUnitTest;
22+
import io.quarkus.test.common.http.TestHTTPResource;
23+
import io.quarkus.websockets.next.OnError;
24+
import io.quarkus.websockets.next.OnOpen;
25+
import io.quarkus.websockets.next.WebSocket;
26+
import io.quarkus.websockets.next.WebSocketClient;
27+
import io.quarkus.websockets.next.WebSocketClientConnection;
28+
import io.quarkus.websockets.next.WebSocketConnector;
29+
import io.restassured.RestAssured;
30+
import io.restassured.response.ValidatableResponse;
31+
32+
public class MicrometerWebSocketsStandaloneTest {
33+
34+
@RegisterExtension
35+
public static final QuarkusUnitTest test = new QuarkusUnitTest()
36+
.withApplicationRoot(root -> root
37+
.addClasses(MetricsAsserter.class)
38+
.addAsResource(new StringAsset("""
39+
bounce-endpoint.prefix-responses=true
40+
quarkus.websockets-next.server.metrics.enabled=true
41+
quarkus.websockets-next.client.metrics.enabled=true
42+
"""), "application.properties"))
43+
.setForcedDependencies(
44+
List.of(Dependency.of("io.quarkus", "quarkus-micrometer-registry-prometheus-deployment",
45+
Version.getVersion())));
46+
47+
@Inject
48+
WebSocketConnector<ErroneousClient_OnConnectError> onConnectErrorClient;
49+
50+
@Inject
51+
WebSocketConnector<ErroneousClient_OnConnectErrorHandler> onConnectErrorHandlerClient;
52+
53+
@TestHTTPResource("/")
54+
URI baseUri;
55+
56+
static ValidatableResponse getMetrics() {
57+
return RestAssured.given().get("/q/metrics").then().statusCode(200);
58+
}
59+
60+
@Test
61+
public void testServerEndpoint_OnConnectionError() {
62+
WebSocketClientConnection connection = onConnectErrorClient.baseUri(baseUri).connectAndAwait();
63+
Awaitility.await().atMost(Duration.ofSeconds(2)).untilAsserted(() -> {
64+
// Connection closing is async and takes some time
65+
assertFalse(connection.isOpen(),
66+
"Runtime exception happened on server side and connection is still open");
67+
});
68+
69+
Awaitility.await().atMost(Duration.ofSeconds(5)).untilAsserted(() -> {
70+
getMetrics()
71+
.body(assertServerConnectionOpeningFailedTotal("/on-connect-error", 1));
72+
});
73+
}
74+
75+
@Test
76+
public void testServerEndpoint_OnConnectionErrorHandler() {
77+
WebSocketClientConnection connection = onConnectErrorHandlerClient.baseUri(baseUri).connectAndAwait();
78+
Awaitility.await().atMost(Duration.ofSeconds(2)).untilAsserted(() -> {
79+
// Connection closing will never close because there is an OnError handler.
80+
assertTrue(connection.isOpen(), "Should never close");
81+
});
82+
83+
Awaitility.await().atMost(Duration.ofSeconds(5)).untilAsserted(() -> {
84+
getMetrics()
85+
.body(assertServerConnectionOpeningFailedTotal("/on-connect-error-handler", 0));
86+
});
87+
}
88+
89+
// ----------------------- SERVERS -------------------------------
90+
91+
@WebSocket(path = "/on-connect-error")
92+
public static class OnConnectErrorEndpoint {
93+
94+
@OnOpen()
95+
public void onOpen() {
96+
Log.info("onOpen throwing exception");
97+
throw new RuntimeException("Crafted exception - Websocket failed to open");
98+
}
99+
}
100+
101+
@WebSocket(path = "/on-connect-error-handler")
102+
public static class OnConnectErrorHandlerEndpoint {
103+
104+
@OnOpen()
105+
public void onOpen() {
106+
Log.info("onOpen throwing exception");
107+
throw new RuntimeException("Crafted exception - Websocket failed to open");
108+
}
109+
110+
@OnError
111+
public void onError(Exception failure) {
112+
Log.warnv("Error handled: {0}", failure.getMessage());
113+
}
114+
}
115+
116+
// ------------------------- CLIENTS -------------------------------
117+
118+
@WebSocketClient(path = "/on-connect-error")
119+
public static class ErroneousClient_OnConnectError {
120+
121+
@OnOpen()
122+
public void onOpen() {
123+
Log.info("client onOpen");
124+
}
125+
}
126+
127+
@WebSocketClient(path = "/on-connect-error-handler")
128+
public static class ErroneousClient_OnConnectErrorHandler {
129+
130+
@OnOpen()
131+
public void onOpen() {
132+
Log.info("client onOpen");
133+
}
134+
}
135+
}

0 commit comments

Comments
 (0)