You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2026/09/04 15:33:51 UTC
(unomi) 01/01: Cover the destroy() wiring that stops the WebSocket deadline scheduler
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch graphql-ws-scheduler-shutdown
in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 07ffe7f2d06c11a42b5646cd0a589610a7285c68
Author: Serge Huber <sh...@apache.org>
AuthorDate: Fri Sep 4 17:32:39 2026 +0200
Cover the destroy() wiring that stops the WebSocket deadline scheduler
The factory test only showed that shutdown() stops the executor; it would
still pass with the destroy() call removed, which is the wiring that was
broken. Add a servlet test that configures the servlet, destroys it and checks
the creator was shut down.
Co-Authored-By: Claude Opus 4.8 <no...@anthropic.com>
---
.../unomi/graphql/servlet/GraphQLServlet.java | 5 +++++
.../websocket/SubscriptionWebSocketFactory.java | 3 ++-
.../unomi/graphql/servlet/GraphQLServletTest.java | 21 +++++++++++++++++++++
3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/GraphQLServlet.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/GraphQLServlet.java
index 307a93baf..e4b3f88a8 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/GraphQLServlet.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/GraphQLServlet.java
@@ -110,6 +110,11 @@ public class GraphQLServlet extends WebSocketServlet {
private SubscriptionWebSocketFactory socketCreator;
+ /** For tests: the creator whose scheduler {@link #destroy()} must stop. */
+ SubscriptionWebSocketFactory socketCreator() {
+ return socketCreator;
+ }
+
@Override
public void destroy() {
try {
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/websocket/SubscriptionWebSocketFactory.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/websocket/SubscriptionWebSocketFactory.java
index 3ce1c4589..9dc5cc848 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/websocket/SubscriptionWebSocketFactory.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/servlet/websocket/SubscriptionWebSocketFactory.java
@@ -82,7 +82,8 @@ public class SubscriptionWebSocketFactory extends WebSocketServerFactory {
authenticationDeadlineScheduler.shutdownNow();
}
- boolean isShutdown() {
+ /** Whether {@link #shutdown()} has run; lets the servlet test verify the destroy() wiring. */
+ public boolean isShutdown() {
return authenticationDeadlineScheduler.isShutdown();
}
}
diff --git a/graphql/cxs-impl/src/test/java/org/apache/unomi/graphql/servlet/GraphQLServletTest.java b/graphql/cxs-impl/src/test/java/org/apache/unomi/graphql/servlet/GraphQLServletTest.java
index ce8f62904..a6dab3341 100644
--- a/graphql/cxs-impl/src/test/java/org/apache/unomi/graphql/servlet/GraphQLServletTest.java
+++ b/graphql/cxs-impl/src/test/java/org/apache/unomi/graphql/servlet/GraphQLServletTest.java
@@ -21,6 +21,8 @@ import org.apache.unomi.api.security.SecurityService;
import org.apache.unomi.api.services.ExecutionContextManager;
import org.apache.unomi.graphql.servlet.auth.GraphQLServletSecurityValidator;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.apache.unomi.graphql.schema.GraphQLSchemaUpdater;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -38,6 +40,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
@@ -261,4 +265,21 @@ class GraphQLServletTest {
nonUpgradeCalled.set(true);
}
}
+
+ /**
+ * The creator is only ever Jetty's WebSocketCreator, never a started lifecycle, so its scheduler is
+ * stopped from destroy(). This pins the wiring itself, not just that shutdown() works in isolation.
+ */
+ @Test
+ void destroy_shutsDownTheSocketCreatorScheduler() {
+ servlet.setGraphQLSchemaUpdater(mock(GraphQLSchemaUpdater.class));
+ when(factory.getPolicy()).thenReturn(mock(WebSocketPolicy.class));
+ servlet.configure(factory);
+ assertNotNull(servlet.socketCreator());
+ assertFalse(servlet.socketCreator().isShutdown());
+
+ servlet.destroy();
+
+ assertTrue(servlet.socketCreator().isShutdown());
+ }
}