diff --git a/mirai-core/src/commonMain/kotlin/AbstractBot.kt b/mirai-core/src/commonMain/kotlin/AbstractBot.kt index b054556b1..6654b53c7 100644 --- a/mirai-core/src/commonMain/kotlin/AbstractBot.kt +++ b/mirai-core/src/commonMain/kotlin/AbstractBot.kt @@ -25,6 +25,7 @@ import net.mamoe.mirai.internal.network.components.SsoProcessor import net.mamoe.mirai.internal.network.handler.NetworkHandler import net.mamoe.mirai.internal.network.handler.selector.NetworkException import net.mamoe.mirai.internal.network.impl.netty.asCoroutineExceptionHandler +import net.mamoe.mirai.network.LoginFailedException import net.mamoe.mirai.supervisorJob import net.mamoe.mirai.utils.* import kotlin.collections.set @@ -123,6 +124,9 @@ internal abstract class AbstractBot constructor( if (!components[SsoProcessor].firstLoginSucceed) { this.close(cause) // failed to do first login. } + if (cause is LoginFailedException && cause.killBot) { + close(cause) + } throw cause } logger.info { "Bot login successful." } diff --git a/mirai-core/src/commonMain/kotlin/network/handler/selector/AbstractKeepAliveNetworkHandlerSelector.kt b/mirai-core/src/commonMain/kotlin/network/handler/selector/AbstractKeepAliveNetworkHandlerSelector.kt index 633ded59e..ccb1d849b 100644 --- a/mirai-core/src/commonMain/kotlin/network/handler/selector/AbstractKeepAliveNetworkHandlerSelector.kt +++ b/mirai-core/src/commonMain/kotlin/network/handler/selector/AbstractKeepAliveNetworkHandlerSelector.kt @@ -15,6 +15,8 @@ import kotlinx.coroutines.yield import net.mamoe.mirai.internal.network.handler.NetworkHandler import net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory import net.mamoe.mirai.internal.network.handler.logger +import net.mamoe.mirai.network.LoginFailedException +import net.mamoe.mirai.network.RetryLaterException import net.mamoe.mirai.utils.ExceptionCollector import net.mamoe.mirai.utils.systemProp import net.mamoe.mirai.utils.toLongUnsigned @@ -85,6 +87,13 @@ internal abstract class AbstractKeepAliveNetworkHandlerSelector : Abs // set(StateObserver, bot.run { stateObserverChain() }) } - open fun createHandler(): H = factory.create(createContext(), address) + open fun createHandler(): NetworkHandler = factory.create(createContext(), address) open fun createContext(): NetworkHandlerContextImpl = NetworkHandlerContextImpl(bot, networkLogger, bot.createNetworkLevelComponents()) + val address: InetSocketAddress = InetSocketAddress.createUnresolved("localhost", 123) /////////////////////////////////////////////////////////////////////////// @@ -147,4 +148,10 @@ internal abstract class AbstractRealNetworkHandlerTest : Abs } val eventDispatcher get() = bot.components[EventDispatcher] -} \ No newline at end of file +} + +internal fun AbstractRealNetworkHandlerTest<*>.setSsoProcessor(action: suspend SsoProcessor.(handler: NetworkHandler) -> Unit) { + overrideComponents[SsoProcessor] = object : SsoProcessor by overrideComponents[SsoProcessor] { + override suspend fun login(handler: NetworkHandler) = action(handler) + } +} diff --git a/mirai-core/src/commonTest/kotlin/network/impl/netty/AbstractNettyNHTest.kt b/mirai-core/src/commonTest/kotlin/network/impl/netty/AbstractNettyNHTest.kt index 3d468b40c..be95292a1 100644 --- a/mirai-core/src/commonTest/kotlin/network/impl/netty/AbstractNettyNHTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/impl/netty/AbstractNettyNHTest.kt @@ -93,9 +93,3 @@ internal abstract class AbstractNettyNHTest : AbstractRealNetworkHandlerTest Unit) { - overrideComponents[SsoProcessor] = object : SsoProcessor by overrideComponents[SsoProcessor] { - override suspend fun login(handler: NetworkHandler) = action(handler) - } -} \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyBotNormalLoginTest.kt b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyBotNormalLoginTest.kt index 4fb7129dc..3c1e5015b 100644 --- a/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyBotNormalLoginTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyBotNormalLoginTest.kt @@ -10,29 +10,47 @@ package net.mamoe.mirai.internal.network.impl.netty import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.isActive +import net.mamoe.mirai.internal.network.framework.setSsoProcessor +import net.mamoe.mirai.internal.network.handler.NetworkHandler +import net.mamoe.mirai.internal.network.handler.selector.KeepAliveNetworkHandlerSelector +import net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler import net.mamoe.mirai.internal.test.runBlockingUnit +import net.mamoe.mirai.network.CustomLoginFailedException import org.junit.jupiter.api.Test import java.io.IOException import kotlin.test.assertFailsWith +import kotlin.test.assertFalse internal class NettyBotNormalLoginTest : AbstractNettyNHTest() { - class CusLoginException(message: String?) : RuntimeException(message) + val selector = KeepAliveNetworkHandlerSelector { + super.factory.create(createContext(), address) + } + + override fun createHandler(): NetworkHandler { + return SelectorNetworkHandler(selector) + } + + class CusLoginException(message: String?) : CustomLoginFailedException(true, message) @Test fun `test login fail`() = runBlockingUnit { setSsoProcessor { throw CusLoginException("A") } assertFailsWith("A") { bot.login() } + assertFalse(bot.isActive) } @Test fun `test network broken`() = runBlockingUnit { + var retryCounter = 0 setSsoProcessor { eventDispatcher.joinBroadcast() + if (retryCounter++ >= 15) { + return@setSsoProcessor + } channel.pipeline().fireExceptionCaught(IOException("TestNetworkBroken")) awaitCancellation() // receive exception from "network" } - assertFailsWith("TestNetworkBroken") { - bot.login() - } + bot.login() } } diff --git a/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyHandlerEventTest.kt b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyHandlerEventTest.kt index 1545f7048..9bb7cb9b3 100644 --- a/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyHandlerEventTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/impl/netty/NettyHandlerEventTest.kt @@ -17,6 +17,7 @@ import net.mamoe.mirai.event.events.BotOnlineEvent import net.mamoe.mirai.event.events.BotReloginEvent import net.mamoe.mirai.internal.network.components.SsoProcessor import net.mamoe.mirai.internal.network.framework.eventDispatcher +import net.mamoe.mirai.internal.network.framework.setSsoProcessor import net.mamoe.mirai.internal.network.framework.ssoProcessor import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.* import net.mamoe.mirai.internal.test.assertEventBroadcasts diff --git a/mirai-core/src/commonTest/kotlin/test/initPlatform.common.kt b/mirai-core/src/commonTest/kotlin/test/initPlatform.common.kt index 58decdd3b..74db0e1e8 100644 --- a/mirai-core/src/commonTest/kotlin/test/initPlatform.common.kt +++ b/mirai-core/src/commonTest/kotlin/test/initPlatform.common.kt @@ -24,7 +24,8 @@ abstract class AbstractTest { init { initPlatform() - System.setProperty("mirai.debug.network.state.observer.logging", "false") + System.setProperty("mirai.debug.network.packet.logger", "true") + System.setProperty("mirai.debug.network.state.observer.logging", "true") System.setProperty("mirai.debug.network.show.all.components", "true") System.setProperty("mirai.debug.network.show.components.creation.stacktrace", "true")