Skip to content

Commit 323ba29

Browse files
authored
Merge pull request #44442 from mkouba/issue-44434
WebSockets Next: add integration test module
2 parents 3f10e98 + 3c955f4 commit 323ba29

File tree

7 files changed

+224
-2
lines changed

7 files changed

+224
-2
lines changed

.github/native-tests.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@
9292
},
9393
{
9494
"category": "HTTP",
95-
"timeout": 120,
96-
"test-modules": "elytron-resteasy, resteasy-jackson, elytron-resteasy-reactive, resteasy-mutiny, resteasy-reactive-kotlin/standard, vertx, vertx-http, vertx-web, vertx-http-compressors/all, vertx-http-compressors/some, vertx-web-jackson, vertx-graphql, virtual-http, rest-client, rest-client-reactive, rest-client-reactive-stork, rest-client-reactive-multipart, websockets, management-interface, management-interface-auth, mutiny-native-jctools",
95+
"timeout": 130,
96+
"test-modules": "elytron-resteasy, resteasy-jackson, elytron-resteasy-reactive, resteasy-mutiny, resteasy-reactive-kotlin/standard, vertx, vertx-http, vertx-web, vertx-http-compressors/all, vertx-http-compressors/some, vertx-web-jackson, vertx-graphql, virtual-http, rest-client, rest-client-reactive, rest-client-reactive-stork, rest-client-reactive-multipart, websockets, websockets-next, management-interface, management-interface-auth, mutiny-native-jctools",
9797
"os-name": "ubuntu-latest"
9898
},
9999
{

integration-tests/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
<module>vertx</module>
235235
<module>vertx-kotlin</module>
236236
<module>websockets</module>
237+
<module>websockets-next</module>
237238
<module>spring-di</module>
238239
<module>spring-web</module>
239240
<module>spring-data-jpa</module>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<artifactId>quarkus-integration-tests-parent</artifactId>
9+
<groupId>io.quarkus</groupId>
10+
<version>999-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>quarkus-integration-test-websockets-next</artifactId>
14+
<name>Quarkus - Integration Tests - WebSockets Next</name>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>io.quarkus</groupId>
19+
<artifactId>quarkus-websockets-next</artifactId>
20+
</dependency>
21+
22+
<dependency>
23+
<groupId>io.quarkus</groupId>
24+
<artifactId>quarkus-junit5</artifactId>
25+
<scope>test</scope>
26+
</dependency>
27+
28+
<!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
29+
<dependency>
30+
<groupId>io.quarkus</groupId>
31+
<artifactId>quarkus-websockets-next-deployment</artifactId>
32+
<version>${project.version}</version>
33+
<type>pom</type>
34+
<scope>test</scope>
35+
<exclusions>
36+
<exclusion>
37+
<groupId>*</groupId>
38+
<artifactId>*</artifactId>
39+
</exclusion>
40+
</exclusions>
41+
</dependency>
42+
</dependencies>
43+
44+
<build>
45+
<plugins>
46+
<plugin>
47+
<groupId>io.quarkus</groupId>
48+
<artifactId>quarkus-maven-plugin</artifactId>
49+
<executions>
50+
<execution>
51+
<goals>
52+
<goal>build</goal>
53+
</goals>
54+
</execution>
55+
</executions>
56+
</plugin>
57+
</plugins>
58+
</build>
59+
60+
</project>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.quarkus.websockets;
2+
3+
import io.quarkus.runtime.annotations.RegisterForReflection;
4+
import io.quarkus.websockets.next.OnClose;
5+
import io.quarkus.websockets.next.OnOpen;
6+
import io.quarkus.websockets.next.OnTextMessage;
7+
import io.quarkus.websockets.next.PathParam;
8+
import io.quarkus.websockets.next.WebSocket;
9+
import io.quarkus.websockets.next.WebSocketConnection;
10+
11+
@WebSocket(path = "/chat/{username}")
12+
public class ChatServer {
13+
14+
public enum MessageType {
15+
USER_JOINED,
16+
USER_LEFT,
17+
CHAT_MESSAGE
18+
}
19+
20+
@RegisterForReflection
21+
public record ChatMessage(MessageType type, String from, String message) {
22+
}
23+
24+
@OnOpen(broadcast = true)
25+
public ChatMessage onOpen(@PathParam String username) {
26+
return new ChatMessage(MessageType.USER_JOINED, username, "Hello!");
27+
}
28+
29+
@OnClose
30+
public void onClose(WebSocketConnection connection) {
31+
connection.broadcast()
32+
.sendTextAndAwait(new ChatMessage(MessageType.USER_LEFT, connection.pathParam("username"), "Bye!"));
33+
}
34+
35+
@OnTextMessage(broadcast = true)
36+
public ChatMessage onMessage(ChatMessage message) {
37+
return message;
38+
}
39+
40+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.quarkus.websockets;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.net.URI;
6+
import java.util.concurrent.LinkedBlockingDeque;
7+
import java.util.concurrent.TimeUnit;
8+
9+
import jakarta.inject.Inject;
10+
11+
import org.junit.jupiter.api.Test;
12+
13+
import io.quarkus.test.common.http.TestHTTPResource;
14+
import io.quarkus.test.junit.QuarkusTest;
15+
import io.quarkus.websockets.ChatServer.ChatMessage;
16+
import io.quarkus.websockets.ChatServer.MessageType;
17+
import io.quarkus.websockets.next.OnTextMessage;
18+
import io.quarkus.websockets.next.WebSocketClient;
19+
import io.quarkus.websockets.next.WebSocketClientConnection;
20+
import io.quarkus.websockets.next.WebSocketConnector;
21+
22+
@QuarkusTest
23+
public class ChatClientTest {
24+
25+
private static final LinkedBlockingDeque<ChatMessage> MESSAGES = new LinkedBlockingDeque<>();
26+
27+
@TestHTTPResource("/")
28+
URI uri;
29+
30+
@Inject
31+
WebSocketConnector<ChatClient> connector;
32+
33+
@Test
34+
public void testWebsocketChat() throws Exception {
35+
WebSocketClientConnection connection = connector
36+
.baseUri(uri)
37+
.pathParam("username", "Tom")
38+
.connectAndAwait();
39+
assertEquals(new ChatMessage(MessageType.USER_JOINED, "Tom", "Hello!"), MESSAGES.poll(10, TimeUnit.SECONDS));
40+
connection.sendTextAndAwait(new ChatMessage(MessageType.CHAT_MESSAGE, "Tom", "Ping"));
41+
assertEquals(new ChatMessage(MessageType.CHAT_MESSAGE, "Tom", "Ping"), MESSAGES.poll(10, TimeUnit.SECONDS));
42+
connection.closeAndAwait();
43+
}
44+
45+
@WebSocketClient(path = "/chat/{username}")
46+
public static class ChatClient {
47+
48+
@OnTextMessage
49+
void message(ChatMessage message) {
50+
MESSAGES.add(message);
51+
}
52+
53+
}
54+
55+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.quarkus.websockets;
2+
3+
import io.quarkus.test.junit.QuarkusIntegrationTest;
4+
5+
@QuarkusIntegrationTest
6+
public class ChatIT extends ChatTest {
7+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.quarkus.websockets;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.net.URI;
7+
import java.util.List;
8+
import java.util.concurrent.CopyOnWriteArrayList;
9+
import java.util.concurrent.CountDownLatch;
10+
import java.util.concurrent.TimeUnit;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
import io.quarkus.test.common.http.TestHTTPResource;
15+
import io.quarkus.test.junit.QuarkusTest;
16+
import io.quarkus.websockets.ChatServer.ChatMessage;
17+
import io.quarkus.websockets.ChatServer.MessageType;
18+
import io.vertx.core.Vertx;
19+
import io.vertx.core.http.WebSocketClient;
20+
import io.vertx.core.http.WebSocketConnectOptions;
21+
import io.vertx.core.json.Json;
22+
23+
@QuarkusTest
24+
public class ChatTest {
25+
26+
@TestHTTPResource("/chat/Tom")
27+
URI uri;
28+
29+
@Test
30+
public void testWebsocketChat() throws Exception {
31+
CountDownLatch messageLatch = new CountDownLatch(2);
32+
List<ChatMessage> messages = new CopyOnWriteArrayList<>();
33+
Vertx vertx = Vertx.vertx();
34+
WebSocketClient client = vertx.createWebSocketClient();
35+
try {
36+
client.connect(new WebSocketConnectOptions()
37+
.setHost(uri.getHost())
38+
.setPort(uri.getPort())
39+
.setURI(uri.getPath()))
40+
.onSuccess(
41+
ws -> {
42+
ws.textMessageHandler(m -> {
43+
messages.add(Json.decodeValue(m, ChatMessage.class));
44+
messageLatch.countDown();
45+
});
46+
ws.writeTextMessage(Json.encode(new ChatMessage(MessageType.CHAT_MESSAGE, "Tom", "Ping")));
47+
});
48+
assertTrue(messageLatch.await(10, TimeUnit.SECONDS), messageLatch.toString());
49+
assertEquals(new ChatMessage(MessageType.USER_JOINED, "Tom", "Hello!"),
50+
messages.get(0));
51+
assertEquals(new ChatMessage(MessageType.CHAT_MESSAGE, "Tom", "Ping"),
52+
messages.get(1));
53+
} finally {
54+
client.close().toCompletionStage().toCompletableFuture().get(5, TimeUnit.SECONDS);
55+
vertx.close();
56+
}
57+
}
58+
59+
}

0 commit comments

Comments
 (0)