mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-24 15:00:38 +08:00
Fix tests
tests Fix StateObserver error
This commit is contained in:
parent
6f8d15ed37
commit
76eaa34917
@ -36,7 +36,7 @@ internal abstract class AbstractMockNetworkHandlerTest : AbstractTest() {
|
|||||||
|
|
||||||
protected val bot: QQAndroidBot = MockBot {
|
protected val bot: QQAndroidBot = MockBot {
|
||||||
nhProvider = { createNetworkHandler() }
|
nhProvider = { createNetworkHandler() }
|
||||||
componentsProvider = { components }
|
componentsProvider = { this@AbstractMockNetworkHandlerTest.components }
|
||||||
}
|
}
|
||||||
protected val logger = MiraiLogger.create("test")
|
protected val logger = MiraiLogger.create("test")
|
||||||
protected val components = ConcurrentComponentStorage().apply {
|
protected val components = ConcurrentComponentStorage().apply {
|
||||||
|
@ -109,18 +109,29 @@ internal abstract class AbstractRealNetworkHandlerTest<H : NetworkHandler> : Abs
|
|||||||
override fun attachJob(bot: AbstractBot, scope: CoroutineScope) {
|
override fun attachJob(bot: AbstractBot, scope: CoroutineScope) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
set(StateObserver, bot.run { stateObserverChain() })
|
// set(StateObserver, bot.run { stateObserverChain() })
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [additionalComponents] overrides [defaultComponents] and [QQAndroidBot.components]
|
* [additionalComponents] overrides [defaultComponents] and [QQAndroidBot.components]
|
||||||
*/
|
*/
|
||||||
open fun createHandler(additionalComponents: ComponentStorage? = null): H {
|
open fun createHandler(additionalComponents: ComponentStorage? = null): H {
|
||||||
|
// StateObserver
|
||||||
|
val components = additionalComponents + defaultComponents + bot.createDefaultComponents()
|
||||||
|
val observerComponents = if (
|
||||||
|
additionalComponents?.getOrNull(StateObserver)
|
||||||
|
?: defaultComponents.getOrNull(StateObserver)
|
||||||
|
== null
|
||||||
|
) {
|
||||||
|
ConcurrentComponentStorage().apply {
|
||||||
|
set(StateObserver, bot.run { components.stateObserverChain() })
|
||||||
|
}
|
||||||
|
} else null
|
||||||
return factory.create(
|
return factory.create(
|
||||||
NetworkHandlerContextImpl(
|
NetworkHandlerContextImpl(
|
||||||
bot,
|
bot,
|
||||||
networkLogger,
|
networkLogger,
|
||||||
additionalComponents + defaultComponents + bot.createDefaultComponents()
|
observerComponents + components
|
||||||
),
|
),
|
||||||
InetSocketAddress.createUnresolved("localhost", 123)
|
InetSocketAddress.createUnresolved("localhost", 123)
|
||||||
)
|
)
|
||||||
|
@ -20,6 +20,9 @@ import net.mamoe.mirai.utils.TestOnly
|
|||||||
import java.util.concurrent.ConcurrentLinkedQueue
|
import java.util.concurrent.ConcurrentLinkedQueue
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
|
|
||||||
|
/**
|
||||||
|
* States are manually set.
|
||||||
|
*/
|
||||||
internal open class TestNetworkHandler(
|
internal open class TestNetworkHandler(
|
||||||
override val bot: QQAndroidBot,
|
override val bot: QQAndroidBot,
|
||||||
context: NetworkHandlerContext,
|
context: NetworkHandlerContext,
|
||||||
@ -63,16 +66,19 @@ internal open class TestNetworkHandler(
|
|||||||
|
|
||||||
|
|
||||||
override fun setStateClosed(exception: Throwable?) {
|
override fun setStateClosed(exception: Throwable?) {
|
||||||
|
setState(NetworkHandler.State.CLOSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setStateConnecting(exception: Throwable?) {
|
override fun setStateConnecting(exception: Throwable?) {
|
||||||
|
setState(NetworkHandler.State.CONNECTING)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setStateOK(channel: Channel, exception: Throwable?) {
|
override fun setStateOK(channel: Channel, exception: Throwable?) {
|
||||||
|
setState(NetworkHandler.State.OK)
|
||||||
exception?.printStackTrace()
|
exception?.printStackTrace()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setStateLoading(channel: Channel) {
|
override fun setStateLoading(channel: Channel) {
|
||||||
|
setState(NetworkHandler.State.LOADING)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,17 +9,13 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.internal.network.handler
|
package net.mamoe.mirai.internal.network.handler
|
||||||
|
|
||||||
import net.mamoe.mirai.event.events.BotReloginEvent
|
|
||||||
import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest
|
import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest
|
||||||
import net.mamoe.mirai.internal.network.framework.eventDispatcher
|
|
||||||
import net.mamoe.mirai.internal.network.framework.ssoProcessor
|
|
||||||
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State
|
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State
|
||||||
import net.mamoe.mirai.internal.network.handler.selector.AbstractKeepAliveNetworkHandlerSelector
|
import net.mamoe.mirai.internal.network.handler.selector.AbstractKeepAliveNetworkHandlerSelector
|
||||||
import net.mamoe.mirai.internal.test.assertEventBroadcasts
|
|
||||||
import net.mamoe.mirai.internal.test.runBlockingUnit
|
import net.mamoe.mirai.internal.test.runBlockingUnit
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import kotlin.test.*
|
import kotlin.test.*
|
||||||
import kotlin.time.seconds
|
import kotlin.time.Duration
|
||||||
|
|
||||||
private class TestSelector :
|
private class TestSelector :
|
||||||
AbstractKeepAliveNetworkHandlerSelector<NetworkHandler> {
|
AbstractKeepAliveNetworkHandlerSelector<NetworkHandler> {
|
||||||
@ -50,7 +46,7 @@ internal class KeepAliveNetworkHandlerSelectorTest : AbstractMockNetworkHandlerT
|
|||||||
setState(State.OK)
|
setState(State.OK)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
runBlockingUnit(timeout = 1.seconds) { selector.awaitResumeInstance() }
|
runBlockingUnit(timeout = Duration.seconds(1)) { selector.awaitResumeInstance() }
|
||||||
assertNotNull(selector.getResumedInstance())
|
assertNotNull(selector.getResumedInstance())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +69,7 @@ internal class KeepAliveNetworkHandlerSelectorTest : AbstractMockNetworkHandlerT
|
|||||||
selector.setCurrent(handler)
|
selector.setCurrent(handler)
|
||||||
assertSame(handler, selector.getResumedInstance())
|
assertSame(handler, selector.getResumedInstance())
|
||||||
handler.setState(State.CLOSED)
|
handler.setState(State.CLOSED)
|
||||||
runBlockingUnit(timeout = 3.seconds) { selector.awaitResumeInstance() }
|
runBlockingUnit(timeout = Duration.seconds(3)) { selector.awaitResumeInstance() }
|
||||||
assertEquals(1, selector.createInstanceCount.get())
|
assertEquals(1, selector.createInstanceCount.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,20 +83,4 @@ internal class KeepAliveNetworkHandlerSelectorTest : AbstractMockNetworkHandlerT
|
|||||||
}
|
}
|
||||||
assertEquals(3, selector.createInstanceCount.get())
|
assertEquals(3, selector.createInstanceCount.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `BotReloginEvent after successful reconnection`() = runBlockingUnit {
|
|
||||||
val network = createNetworkHandler()
|
|
||||||
|
|
||||||
assertEventBroadcasts<BotReloginEvent> {
|
|
||||||
assertEquals(State.INITIALIZED, network.state)
|
|
||||||
bot.login()
|
|
||||||
network.ssoProcessor.firstLoginSucceed = true
|
|
||||||
network.setStateConnecting()
|
|
||||||
network.resumeConnection()
|
|
||||||
network.eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event
|
|
||||||
assertEquals(State.OK, network.state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -17,9 +17,11 @@ import net.mamoe.mirai.event.events.BotOfflineEvent
|
|||||||
import net.mamoe.mirai.event.events.BotOnlineEvent
|
import net.mamoe.mirai.event.events.BotOnlineEvent
|
||||||
import net.mamoe.mirai.event.events.BotReloginEvent
|
import net.mamoe.mirai.event.events.BotReloginEvent
|
||||||
import net.mamoe.mirai.internal.network.components.SsoProcessor
|
import net.mamoe.mirai.internal.network.components.SsoProcessor
|
||||||
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State
|
import net.mamoe.mirai.internal.network.framework.eventDispatcher
|
||||||
|
import net.mamoe.mirai.internal.network.framework.ssoProcessor
|
||||||
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*
|
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*
|
||||||
import net.mamoe.mirai.internal.test.assertEventBroadcasts
|
import net.mamoe.mirai.internal.test.assertEventBroadcasts
|
||||||
|
import net.mamoe.mirai.internal.test.assertEventNotBroadcast
|
||||||
import net.mamoe.mirai.internal.test.runBlockingUnit
|
import net.mamoe.mirai.internal.test.runBlockingUnit
|
||||||
import org.junit.jupiter.api.TestInstance
|
import org.junit.jupiter.api.TestInstance
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
@ -65,7 +67,7 @@ internal class NettyHandlerEventTest : AbstractNettyNHTest() {
|
|||||||
assertEventBroadcasts<BotOfflineEvent>(1) {
|
assertEventBroadcasts<BotOfflineEvent>(1) {
|
||||||
network.setStateClosed()
|
network.setStateClosed()
|
||||||
eventDispatcher.joinBroadcast()
|
eventDispatcher.joinBroadcast()
|
||||||
assertEquals(State.CLOSED, network.state)
|
assertState(CLOSED)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,6 +127,8 @@ internal class NettyHandlerEventTest : AbstractNettyNHTest() {
|
|||||||
ok.get().complete(Unit)
|
ok.get().complete(Unit)
|
||||||
network.resumeConnection()
|
network.resumeConnection()
|
||||||
eventDispatcher.joinBroadcast()
|
eventDispatcher.joinBroadcast()
|
||||||
|
delay(5000) // BotReloginEvent broadcast not started now
|
||||||
|
eventDispatcher.joinBroadcast()
|
||||||
}.let { event ->
|
}.let { event ->
|
||||||
assertEquals(BotOnlineEvent::class, event[0]::class)
|
assertEquals(BotOnlineEvent::class, event[0]::class)
|
||||||
assertEquals(BotReloginEvent::class, event[1]::class)
|
assertEquals(BotReloginEvent::class, event[1]::class)
|
||||||
@ -152,17 +156,31 @@ internal class NettyHandlerEventTest : AbstractNettyNHTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `BotOffline from CONNECTING TO CLOSED`() = runBlockingUnit {
|
fun `no BotOffline from CONNECTING TO CLOSED`() = runBlockingUnit {
|
||||||
network.setStateConnecting()
|
network.setStateConnecting()
|
||||||
eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event
|
eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event
|
||||||
assertEventBroadcasts<Event>(1) {
|
assertEventNotBroadcast {
|
||||||
network.setStateClosed()
|
network.setStateClosed()
|
||||||
network.resumeConnection()
|
network.resumeConnection()
|
||||||
eventDispatcher.joinBroadcast()
|
eventDispatcher.joinBroadcast()
|
||||||
}.let { event ->
|
|
||||||
assertEquals(BotOfflineEvent.Active::class, event[0]::class)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `BotReloginEvent after successful reconnection`() = runBlockingUnit {
|
||||||
|
assertEventBroadcasts<BotReloginEvent> {
|
||||||
|
assertState(INITIALIZED)
|
||||||
|
bot.login()
|
||||||
|
assertState(OK)
|
||||||
|
network.ssoProcessor.firstLoginSucceed = true
|
||||||
|
network.setStateConnecting()
|
||||||
|
network.resumeConnection()
|
||||||
|
assertState(OK)
|
||||||
|
network.eventDispatcher.joinBroadcast()
|
||||||
|
assertState(OK)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// @Test
|
// @Test
|
||||||
// fun `no event from INITIALIZED TO OK`() = runBlockingUnit {
|
// fun `no event from INITIALIZED TO OK`() = runBlockingUnit {
|
||||||
|
@ -55,6 +55,6 @@ internal inline fun <reified T : Event> assertEventBroadcasts(times: Int = 1, bl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
internal inline fun <reified T : Event, R> assertEventNotBroadcast(block: () -> R): R {
|
internal inline fun <R> assertEventNotBroadcast(block: () -> R): R {
|
||||||
return assertEventBroadcasts<T, R>(0, block)
|
return assertEventBroadcasts<Event, R>(0, block)
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user