From d7258551942d4642384180ee548c0f1202057484 Mon Sep 17 00:00:00 2001 From: Jan Bartel Date: Thu, 9 Jun 2022 08:06:55 +1000 Subject: [PATCH] Issue #8088 Add STOP.EXIT System property to configure ShutdownMonitor.exitVm (#8133) * Issue #8088 Add STOP.EXIT System property to configure ShutdownMonitor.exitVm (#8089) * Issue #8088 Add STOP.EXIT System property to configure ShutdownMonitor.exitVM * Ensure missing STOP.EXIT doesn't override default exitVm=true * Disable another test * Disable test that might not work, depending on test execution order. --- .../eclipse/jetty/server/ShutdownMonitor.java | 8 +- .../jetty/server/ShutdownMonitorTest.java | 76 +++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java index bdfcd2a770c2..1ac0631530a7 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java @@ -30,6 +30,7 @@ import java.util.function.Predicate; import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.component.Destroyable; import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.thread.AutoLock; @@ -87,7 +88,7 @@ public static boolean isRegistered(LifeCycle lifeCycle) private final String host; private int port; private String key; - private boolean exitVm; + private boolean exitVm = true; private boolean alive; /** @@ -104,7 +105,8 @@ private ShutdownMonitor() this.host = System.getProperty("STOP.HOST", "127.0.0.1"); this.port = Integer.getInteger("STOP.PORT", -1); this.key = System.getProperty("STOP.KEY", null); - this.exitVm = true; + //only change the default exitVm setting if STOP.EXIT is explicitly set + this.exitVm = Boolean.valueOf(System.getProperty("STOP.EXIT", "true")); } private void addLifeCycles(LifeCycle... lifeCycles) @@ -305,6 +307,8 @@ private ServerSocket listen() // establish the port and key that are in use debug("STOP.PORT=%d", port); debug("STOP.KEY=%s", key); + //also show if we're exiting the jvm or not + debug("STOP.EXIT=%b", exitVm); } } diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ShutdownMonitorTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ShutdownMonitorTest.java index e93fdb783629..759886bd9d58 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ShutdownMonitorTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ShutdownMonitorTest.java @@ -27,6 +27,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -132,6 +133,81 @@ public void testStartStopDifferentPortDifferentKey() throws Exception assertTrue(!monitor.isAlive()); } + /* + * Disable these config tests because ShutdownMonitor is a + * static singleton that cannot be unset, and thus would + * need each of these methods executed it its own jvm - + * current surefire settings only fork for a single test + * class. + * + * Undisable to test individually as needed. + */ + @Disabled + @Test + public void testNoExitSystemProperty() throws Exception + { + System.setProperty("STOP.EXIT", "false"); + ShutdownMonitor monitor = ShutdownMonitor.getInstance(); + monitor.setPort(0); + assertFalse(monitor.isExitVm()); + monitor.start(); + + try (CloseableServer server = new CloseableServer()) + { + server.setStopAtShutdown(true); + server.start(); + + //shouldn't be registered for shutdown on jvm + assertTrue(ShutdownThread.isRegistered(server)); + assertTrue(ShutdownMonitor.isRegistered(server)); + + String key = monitor.getKey(); + int port = monitor.getPort(); + + stop("stop", port, key, true); + monitor.await(); + + assertTrue(!monitor.isAlive()); + assertTrue(server.stopped); + assertTrue(!server.destroyed); + assertTrue(!ShutdownThread.isRegistered(server)); + assertTrue(!ShutdownMonitor.isRegistered(server)); + } + } + + @Disabled + @Test + public void testExitVmDefault() throws Exception + { + //Test that the default is to exit + ShutdownMonitor monitor = ShutdownMonitor.getInstance(); + monitor.setPort(0); + assertTrue(monitor.isExitVm()); + } + + @Disabled + @Test + public void testExitVmTrue() throws Exception + { + //Test setting exit true + System.setProperty("STOP.EXIT", "true"); + ShutdownMonitor monitor = ShutdownMonitor.getInstance(); + monitor.setPort(0); + assertTrue(monitor.isExitVm()); + } + + @Disabled + @Test + public void testExitVmFalse() throws Exception + { + //Test setting exit false + System.setProperty("STOP.EXIT", "false"); + ShutdownMonitor monitor = ShutdownMonitor.getInstance(); + monitor.setPort(0); + assertFalse(monitor.isExitVm()); + } + + @Disabled @Test public void testForceStopCommand() throws Exception {