From b1198e89d68bcd79f76d2c3c7a928a21900a3177 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 19 Feb 2026 16:24:57 +0100 Subject: [PATCH] Testing Method structure --- build.gradle | 7 +++++ .../java/dev/selimaj/session/Session.java | 8 ++++++ .../dev/selimaj/session/SessionListener.java | 27 ++++++++++++++++++ .../dev/selimaj/session/types/Method.java | 2 +- .../java/dev/selimaj/session/Methods.java | 18 ++++++++++++ .../java/dev/selimaj/session/SessionTest.java | 28 +++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/test/java/dev/selimaj/session/Methods.java create mode 100644 src/test/java/dev/selimaj/session/SessionTest.java diff --git a/build.gradle b/build.gradle index 420f39e..b80ae16 100644 --- a/build.gradle +++ b/build.gradle @@ -25,4 +25,11 @@ dependencies { implementation 'jakarta.websocket:jakarta.websocket-api:2.1.1' // WebSocket client runtime implementation 'org.glassfish.tyrus:tyrus-client:2.1.2' + + // For testing + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' +} + +test { + useJUnitPlatform() } diff --git a/src/main/java/dev/selimaj/session/Session.java b/src/main/java/dev/selimaj/session/Session.java index 72a8638..81d828f 100644 --- a/src/main/java/dev/selimaj/session/Session.java +++ b/src/main/java/dev/selimaj/session/Session.java @@ -7,6 +7,7 @@ import dev.selimaj.session.types.Message; import java.net.URI; import java.net.http.HttpClient; import java.net.http.WebSocket; +import java.util.concurrent.CompletableFuture; public final class Session { @@ -45,6 +46,13 @@ public final class Session { listener.notify(ws, method, data); } + public CompletableFuture request( + String method, + Req data, + Class resType) throws Exception { + return listener.request(ws, method, data, resType); + } + public void close() throws Exception { ws.sendClose(0, "Session closed"); } diff --git a/src/main/java/dev/selimaj/session/SessionListener.java b/src/main/java/dev/selimaj/session/SessionListener.java index 22d684e..4889ad4 100644 --- a/src/main/java/dev/selimaj/session/SessionListener.java +++ b/src/main/java/dev/selimaj/session/SessionListener.java @@ -4,6 +4,7 @@ import java.net.http.WebSocket; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,6 +17,7 @@ public class SessionListener implements WebSocket.Listener { private final ObjectMapper mapper = new ObjectMapper(); private final ConcurrentHashMap> pending = new ConcurrentHashMap<>(); + private final AtomicInteger id = new AtomicInteger(); @Override public CompletionStage onText(WebSocket ws, CharSequence data, boolean last) { @@ -73,4 +75,29 @@ public class SessionListener implements WebSocket.Listener { void notify(WebSocket ws, String method, Object data) throws Exception { send(ws, new Message.Notification(method, mapper.valueToTree(data))); } + + CompletableFuture request( + WebSocket ws, + String method, + Req data, + Class resType) throws Exception { + + int id = this.id.incrementAndGet(); + + CompletableFuture fut = new CompletableFuture<>(); + pending.put(id, fut); + + send(ws, new Message.Request( + id, + method, + mapper.valueToTree(data))); + + return fut.thenApply(json -> { + try { + return mapper.treeToValue(json, resType); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } } diff --git a/src/main/java/dev/selimaj/session/types/Method.java b/src/main/java/dev/selimaj/session/types/Method.java index cc3b4ee..8be06d6 100644 --- a/src/main/java/dev/selimaj/session/types/Method.java +++ b/src/main/java/dev/selimaj/session/types/Method.java @@ -3,5 +3,5 @@ package dev.selimaj.session.types; import com.fasterxml.jackson.databind.JsonNode; public interface Method { - String NAME = ""; + String getName(); } diff --git a/src/test/java/dev/selimaj/session/Methods.java b/src/test/java/dev/selimaj/session/Methods.java new file mode 100644 index 0000000..c13ae44 --- /dev/null +++ b/src/test/java/dev/selimaj/session/Methods.java @@ -0,0 +1,18 @@ +package dev.selimaj.session; + +import com.fasterxml.jackson.databind.node.TextNode; + +import dev.selimaj.session.types.Method; + +public class Methods { + public static class Data implements Method { + @Override + public String getName() { + return "data"; + } + + public static String getNameStatic() { + return "data"; + } + } +} diff --git a/src/test/java/dev/selimaj/session/SessionTest.java b/src/test/java/dev/selimaj/session/SessionTest.java new file mode 100644 index 0000000..972bd21 --- /dev/null +++ b/src/test/java/dev/selimaj/session/SessionTest.java @@ -0,0 +1,28 @@ +package dev.selimaj.session; + +import org.junit.jupiter.api.Test; + +public class SessionTest { + static void testRequest() throws Exception { + Session session = Session.connect("ws://localhost:8080/"); + + session.request(Methods.Data.getNameStatic(), "", String.class); + + System.out.println("test"); + + Thread.sleep(1000); + } + + @Test + void requestTest() throws Exception { + testRequest(); + } + + public static void main(String[] args) { + try { + testRequest(); + } catch (Exception e) { + e.printStackTrace(); + } + } +}