♻️ Refactor connection input and output handling
authorDavid Roden <github-a8in@qsheltier.de>
Sat, 25 Jan 2025 23:11:52 +0000 (00:11 +0100)
committerDavid Roden <github-a8in@qsheltier.de>
Sat, 25 Jan 2025 23:13:29 +0000 (00:13 +0100)
server/src/test/java/de/qsheltier/msta/ServerTest.java

index 98ed56a..059160f 100644 (file)
@@ -4,12 +4,15 @@ import java.awt.Frame;
 import java.awt.Window;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
 
@@ -51,8 +54,7 @@ public class ServerTest {
                try (var server = new Server(() -> shutdown.set(true))) {
                        server.start();
                        createConnection(server, verifyConnectedEvent((reader, writer) -> {
-                               writer.write("shutdown\n");
-                               writer.flush();
+                               writer.accept("shutdown");
                                Thread.yield();
                        }));
                        while (!shutdown.get()) {
@@ -81,7 +83,7 @@ public class ServerTest {
                window.setVisible(true);
                try {
                        connectToServer(verifyConnectedEvent((reader, writer) -> {
-                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-window"))));
+                               assertThat(reader.get(), isJsonStringMatching(jsonObject().where("event", jsonText("new-window"))));
                        }));
                } finally {
                        window.setVisible(false);
@@ -95,23 +97,7 @@ public class ServerTest {
                frame.setVisible(true);
                try {
                        connectToServer(verifyConnectedEvent((reader, writer) -> {
-                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
-                       }));
-               } finally {
-                       frame.setVisible(false);
-               }
-       }
-
-       @Test
-       @Timeout(value = 5, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD)
-       public void serverSendsASingleEventWhenAFrameIsOpened() throws Throwable {
-               var frame = new Frame("Frame Title");
-               frame.setVisible(true);
-               try {
-                       connectToServer(verifyConnectedEvent((reader, writer) -> {
-                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
-                               Thread.sleep(1000);
-                               assertThat(reader.ready(), equalTo(false));
+                               assertThat(reader.get(), isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
                        }));
                } finally {
                        frame.setVisible(false);
@@ -128,25 +114,38 @@ public class ServerTest {
                }
        }
 
-       private static ThrowingBiConsumer<BufferedReader, BufferedWriter> verifyConnectedEvent(ThrowingBiConsumer<BufferedReader, BufferedWriter> connectionConsumer) {
+       private static ThrowingBiConsumer<Supplier<String>, Consumer<String>> verifyConnectedEvent(ThrowingBiConsumer<Supplier<String>, Consumer<String>> connectionConsumer) {
                return (reader, writer) -> {
-                       assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
+                       assertThat(reader.get(), isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
                        connectionConsumer.accept(reader, writer);
                };
        }
 
-       private static void connectToServer(ThrowingBiConsumer<BufferedReader, BufferedWriter> connectionConsumer) throws Exception {
+       private static void connectToServer(ThrowingBiConsumer<Supplier<String>, Consumer<String>> connectionConsumer) throws Exception {
                try (var server = new Server()) {
                        server.start();
                        createConnection(server, connectionConsumer);
                }
        }
 
-       private static void createConnection(Server server, ThrowingBiConsumer<BufferedReader, BufferedWriter> connectionConsumer) throws Exception {
+       private static void createConnection(Server server, ThrowingBiConsumer<Supplier<String>, Consumer<String>> connectionConsumer) throws Exception {
                try (var connection = new Socket("localhost", server.getPort());
                     var reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), UTF_8));
                     var writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), UTF_8))) {
-                       connectionConsumer.accept(reader, writer);
+                       connectionConsumer.accept(() -> {
+                               try {
+                                       return reader.readLine();
+                               } catch (IOException e) {
+                                       throw new RuntimeException(e);
+                               }
+                       }, line -> {
+                               try {
+                                       writer.write(line + "\r\n");
+                                       writer.flush();
+                               } catch (IOException e) {
+                                       throw new RuntimeException(e);
+                               }
+                       });
                }
        }