From 65a8360e4c46d36439dcc5af855b620a1067aabd Mon Sep 17 00:00:00 2001 From: David Roden Date: Fri, 24 Jan 2025 20:24:54 +0100 Subject: [PATCH] =?utf8?q?=E2=9C=A8=20Run=20shutdown=20hook=20only=20when?= =?utf8?q?=20shutdown=20command=20is=20sent?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- server/src/main/java/de/qsheltier/msta/Server.java | 11 +++++++---- server/src/test/java/de/qsheltier/msta/ServerTest.java | 11 +++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/de/qsheltier/msta/Server.java b/server/src/main/java/de/qsheltier/msta/Server.java index 8176618..dce8b8b 100644 --- a/server/src/main/java/de/qsheltier/msta/Server.java +++ b/server/src/main/java/de/qsheltier/msta/Server.java @@ -78,12 +78,11 @@ public class Server implements Closeable { new Thread(() -> { try { startLatch.countDown(); - var socket = serverSocket.accept(); - handleSocket(socket.getInputStream(), socket.getOutputStream()); + try (var socket = serverSocket.accept()) { + handleSocket(socket.getInputStream(), socket.getOutputStream()); + } } catch (IOException e) { /* swallow exceptions. */ - } finally { - shutdownHook.run(); } }).start(); startLatch.await(); @@ -158,6 +157,10 @@ public class Server implements Closeable { }).start(); String line; while ((line = inputReader.readLine()) != null) { + if (line.equalsIgnoreCase("shutdown")) { + shutdownHook.run(); + break; + } } } finally { finished.set(true); diff --git a/server/src/test/java/de/qsheltier/msta/ServerTest.java b/server/src/test/java/de/qsheltier/msta/ServerTest.java index 3077005..480b90c 100644 --- a/server/src/test/java/de/qsheltier/msta/ServerTest.java +++ b/server/src/test/java/de/qsheltier/msta/ServerTest.java @@ -3,7 +3,9 @@ package de.qsheltier.msta; import java.awt.Frame; import java.awt.Window; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.TimeUnit; @@ -12,6 +14,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.function.ThrowingConsumer; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; @@ -41,11 +44,15 @@ public class ServerTest { @Test @Timeout(value = 5, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD) - public void serverRunsShutdownHookWhenConnectionIsClosed() throws Exception { + public void serverRunsShutdownHookWhenShutdownCommandIsSent() throws Exception { var shutdown = new AtomicBoolean(); try (var server = new Server(() -> shutdown.set(true))) { server.start(); - try (var ignored = new Socket("localhost", server.getPort())) { + try (var socket = new Socket("localhost", server.getPort()); + var writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), UTF_8))) { + writer.write("shutdown\n"); + writer.flush(); + Thread.yield(); } while (!shutdown.get()) { Thread.yield(); -- 2.7.4