From 7f2f1e97592867b88caecc0f05672ac40f2168c5 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sat, 24 Apr 2021 12:05:32 +0800 Subject: [PATCH] Rearrange network tests --- .../kotlin/network/PacketCodecTest.kt | 4 +- .../kotlin/network/ServerListTest.kt | 3 +- .../network/component/ComponentKeyTest.kt | 3 +- .../network/component/ComponentStorageTest.kt | 3 +- .../AbstractMockNetworkHandlerTest.kt} | 7 +- .../framework/AbstractNetworkEventTest.kt | 88 +++++++++++++++++++ .../kotlin/network/framework/networkUtils.kt | 24 +++++ .../network/{ => framework}/sessionUtils.kt | 4 +- .../{handler => framework}/testUtils.kt | 5 +- .../network/handler/HandlerEventTest.kt | 24 +++++ ...=> KeepAliveNetworkHandlerSelectorTest.kt} | 14 ++- .../network/handler/ResumeConnectionTest.kt | 24 +++++ .../network/handler/StateObserverTest.kt | 3 +- .../netty/NettyUtilsTest.kt} | 8 +- .../{internal => }/utils/FileSystemTest.kt | 0 15 files changed, 195 insertions(+), 19 deletions(-) rename mirai-core/src/commonTest/kotlin/network/{handler/AbstractNetworkHandlerTest.kt => framework/AbstractMockNetworkHandlerTest.kt} (86%) create mode 100644 mirai-core/src/commonTest/kotlin/network/framework/AbstractNetworkEventTest.kt create mode 100644 mirai-core/src/commonTest/kotlin/network/framework/networkUtils.kt rename mirai-core/src/commonTest/kotlin/network/{ => framework}/sessionUtils.kt (93%) rename mirai-core/src/commonTest/kotlin/network/{handler => framework}/testUtils.kt (91%) create mode 100644 mirai-core/src/commonTest/kotlin/network/handler/HandlerEventTest.kt rename mirai-core/src/commonTest/kotlin/network/handler/{AbstractKeepAliveNetworkHandlerSelectorTest.kt => KeepAliveNetworkHandlerSelectorTest.kt} (81%) create mode 100644 mirai-core/src/commonTest/kotlin/network/handler/ResumeConnectionTest.kt rename mirai-core/src/commonTest/kotlin/network/{NettyTestUnit.kt => impl/netty/NettyUtilsTest.kt} (91%) rename mirai-core/src/commonTest/kotlin/{internal => }/utils/FileSystemTest.kt (100%) diff --git a/mirai-core/src/commonTest/kotlin/network/PacketCodecTest.kt b/mirai-core/src/commonTest/kotlin/network/PacketCodecTest.kt index 3d938c95c..7916bc813 100644 --- a/mirai-core/src/commonTest/kotlin/network/PacketCodecTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/PacketCodecTest.kt @@ -9,6 +9,8 @@ package net.mamoe.mirai.internal.network +import net.mamoe.mirai.internal.test.AbstractTest + internal class PacketCodecTest : AbstractCodecTest() -internal abstract class AbstractCodecTest \ No newline at end of file +internal abstract class AbstractCodecTest : AbstractTest() \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/ServerListTest.kt b/mirai-core/src/commonTest/kotlin/network/ServerListTest.kt index 0ce8a8c20..ec73719ae 100644 --- a/mirai-core/src/commonTest/kotlin/network/ServerListTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/ServerListTest.kt @@ -12,9 +12,10 @@ package net.mamoe.mirai.internal.network import net.mamoe.mirai.internal.network.components.ServerAddress import net.mamoe.mirai.internal.network.components.ServerList import net.mamoe.mirai.internal.network.components.ServerListImpl +import net.mamoe.mirai.internal.test.AbstractTest import kotlin.test.* -internal class ServerListTest { +internal class ServerListTest : AbstractTest() { @Test fun canInitializeDefaults() { diff --git a/mirai-core/src/commonTest/kotlin/network/component/ComponentKeyTest.kt b/mirai-core/src/commonTest/kotlin/network/component/ComponentKeyTest.kt index 9f3ad8d13..67b2b11a5 100644 --- a/mirai-core/src/commonTest/kotlin/network/component/ComponentKeyTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/component/ComponentKeyTest.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.internal.network.component +import net.mamoe.mirai.internal.test.AbstractTest import org.junit.jupiter.api.Test import kotlin.test.assertEquals @@ -16,7 +17,7 @@ private class TestComponent { companion object : ComponentKey } -internal class ComponentKeyTest { +internal class ComponentKeyTest : AbstractTest() { @Test fun testComponentName() { diff --git a/mirai-core/src/commonTest/kotlin/network/component/ComponentStorageTest.kt b/mirai-core/src/commonTest/kotlin/network/component/ComponentStorageTest.kt index 00293fb93..53db1d61c 100644 --- a/mirai-core/src/commonTest/kotlin/network/component/ComponentStorageTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/component/ComponentStorageTest.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.internal.network.component +import net.mamoe.mirai.internal.test.AbstractTest import org.junit.jupiter.api.Test import kotlin.test.assertEquals @@ -24,7 +25,7 @@ private data class TestComponent3( companion object : ComponentKey } -internal class ComponentStorageTest { +internal class ComponentStorageTest : AbstractTest() { @Test fun `can put component`() { val storage = ConcurrentComponentStorage().apply { diff --git a/mirai-core/src/commonTest/kotlin/network/handler/AbstractNetworkHandlerTest.kt b/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt similarity index 86% rename from mirai-core/src/commonTest/kotlin/network/handler/AbstractNetworkHandlerTest.kt rename to mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt index 7be4e23b9..2b953a720 100644 --- a/mirai-core/src/commonTest/kotlin/network/handler/AbstractNetworkHandlerTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt @@ -9,7 +9,7 @@ @file:Suppress("MemberVisibilityCanBePrivate") -package net.mamoe.mirai.internal.network.handler +package net.mamoe.mirai.internal.network.framework import net.mamoe.mirai.internal.MockBot import net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage @@ -19,9 +19,12 @@ import net.mamoe.mirai.internal.network.context.SsoProcessorContextImpl import net.mamoe.mirai.internal.network.handler.state.LoggingStateObserver 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.utils.MiraiLogger +import org.junit.jupiter.api.TestInstance -internal abstract class AbstractNetworkHandlerTest { +@TestInstance(TestInstance.Lifecycle.PER_METHOD) +internal abstract class AbstractMockNetworkHandlerTest : AbstractTest() { protected open fun createNetworkHandlerContext() = TestNetworkHandlerContext(bot, logger, components) protected open fun createNetworkHandler() = TestNetworkHandler(createNetworkHandlerContext()) diff --git a/mirai-core/src/commonTest/kotlin/network/framework/AbstractNetworkEventTest.kt b/mirai-core/src/commonTest/kotlin/network/framework/AbstractNetworkEventTest.kt new file mode 100644 index 000000000..b75c03137 --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/network/framework/AbstractNetworkEventTest.kt @@ -0,0 +1,88 @@ +/* + * 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 net.mamoe.mirai.internal.network.framework + +import net.mamoe.mirai.internal.MockBot +import net.mamoe.mirai.internal.QQAndroidBot +import net.mamoe.mirai.internal.network.QQAndroidClient +import net.mamoe.mirai.internal.network.component.ComponentStorage +import net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage +import net.mamoe.mirai.internal.network.component.plus +import net.mamoe.mirai.internal.network.components.* +import net.mamoe.mirai.internal.network.context.SsoProcessorContext +import net.mamoe.mirai.internal.network.context.SsoProcessorContextImpl +import net.mamoe.mirai.internal.network.context.SsoSession +import net.mamoe.mirai.internal.network.handler.NetworkHandler +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.utils.MiraiLogger +import net.mamoe.mirai.utils.debug +import java.net.InetSocketAddress + +/** + * With real factory and components as in [QQAndroidBot.components]. + */ +internal abstract class AbstractRealNetworkHandlerTest( + private val factory: NetworkHandlerFactory, +) : AbstractTest() { + val bot = MockBot() + val networkLogger = MiraiLogger.TopLevel + + protected open val defaultComponents = ConcurrentComponentStorage().apply { + val components = this + val configuration = bot.configuration + set(SsoProcessorContext, SsoProcessorContextImpl(bot)) + set(SsoProcessor, object : SsoProcessor { + override val client: QQAndroidClient get() = bot.client + override val ssoSession: SsoSession get() = bot.client + override fun createObserverChain(): StateObserver = StateObserver.NOP + override suspend fun login(handler: NetworkHandler) { + networkLogger.debug { "SsoProcessor.login" } + } + }) + set(HeartbeatProcessor, object : HeartbeatProcessor { + override suspend fun doHeartbeatNow(networkHandler: NetworkHandler) { + networkLogger.debug { "HeartbeatProcessor.doHeartbeatNow" } + } + }) + set(KeyRefreshProcessor, KeyRefreshProcessorImpl(networkLogger)) + set(ConfigPushProcessor, ConfigPushProcessorImpl(networkLogger)) + + set(BotInitProcessor, object : BotInitProcessor { + override suspend fun init() { + networkLogger.debug { "BotInitProcessor.init" } + } + }) + set(ContactCacheService, ContactCacheServiceImpl(bot)) + set(ContactUpdater, ContactUpdaterImpl(bot, components, networkLogger)) + set(BdhSessionSyncer, BdhSessionSyncerImpl(configuration, networkLogger, components)) + set(ServerList, ServerListImpl()) + set(PacketHandler, LoggingPacketHandler(bot, components, networkLogger)) + set(PacketCodec, PacketCodecImpl()) + set(OtherClientUpdater, OtherClientUpdaterImpl(bot, components, bot.logger)) + set(ConfigPushSyncer, ConfigPushSyncerImpl()) + + set(StateObserver, StateObserver.NOP) + + } + + protected open fun createHandler(additionalComponents: ComponentStorage? = null): NetworkHandler { + return factory.create( + NetworkHandlerContextImpl( + bot, + networkLogger, + additionalComponents?.plus(defaultComponents) ?: defaultComponents + ), + InetSocketAddress.createUnresolved("localhost", 123) + ) + } +} \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/framework/networkUtils.kt b/mirai-core/src/commonTest/kotlin/network/framework/networkUtils.kt new file mode 100644 index 000000000..8e9092db8 --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/network/framework/networkUtils.kt @@ -0,0 +1,24 @@ +/* + * 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 net.mamoe.mirai.internal.network.framework + +import net.mamoe.mirai.internal.network.handler.NetworkHandler +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract + +internal fun NetworkHandler.useNetworkHandler(action: NetworkHandler.(handler: NetworkHandler) -> R): R { + contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) } + val r = kotlin.runCatching { action(this) } + r.fold( + onSuccess = { close(null) }, + onFailure = { close(it) } + ) + return r.getOrThrow() +} \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/sessionUtils.kt b/mirai-core/src/commonTest/kotlin/network/framework/sessionUtils.kt similarity index 93% rename from mirai-core/src/commonTest/kotlin/network/sessionUtils.kt rename to mirai-core/src/commonTest/kotlin/network/framework/sessionUtils.kt index 8794204db..2d838289e 100644 --- a/mirai-core/src/commonTest/kotlin/network/sessionUtils.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/sessionUtils.kt @@ -7,10 +7,12 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -package net.mamoe.mirai.internal.network +package net.mamoe.mirai.internal.network.framework import net.mamoe.mirai.event.events.BotOnlineEvent import net.mamoe.mirai.internal.QQAndroidBot +import net.mamoe.mirai.internal.network.QQAndroidClient +import net.mamoe.mirai.internal.network.WLoginSigInfo import net.mamoe.mirai.internal.network.context.AccountSecrets import net.mamoe.mirai.internal.network.context.AccountSecretsImpl import net.mamoe.mirai.internal.network.context.SsoSession diff --git a/mirai-core/src/commonTest/kotlin/network/handler/testUtils.kt b/mirai-core/src/commonTest/kotlin/network/framework/testUtils.kt similarity index 91% rename from mirai-core/src/commonTest/kotlin/network/handler/testUtils.kt rename to mirai-core/src/commonTest/kotlin/network/framework/testUtils.kt index e22f7230c..f5de2bc20 100644 --- a/mirai-core/src/commonTest/kotlin/network/handler/testUtils.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/testUtils.kt @@ -7,7 +7,7 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -package net.mamoe.mirai.internal.network.handler +package net.mamoe.mirai.internal.network.framework import kotlinx.coroutines.CompletableDeferred import net.mamoe.mirai.internal.MockBot @@ -17,6 +17,9 @@ import net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage import net.mamoe.mirai.internal.network.components.SsoProcessor import net.mamoe.mirai.internal.network.components.SsoProcessorImpl import net.mamoe.mirai.internal.network.context.SsoProcessorContextImpl +import net.mamoe.mirai.internal.network.handler.NetworkHandler +import net.mamoe.mirai.internal.network.handler.NetworkHandlerContext +import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport import net.mamoe.mirai.internal.network.handler.state.LoggingStateObserver import net.mamoe.mirai.internal.network.handler.state.SafeStateObserver import net.mamoe.mirai.internal.network.handler.state.StateObserver diff --git a/mirai-core/src/commonTest/kotlin/network/handler/HandlerEventTest.kt b/mirai-core/src/commonTest/kotlin/network/handler/HandlerEventTest.kt new file mode 100644 index 000000000..e02486c76 --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/network/handler/HandlerEventTest.kt @@ -0,0 +1,24 @@ +/* + * 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 net.mamoe.mirai.internal.network.handler + +import net.mamoe.mirai.internal.network.framework.AbstractRealNetworkHandlerTest +import net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandler +import net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandlerFactory +import net.mamoe.mirai.internal.test.runBlockingUnit +import kotlin.test.Test + +internal class HandlerEventTest : AbstractRealNetworkHandlerTest(NettyNetworkHandlerFactory) { + + @Test + fun `BotOnlineEvent after successful logon`() = runBlockingUnit { + bot.login() + } +} \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/handler/AbstractKeepAliveNetworkHandlerSelectorTest.kt b/mirai-core/src/commonTest/kotlin/network/handler/KeepAliveNetworkHandlerSelectorTest.kt similarity index 81% rename from mirai-core/src/commonTest/kotlin/network/handler/AbstractKeepAliveNetworkHandlerSelectorTest.kt rename to mirai-core/src/commonTest/kotlin/network/handler/KeepAliveNetworkHandlerSelectorTest.kt index 2c3168a0b..17e05526c 100644 --- a/mirai-core/src/commonTest/kotlin/network/handler/AbstractKeepAliveNetworkHandlerSelectorTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/handler/KeepAliveNetworkHandlerSelectorTest.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.internal.network.handler +import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest import net.mamoe.mirai.internal.network.handler.NetworkHandler.State import net.mamoe.mirai.internal.network.handler.selector.AbstractKeepAliveNetworkHandlerSelector import net.mamoe.mirai.internal.test.runBlockingUnit @@ -25,13 +26,10 @@ private class TestSelector(val createInstance0: () -> NetworkHandler) : } } -internal class KeepAliveNetworkHandlerSelectorTest { - - private fun createHandler() = TestNetworkHandler(TestNetworkHandlerContext()) - +internal class KeepAliveNetworkHandlerSelectorTest : AbstractMockNetworkHandlerTest() { @Test fun `can initialize instance`() { - val selector = TestSelector { createHandler().apply { setState(State.OK) } } + val selector = TestSelector { createNetworkHandler().apply { setState(State.OK) } } runBlockingUnit(timeout = 3.seconds) { selector.awaitResumeInstance() } assertNotNull(selector.getResumedInstance()) } @@ -41,7 +39,7 @@ internal class KeepAliveNetworkHandlerSelectorTest { val selector = TestSelector { fail("initialize called") } - val handler = createHandler() + val handler = createNetworkHandler() selector.setCurrent(handler) assertSame(handler, selector.getResumedInstance()) } @@ -49,9 +47,9 @@ internal class KeepAliveNetworkHandlerSelectorTest { @Test fun `initialize another when closed`() { val selector = TestSelector { - createHandler().apply { setState(State.OK) } + createNetworkHandler().apply { setState(State.OK) } } - val handler = createHandler() + val handler = createNetworkHandler() selector.setCurrent(handler) assertSame(handler, selector.getResumedInstance()) handler.setState(State.CLOSED) diff --git a/mirai-core/src/commonTest/kotlin/network/handler/ResumeConnectionTest.kt b/mirai-core/src/commonTest/kotlin/network/handler/ResumeConnectionTest.kt new file mode 100644 index 000000000..30fe59278 --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/network/handler/ResumeConnectionTest.kt @@ -0,0 +1,24 @@ +/* + * 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 net.mamoe.mirai.internal.network.handler + +import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest +import kotlin.test.Test + +/** + * @see NetworkHandler.resumeConnection + */ +internal class ResumeConnectionTest : AbstractMockNetworkHandlerTest() { + + @Test + fun `resumeConnection switches a state that can send packet`() { + createNetworkHandler().sendPacket + } +} \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt b/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt index 62524fad7..487d8d01c 100644 --- a/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.internal.network.handler +import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.CONNECTING import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.INITIALIZED import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver @@ -18,7 +19,7 @@ import org.junit.jupiter.api.TestInstance import kotlin.test.assertEquals @TestInstance(TestInstance.Lifecycle.PER_METHOD) -internal class StateObserverTest : AbstractNetworkHandlerTest() { +internal class StateObserverTest : AbstractMockNetworkHandlerTest() { @Test fun `can trigger observer`() { val called = ArrayList>() diff --git a/mirai-core/src/commonTest/kotlin/network/NettyTestUnit.kt b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyUtilsTest.kt similarity index 91% rename from mirai-core/src/commonTest/kotlin/network/NettyTestUnit.kt rename to mirai-core/src/commonTest/kotlin/network/impl/netty/NettyUtilsTest.kt index bbcc2c1f4..ad45d7782 100644 --- a/mirai-core/src/commonTest/kotlin/network/NettyTestUnit.kt +++ b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyUtilsTest.kt @@ -7,12 +7,13 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -package net.mamoe.mirai.internal.network +package net.mamoe.mirai.internal.network.impl.netty import io.netty.channel.DefaultChannelPromise import io.netty.channel.embedded.EmbeddedChannel import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import net.mamoe.mirai.internal.test.AbstractTest import net.mamoe.mirai.internal.test.runBlockingUnit import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.Test @@ -20,7 +21,10 @@ import kotlin.test.assertFailsWith import kotlin.test.assertTrue import kotlin.time.seconds -internal class NettyTestUnit { +/** + * @see awaitKt + */ +internal class NettyUtilsTest : AbstractTest() { companion object { private val channel = EmbeddedChannel() diff --git a/mirai-core/src/commonTest/kotlin/internal/utils/FileSystemTest.kt b/mirai-core/src/commonTest/kotlin/utils/FileSystemTest.kt similarity index 100% rename from mirai-core/src/commonTest/kotlin/internal/utils/FileSystemTest.kt rename to mirai-core/src/commonTest/kotlin/utils/FileSystemTest.kt