X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fmain%2FSonePluginTest.kt;h=5795285cd959852c3060fec6c3b5cab57a32596a;hb=d33e7e73ccdc7a1ed8b32b13bbe12f84aa076e6b;hp=6d57b9fed30caf96b422201fd559393979b8a93f;hpb=03cec6a6772c2d836d94864adddaf544cbe9d72f;p=Sone.git diff --git a/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt b/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt index 6d57b9f..5795285 100644 --- a/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt @@ -1,19 +1,32 @@ package net.pterodactylus.sone.main -import freenet.client.async.USKManager -import freenet.l10n.BaseL10n.LANGUAGE.ENGLISH -import freenet.node.Node -import freenet.node.NodeClientCore -import freenet.pluginmanager.PluginRespirator +import com.google.common.eventbus.* +import com.google.inject.* +import freenet.client.async.* +import freenet.l10n.BaseL10n.LANGUAGE.* +import freenet.node.* +import freenet.pluginmanager.* +import net.pterodactylus.sone.core.* +import net.pterodactylus.sone.core.event.* +import net.pterodactylus.sone.fcp.* +import net.pterodactylus.sone.freenet.wot.* import net.pterodactylus.sone.test.* -import org.junit.Test +import net.pterodactylus.sone.web.* +import net.pterodactylus.sone.web.notification.* +import org.hamcrest.MatcherAssert.* +import org.hamcrest.Matchers.* +import org.mockito.Mockito.* +import java.io.* +import java.util.concurrent.atomic.* +import kotlin.test.* /** * Unit test for [SonePlugin]. */ +@Dirty class SonePluginTest { - private val sonePlugin = SonePlugin() + private val sonePlugin by lazy { SonePlugin { injector } } private val pluginRespirator = deepMock() private val node = deepMock() private val clientCore = deepMock() @@ -31,4 +44,168 @@ class SonePluginTest { sonePlugin.runPlugin(pluginRespirator) } + @Test + fun `core can be created`() { + val injector: Injector = runSonePluginWithRealInjector() + assertThat(injector.getInstance(), notNullValue()) + } + + @Test + fun `fcp interface can be created`() { + val injector: Injector = runSonePluginWithRealInjector() + assertThat(injector.getInstance(), notNullValue()) + } + + @Test + fun `web interface can be created`() { + val injector: Injector = runSonePluginWithRealInjector() + assertThat(injector.getInstance(), notNullValue()) + } + + @Test + fun `web of trust connector can be created`() { + val injector: Injector = runSonePluginWithRealInjector() + assertThat(injector.getInstance(), notNullValue()) + } + + @Test + fun `notification handler can be created`() { + val injector: Injector = runSonePluginWithRealInjector() + assertThat(injector.getInstance(), notNullValue()) + } + + private fun runSonePluginWithRealInjector(injectorConsumer: (Injector) -> Unit = {}): Injector { + lateinit var injector: Injector + val sonePlugin = SonePlugin { + Guice.createInjector(*it).also { + injector = it + injectorConsumer(it) + } + } + sonePlugin.setLanguage(ENGLISH) + sonePlugin.runPlugin(pluginRespirator) + return injector + } + + @Test + fun `core is being started`() { + sonePlugin.runPlugin(pluginRespirator) + val core = injector.getInstance() + verify(core).start() + } + + @Test + fun `notification handler is being requested`() { + sonePlugin.runPlugin(pluginRespirator) + assertThat(getInjected(NotificationHandler::class.java), notNullValue()) + } + + private class FirstStartListener(private val firstStartReceived: AtomicBoolean) { + @Subscribe + fun firstStart(firstStart: FirstStart) { + firstStartReceived.set(true) + } + } + + @Test + fun `first-start event is sent to event bus when first start is true`() { + File("sone.properties").delete() + val firstStartReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(FirstStartListener(firstStartReceived)) + } + sonePlugin.runPlugin(pluginRespirator) + assertThat(firstStartReceived.get(), equalTo(true)) + } + + @Test + fun `first-start event is not sent to event bus when first start is false`() { + File("sone.properties").deleteAfter { + writeText("# empty") + val firstStartReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(FirstStartListener(firstStartReceived)) + } + sonePlugin.runPlugin(pluginRespirator) + assertThat(firstStartReceived.get(), equalTo(false)) + } + } + + private class ConfigNotReadListener(private val configNotReadReceiver: AtomicBoolean) { + @Subscribe + fun configNotRead(configNotRead: ConfigNotRead) { + configNotReadReceiver.set(true) + } + } + + @Test + fun `config-not-read event is sent to event bus when new config is true`() { + File("sone.properties").deleteAfter { + writeText("Invalid") + val configNotReadReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(ConfigNotReadListener(configNotReadReceived)) + } + sonePlugin.runPlugin(pluginRespirator) + assertThat(configNotReadReceived.get(), equalTo(true)) + } + } + + @Test + fun `config-not-read event is not sent to event bus when first start is true`() { + File("sone.properties").delete() + val configNotReadReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(ConfigNotReadListener(configNotReadReceived)) + } + sonePlugin.runPlugin(pluginRespirator) + assertThat(configNotReadReceived.get(), equalTo(false)) + } + + @Test + fun `config-not-read event is not sent to event bus when new config is false`() { + File("sone.properties").deleteAfter { + writeText("# comment") + val configNotReadReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(ConfigNotReadListener(configNotReadReceived)) + } + sonePlugin.runPlugin(pluginRespirator) + assertThat(configNotReadReceived.get(), equalTo(false)) + } + } + + private fun getInjected(clazz: Class, annotation: Annotation? = null): T? = + injected[TypeLiteral.get(clazz) to annotation] as? T + + private val injected = + mutableMapOf, Annotation?>, Any>() + + private val injector = mock().apply { + fun mockValue(clazz: Class<*>) = false.takeIf { clazz.name == java.lang.Boolean::class.java.name } ?: mock(clazz) + whenever(getInstance(any>())).then { + injected.getOrPut((it.getArgument(0) as Key<*>).let { it.typeLiteral to it.annotation }) { + it.getArgument>(0).typeLiteral.type.typeName.toClass().let(::mockValue) + } + } + whenever(getInstance(any>())).then { + injected.getOrPut(TypeLiteral.get(it.getArgument(0) as Class<*>) to null) { + it.getArgument>(0).let(::mockValue) + } + } + } + +} + +private fun String.toClass(): Class<*> = SonePlugin::class.java.classLoader.loadClass(this) + +private fun File.deleteAfter(action: File.() -> Unit) = try { + action(this) +} finally { + this.delete() }