From c1123be7f8648769fa5f3171564f33602d44c0a3 Mon Sep 17 00:00:00 2001 From: Julien Vermillard Date: Mon, 2 Jan 2023 16:33:51 +0100 Subject: [PATCH] GH-1374: fix NPE on server.destroy() when queue mode is disabled --- .../server/californium/LeshanServer.java | 4 ++- .../server/californium/LeshanServerTest.java | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServer.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServer.java index 6181975431..357274eb7a 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServer.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServer.java @@ -404,7 +404,9 @@ public void destroy() { ((Stoppable) requestSender).stop(); } - presenceService.destroy(); + if (presenceService != null) { + presenceService.destroy(); + } LOG.info("LWM2M server destroyed."); } diff --git a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/LeshanServerTest.java b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/LeshanServerTest.java index c0740d1866..c18278e565 100644 --- a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/LeshanServerTest.java +++ b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/LeshanServerTest.java @@ -80,11 +80,34 @@ public void testStartStopDestroy() throws InterruptedException { assertEquals("All news created threads must be destroyed", numberOfThreadbefore, Thread.activeCount()); } + @Test + public void testStartStopDestroyQueueModeDisabled() throws InterruptedException { + // look at nb active thread before. + int numberOfThreadbefore = Thread.activeCount(); + + LeshanServer server = new LeshanServerBuilder().setLocalAddress(new InetSocketAddress(0)) + .disableQueueModeSupport().build(); + server.start(); + Thread.sleep(100); + // HACK force creation thread creation. + forceThreadsCreation(server); + Thread.sleep(100); + server.stop(); + Thread.sleep(100); + server.destroy(); + + // ensure all thread are destroyed + Thread.sleep(500); + assertEquals("All news created threads must be destroyed", numberOfThreadbefore, Thread.activeCount()); + } + private void forceThreadsCreation(LeshanServer server) { Registration reg = new Registration.Builder("id", "endpoint", Identity.unsecure(new InetSocketAddress(5555))) .bindingMode(BindingMode.UQ).build(); // Force timer thread creation of preference service. - ((PresenceServiceImpl) server.getPresenceService()).setAwake(reg); + if (server.getPresenceService() != null) { + ((PresenceServiceImpl) server.getPresenceService()).setAwake(reg); + } // Force time thread creation of CoapAsyncRequestObserver server.send(reg, new ReadRequest(3), new ResponseCallback() { @Override