Rearrange network tests

This commit is contained in:
Him188 2021-04-24 12:05:32 +08:00
parent 9286d2124e
commit 7f2f1e9759
15 changed files with 195 additions and 19 deletions

View File

@ -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
internal abstract class AbstractCodecTest : AbstractTest()

View File

@ -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() {

View File

@ -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<TestComponent>
}
internal class ComponentKeyTest {
internal class ComponentKeyTest : AbstractTest() {
@Test
fun testComponentName() {

View File

@ -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<TestComponent3>
}
internal class ComponentStorageTest {
internal class ComponentStorageTest : AbstractTest() {
@Test
fun `can put component`() {
val storage = ConcurrentComponentStorage().apply {

View File

@ -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())

View File

@ -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<H : NetworkHandler>(
private val factory: NetworkHandlerFactory<H>,
) : 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)
)
}
}

View File

@ -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 <R> 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()
}

View File

@ -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

View File

@ -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

View File

@ -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<NettyNetworkHandler>(NettyNetworkHandlerFactory) {
@Test
fun `BotOnlineEvent after successful logon`() = runBlockingUnit {
bot.login()
}
}

View File

@ -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)

View File

@ -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
}
}

View File

@ -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<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()

View File

@ -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()