From 684b844b44d916b418117ee8ab2a24e33812c527 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 7 Jun 2021 18:46:40 +0800 Subject: [PATCH] Move implementation of `EventDispatcher.joinBroadcast` to tests and mark it `@TestOnly` --- .../network/components/EventDispatcher.kt | 22 +++++----- .../network/component/EventDispatcherTest.kt | 7 ++- .../AbstractMockNetworkHandlerTest.kt | 8 ++-- .../AbstractRealNetworkHandlerTest.kt | 7 +++ .../components/EventDispatcherImpl.kt | 44 +++++++++++++++++++ 5 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 mirai-core/src/commonTest/kotlin/network/framework/components/EventDispatcherImpl.kt diff --git a/mirai-core/src/commonMain/kotlin/network/components/EventDispatcher.kt b/mirai-core/src/commonMain/kotlin/network/components/EventDispatcher.kt index c8d7a7bd2..6d17ba032 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/EventDispatcher.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/EventDispatcher.kt @@ -14,6 +14,7 @@ import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.internal.network.component.ComponentKey import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.TestOnly import net.mamoe.mirai.utils.addNameHierarchically import net.mamoe.mirai.utils.childScope import kotlin.coroutines.CoroutineContext @@ -36,7 +37,10 @@ internal interface EventDispatcher { /** * Join all jobs. Joins also jobs launched during this call. */ - suspend fun joinBroadcast() + @TestOnly + suspend fun joinBroadcast() { + throw UnsupportedOperationException("joinBroadcast is only supported in TestEventDispatcherImpl") + } companion object : ComponentKey } @@ -47,7 +51,7 @@ internal object EventDispatcherScopeFlag : CoroutineContext.Element, CoroutineCo @JvmInline internal value class EventBroadcastJob( - private val job: Job + val job: Job ) { inline fun onSuccess(crossinline action: () -> Unit) { job.invokeOnCompletion { @@ -57,9 +61,9 @@ internal value class EventBroadcastJob( } -internal class EventDispatcherImpl( - private val lifecycleContext: CoroutineContext, - private val logger: MiraiLogger, +internal open class EventDispatcherImpl( + lifecycleContext: CoroutineContext, + protected val logger: MiraiLogger, ) : EventDispatcher, CoroutineScope by lifecycleContext .addNameHierarchically("EventDispatcher") @@ -88,14 +92,8 @@ internal class EventDispatcherImpl( return EventBroadcastJob(job) } - private fun optimizeEventToString(event: Event): String { + protected fun optimizeEventToString(event: Event): String { val qualified = event::class.java.canonicalName ?: return event.toString() return qualified.substringAfter("net.mamoe.mirai.event.events.", "").ifEmpty { event.toString() } } - - override suspend fun joinBroadcast() { - for (child in coroutineContext.job.children) { - child.join() - } - } } \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/component/EventDispatcherTest.kt b/mirai-core/src/commonTest/kotlin/network/component/EventDispatcherTest.kt index 36cbb0d71..016127668 100644 --- a/mirai-core/src/commonTest/kotlin/network/component/EventDispatcherTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/component/EventDispatcherTest.kt @@ -7,23 +7,26 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ +@file:OptIn(TestOnly::class) + package net.mamoe.mirai.internal.network.component import kotlinx.coroutines.CompletableJob import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.job import net.mamoe.mirai.event.AbstractEvent -import net.mamoe.mirai.internal.network.components.EventDispatcherImpl import net.mamoe.mirai.internal.test.AbstractTest import net.mamoe.mirai.internal.test.assertEventBroadcasts import net.mamoe.mirai.internal.test.runBlockingUnit import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.TestOnly +import network.framework.components.TestEventDispatcherImpl import org.junit.jupiter.api.Test internal class EventDispatcherTest : AbstractTest() { private class Ev : AbstractEvent() - val dispatcher = EventDispatcherImpl(SupervisorJob(), MiraiLogger.TopLevel) + private val dispatcher = TestEventDispatcherImpl(SupervisorJob(), MiraiLogger.TopLevel) @Test fun `can broadcast`() = runBlockingUnit { diff --git a/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt b/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt index 164169b9a..7a9dc9b59 100644 --- a/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt @@ -15,7 +15,6 @@ import net.mamoe.mirai.internal.MockBot import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage import net.mamoe.mirai.internal.network.components.EventDispatcher -import net.mamoe.mirai.internal.network.components.EventDispatcherImpl import net.mamoe.mirai.internal.network.components.SsoProcessor import net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor import net.mamoe.mirai.internal.network.handler.NetworkHandler @@ -24,8 +23,8 @@ import net.mamoe.mirai.internal.network.handler.state.SafeStateObserver import net.mamoe.mirai.internal.network.handler.state.StateObserver import net.mamoe.mirai.internal.test.AbstractTest import net.mamoe.mirai.internal.utils.subLogger -import net.mamoe.mirai.supervisorJob import net.mamoe.mirai.utils.MiraiLogger +import network.framework.components.TestEventDispatcherImpl import org.junit.jupiter.api.TestInstance import kotlin.test.assertEquals @@ -41,7 +40,10 @@ internal abstract class AbstractMockNetworkHandlerTest : AbstractTest() { protected val logger = MiraiLogger.create("test") protected val components = ConcurrentComponentStorage().apply { set(SsoProcessor, TestSsoProcessor(bot)) - set(EventDispatcher, EventDispatcherImpl(bot.supervisorJob, bot.logger.subLogger("ED"))) + set( + EventDispatcher, + TestEventDispatcherImpl(bot.coroutineContext, bot.logger.subLogger("TestEventDispatcherImpl")) + ) set( StateObserver, SafeStateObserver( diff --git a/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt b/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt index 0e1654111..2b19408ea 100644 --- a/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt @@ -26,9 +26,11 @@ import net.mamoe.mirai.internal.network.handler.NetworkHandlerContextImpl import net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory import net.mamoe.mirai.internal.network.handler.state.StateObserver import net.mamoe.mirai.internal.test.AbstractTest +import net.mamoe.mirai.internal.utils.subLogger import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.debug import net.mamoe.mirai.utils.lateinitMutableProperty +import network.framework.components.TestEventDispatcherImpl import org.junit.jupiter.api.TestInstance import java.net.InetSocketAddress import java.util.concurrent.ConcurrentLinkedQueue @@ -107,6 +109,11 @@ internal abstract class AbstractRealNetworkHandlerTest : Abs override fun attachJob(bot: AbstractBot, scope: CoroutineScope) { } }) + + set( + EventDispatcher, + TestEventDispatcherImpl(bot.coroutineContext, bot.logger.subLogger("TestEventDispatcherImpl")) + ) // set(StateObserver, bot.run { stateObserverChain() }) } diff --git a/mirai-core/src/commonTest/kotlin/network/framework/components/EventDispatcherImpl.kt b/mirai-core/src/commonTest/kotlin/network/framework/components/EventDispatcherImpl.kt new file mode 100644 index 000000000..d38f171db --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/network/framework/components/EventDispatcherImpl.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2019-2021 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package network.framework.components + +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.job +import kotlinx.coroutines.launch +import net.mamoe.mirai.event.Event +import net.mamoe.mirai.internal.network.components.EventDispatcherImpl +import net.mamoe.mirai.internal.network.components.EventDispatcherScopeFlag +import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.TestOnly +import net.mamoe.mirai.utils.runUnwrapCancellationException +import kotlin.coroutines.CoroutineContext + +internal open class TestEventDispatcherImpl( + lifecycleContext: CoroutineContext, + logger: MiraiLogger, +) : EventDispatcherImpl(lifecycleContext, logger) { + override suspend fun broadcast(event: Event) { + runUnwrapCancellationException { + launch( + EventDispatcherScopeFlag, + start = CoroutineStart.UNDISPATCHED + ) { + super.broadcast(event) + }.join() + } // so that [joinBroadcast] works. + } + + @OptIn(TestOnly::class) + override suspend fun joinBroadcast() { + for (child in coroutineContext.job.children) { + child.join() + } + } +} \ No newline at end of file