♻️ Extract methods to easier handle connections
authorDavid Roden <github-a8in@qsheltier.de>
Sat, 25 Jan 2025 22:30:48 +0000 (23:30 +0100)
committerDavid Roden <github-a8in@qsheltier.de>
Sat, 25 Jan 2025 22:30:48 +0000 (23:30 +0100)
server/src/test/java/de/qsheltier/msta/ServerTest.java

index aa7606b..98ed56a 100644 (file)
@@ -12,7 +12,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
-import org.junit.jupiter.api.function.ThrowingConsumer;
 
 import static com.spotify.hamcrest.jackson.JsonMatchers.isJsonStringMatching;
 import static com.spotify.hamcrest.jackson.JsonMatchers.jsonObject;
@@ -51,12 +50,11 @@ public class ServerTest {
                var shutdown = new AtomicBoolean();
                try (var server = new Server(() -> shutdown.set(true))) {
                        server.start();
-                       try (var socket = new Socket("localhost", server.getPort());
-                            var writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), UTF_8))) {
+                       createConnection(server, verifyConnectedEvent((reader, writer) -> {
                                writer.write("shutdown\n");
                                writer.flush();
                                Thread.yield();
-                       }
+                       }));
                        while (!shutdown.get()) {
                                Thread.yield();
                        }
@@ -82,10 +80,9 @@ public class ServerTest {
                var window = new Window(null);
                window.setVisible(true);
                try {
-                       connectToServerAndWaitForEvent(reader -> {
-                               var line = reader.readLine();
-                               assertThat(line, isJsonStringMatching(jsonObject().where("event", jsonText("new-window"))));
-                       });
+                       connectToServer(verifyConnectedEvent((reader, writer) -> {
+                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-window"))));
+                       }));
                } finally {
                        window.setVisible(false);
                }
@@ -97,10 +94,9 @@ public class ServerTest {
                var frame = new Frame("Frame Title");
                frame.setVisible(true);
                try {
-                       connectToServerAndWaitForEvent(reader -> {
-                               var line = reader.readLine();
-                               assertThat(line, isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
-                       });
+                       connectToServer(verifyConnectedEvent((reader, writer) -> {
+                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
+                       }));
                } finally {
                        frame.setVisible(false);
                }
@@ -112,11 +108,11 @@ public class ServerTest {
                var frame = new Frame("Frame Title");
                frame.setVisible(true);
                try {
-                       connectToServerAndWaitForEvent(reader -> {
-                               reader.readLine();
+                       connectToServer(verifyConnectedEvent((reader, writer) -> {
+                               assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("new-frame"))));
                                Thread.sleep(1000);
                                assertThat(reader.ready(), equalTo(false));
-                       });
+                       }));
                } finally {
                        frame.setVisible(false);
                }
@@ -127,28 +123,35 @@ public class ServerTest {
        public void serverCanHandleMultipleConnections() throws Exception {
                try (var server = new Server()) {
                        server.start();
-                       try (var connection = new Socket("localhost", server.getPort());
-                            var reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
-                               var line = reader.readLine();
-                               assertThat(line, isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
-                       }
-                       try (var connection = new Socket("localhost", server.getPort());
-                            var reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
-                               var line = reader.readLine();
-                               assertThat(line, isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
-                       }
+                       createConnection(server, verifyConnectedEvent(((reader, writer) -> {})));
+                       createConnection(server, verifyConnectedEvent(((reader, writer) -> {})));
                }
        }
 
-       private static void connectToServerAndWaitForEvent(ThrowingConsumer<BufferedReader> readerConsumer) throws Throwable {
+       private static ThrowingBiConsumer<BufferedReader, BufferedWriter> verifyConnectedEvent(ThrowingBiConsumer<BufferedReader, BufferedWriter> connectionConsumer) {
+               return (reader, writer) -> {
+                       assertThat(reader.readLine(), isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
+                       connectionConsumer.accept(reader, writer);
+               };
+       }
+
+       private static void connectToServer(ThrowingBiConsumer<BufferedReader, BufferedWriter> connectionConsumer) throws Exception {
                try (var server = new Server()) {
                        server.start();
-                       try (var connection = new Socket("localhost", server.getPort());
-                            var reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
-                               reader.readLine();
-                               readerConsumer.accept(reader);
-                       }
+                       createConnection(server, connectionConsumer);
                }
        }
 
+       private static void createConnection(Server server, ThrowingBiConsumer<BufferedReader, BufferedWriter> 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);
+               }
+       }
+
+       private interface ThrowingBiConsumer<A, B> {
+               void accept(A a, B b) throws Exception;
+       }
+
 }