From a99e08f726ff96281956ff2f7e63c75e88243da8 Mon Sep 17 00:00:00 2001 From: lieght Date: Sat, 20 Sep 2025 18:32:34 +0200 Subject: [PATCH] Added TcpServerTest --- .../toop/backend/tictactoe/ParsedCommand.java | 6 + .../org/toop/frontend/ServerConnection.java | 4 +- .../java/org/toop/frontend/TcpClient.java | 4 +- .../java/org/toop/backend/TcpServerTest.java | 109 ++++++++++++++++++ 4 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 src/test/java/org/toop/backend/TcpServerTest.java diff --git a/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java b/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java index 6ed714d..5ff9615 100644 --- a/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java +++ b/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java @@ -202,6 +202,12 @@ public class ParsedCommand { } } } + + @Override + public String toString() { + return this.originalCommand; // TODO: Maybe return more info. + } + // // public ParsedCommand parseCommand(String command) { // return null; diff --git a/src/main/java/org/toop/frontend/ServerConnection.java b/src/main/java/org/toop/frontend/ServerConnection.java index e21eb05..cd5f8f3 100644 --- a/src/main/java/org/toop/frontend/ServerConnection.java +++ b/src/main/java/org/toop/frontend/ServerConnection.java @@ -76,7 +76,7 @@ public final class ServerConnection extends TcpClient implements Runnable { this.executor.shutdownNow(); } - private void inputLoop() { + void inputLoop() { logger.info("Starting {}:{} connection read", this.serverAddress, this.serverPort); try { while (running) { @@ -96,7 +96,7 @@ public final class ServerConnection extends TcpClient implements Runnable { } } - private void outputLoop() { + void outputLoop() { logger.info("Starting {}:{} connection write", this.serverAddress, this.serverPort); try { while (this.running) { diff --git a/src/main/java/org/toop/frontend/TcpClient.java b/src/main/java/org/toop/frontend/TcpClient.java index 2a3f9d9..5daa3bf 100644 --- a/src/main/java/org/toop/frontend/TcpClient.java +++ b/src/main/java/org/toop/frontend/TcpClient.java @@ -40,11 +40,11 @@ public abstract class TcpClient { this.socket.close(); } - private BufferedReader createIn() throws IOException { + BufferedReader createIn() throws IOException { return new BufferedReader(new InputStreamReader(this.socket.getInputStream())); } - private PrintWriter createOut() throws IOException { + PrintWriter createOut() throws IOException { return new PrintWriter(this.socket.getOutputStream(), true); } diff --git a/src/test/java/org/toop/backend/TcpServerTest.java b/src/test/java/org/toop/backend/TcpServerTest.java new file mode 100644 index 0000000..b016879 --- /dev/null +++ b/src/test/java/org/toop/backend/TcpServerTest.java @@ -0,0 +1,109 @@ +package org.toop.backend; + +import org.junit.jupiter.api.*; +import org.toop.backend.tictactoe.ParsedCommand; + +import java.io.*; +import java.net.Socket; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + +class TcpServerTest { + + static class TestTcpServer extends TcpServer { + public TestTcpServer(int port) throws IOException { + super(port); + } + + @Override + public void run() { + // Call super.run() in a separate thread if needed + super.run(); + } + } + + private TestTcpServer server; + private Thread serverThread; + private int port = 12345; + + @BeforeEach + void setup() throws IOException { + server = new TestTcpServer(port); + serverThread = new Thread(server::run); + serverThread.start(); + } + + @AfterEach + void teardown() { + server.stop(); + try { + serverThread.join(1000); + } catch (InterruptedException ignored) {} + } + + @Test + void testServerStartsAndStops() { + assertTrue(server.isRunning()); + server.stop(); + assertFalse(server.isRunning()); + } + + @Test + void testClientMessageEnqueued() throws IOException, InterruptedException { + Socket client = new Socket("localhost", port); + PrintWriter out = new PrintWriter(client.getOutputStream(), true); + + String message = "hello server"; + out.println(message); + + String received = server.receivedQueue.poll(1, TimeUnit.SECONDS); + assertEquals(message, received); + + client.close(); + } + + @Test + void testSendQueueSendsToClient() throws IOException, InterruptedException { + Socket client = new Socket("localhost", port); + BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); + + String msg = "test message"; + server.sendQueue.put(msg); + + // The server may need some time to deliver + String received = in.readLine(); + assertEquals(msg, received); + + client.close(); + } + +// @Test +// void testGetNewestCommand() throws InterruptedException { +// String command = "move 1 2"; +// server.receivedQueue.put(command); +// +// ParsedCommand parsed = server.getNewestCommand(); +// System.out.println(parsed); +// assertNotNull(parsed); +// assertEquals(command, parsed.returnMessage); TODO: Test later +// } + + @Test + void testMultipleClients() throws IOException, InterruptedException { + Socket client1 = new Socket("localhost", port); + Socket client2 = new Socket("localhost", port); + + PrintWriter out1 = new PrintWriter(client1.getOutputStream(), true); + PrintWriter out2 = new PrintWriter(client2.getOutputStream(), true); + + out1.println("msg1"); + out2.println("msg2"); + + assertEquals("msg1", server.receivedQueue.poll(1, TimeUnit.SECONDS)); + assertEquals("msg2", server.receivedQueue.poll(1, TimeUnit.SECONDS)); + + client1.close(); + client2.close(); + } +} \ No newline at end of file