✨ Send shutdown event on termination
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 12 Dec 2019 19:24:48 +0000 (20:24 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 12 Dec 2019 19:24:48 +0000 (20:24 +0100)
src/main/java/net/pterodactylus/sone/main/SonePlugin.java
src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt [new file with mode: 0644]
src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt

index 91f21eb..ef9f05a 100644 (file)
@@ -110,6 +110,9 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr
        /** The core. */
        private Core core;
 
        /** The core. */
        private Core core;
 
+       /** The event bus. */
+       private EventBus eventBus;
+
        /** The web interface. */
        private WebInterface webInterface;
 
        /** The web interface. */
        private WebInterface webInterface;
 
@@ -212,7 +215,7 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr
                webInterface.start();
 
                /* send some events on startup */
                webInterface.start();
 
                /* send some events on startup */
-               EventBus eventBus = injector.getInstance(EventBus.class);
+               eventBus = injector.getInstance(EventBus.class);
 
                /* first start? */
                if (injector.getInstance(Key.get(Boolean.class, Names.named("FirstStart")))) {
 
                /* first start? */
                if (injector.getInstance(Key.get(Boolean.class, Names.named("FirstStart")))) {
@@ -247,6 +250,9 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr
         */
        @Override
        public void terminate() {
         */
        @Override
        public void terminate() {
+               /* send shutdown event. */
+               eventBus.post(new Shutdown());
+
                try {
                        /* stop the web interface. */
                        webInterface.stop();
                try {
                        /* stop the web interface. */
                        webInterface.stop();
diff --git a/src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt b/src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt
new file mode 100644 (file)
index 0000000..4bc2f61
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Sone - Shutdown.kt - Copyright © 2019 David ‘Bombe’ Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.core.event
+
+/**
+ * Event that signals the shutdown of Sone.
+ */
+class Shutdown
index c3f1cd7..b846522 100644 (file)
@@ -26,7 +26,7 @@ import kotlin.test.*
 @Dirty
 class SonePluginTest {
 
 @Dirty
 class SonePluginTest {
 
-       private val sonePlugin by lazy { SonePlugin { injector } }
+       private var sonePlugin = SonePlugin { injector }
        private val pluginRespirator = deepMock<PluginRespirator>()
        private val node = deepMock<Node>()
        private val clientCore = deepMock<NodeClientCore>()
        private val pluginRespirator = deepMock<PluginRespirator>()
        private val node = deepMock<Node>()
        private val clientCore = deepMock<NodeClientCore>()
@@ -76,7 +76,7 @@ class SonePluginTest {
 
        private fun runSonePluginWithRealInjector(injectorConsumer: (Injector) -> Unit = {}): Injector {
                lateinit var injector: Injector
 
        private fun runSonePluginWithRealInjector(injectorConsumer: (Injector) -> Unit = {}): Injector {
                lateinit var injector: Injector
-               val sonePlugin = SonePlugin {
+               sonePlugin = SonePlugin {
                        Guice.createInjector(*it).also {
                                injector = it
                                injectorConsumer(it)
                        Guice.createInjector(*it).also {
                                injector = it
                                injectorConsumer(it)
@@ -192,6 +192,24 @@ class SonePluginTest {
                assertThat(startupReceived.get(), equalTo(true))
        }
 
                assertThat(startupReceived.get(), equalTo(true))
        }
 
+       private class ShutdownListener(private val shutdownReceived: () -> Unit) {
+               @Subscribe
+               fun shutdown(shutdown: Shutdown) {
+                       shutdownReceived()
+               }
+       }
+
+       @Test
+       fun `shutdown event is sent to event bus on terminate`() {
+               val shutdownReceived = AtomicBoolean()
+               runSonePluginWithRealInjector {
+                       val eventBus = it.getInstance(EventBus::class.java)
+                       eventBus.register(ShutdownListener { shutdownReceived.set(true) })
+               }
+               sonePlugin.terminate()
+               assertThat(shutdownReceived.get(), equalTo(true))
+       }
+
        private fun <T> getInjected(clazz: Class<T>, annotation: Annotation? = null): T? =
                        injected[TypeLiteral.get(clazz) to annotation] as? T
 
        private fun <T> getInjected(clazz: Class<T>, annotation: Annotation? = null): T? =
                        injected[TypeLiteral.get(clazz) to annotation] as? T