mirai/mirai-console/backend/integration-test/src/AbstractTestPointAsPlugin.kt
Eritque arcus 4408750847
mark plugin disabled when it throw exception during enable process (#2022)
* Fix bootstrap when no env specified

* add PluginWithExceptionTest

* Add exceptedExceptionMessage in MCIT(Throwable or Exception may not work?)

* Using red color show disabled plugins in /status command

* Catch exception during enable process

* Count plugins without disabled plugins

* Revert "Fix bootstrap when no env specified"

This reverts commit ff9bb180fd6687c5da27b8a38da2658a1b26ad93.

* format

* format

* halt plugin enable process when mirai failed to enable it dependencies.

* Update mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt hint

Co-authored-by: Him188 <Him188@mamoe.net>

* rename tmp to dependsOn

* Revert changes of PluginManagerImpl

* Plugin callback executions assertions

* Improve & Fix Logic

* Fix PluginDependOnErrorPlugin

* Update err msg

* move dependencies check from JvmPluginInternal.kt to BuiltInJvmPluginLoaderImpl.kt

* typo

* don't throw err caused by dependencies fail

Co-authored-by: Him188 <Him188@mamoe.net>
Co-authored-by: Karlatemp <kar@kasukusakura.com>
2022-06-13 19:45:39 +01:00

96 lines
3.0 KiB
Kotlin

/*
* Copyright 2019-2022 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/dev/LICENSE
*/
package net.mamoe.console.integrationtest
import net.mamoe.mirai.console.extension.PluginComponentStorage
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.createInstanceOrNull
/**
* IntegrationTest 测试单元 (Plugin mode)
*
* 该单元除了拥有 [AbstractTestPoint] 具有的功能之外, 还可以直接模拟一个插件的行为.
*
* 在此单元里, 可以像写正常的 console 插件一样在此写测试时插件
*/
public abstract class AbstractTestPointAsPlugin : AbstractTestPoint() {
protected abstract fun newPluginDescription(): JvmPluginDescription
protected open fun KotlinPlugin.onInit() {}
protected open fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {}
protected open fun KotlinPlugin.onEnable0() {}
protected open fun KotlinPlugin.onDisable0() {}
protected open fun exceptionHandler(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {
IntegrationTestBootstrapContext.failures.add(this.javaClass)
}
private fun callEH(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {
try {
exceptionHandler(exception, step, instance)
} catch (e: Throwable) {
forceFail(cause = e)
}
}
protected enum class JvmPluginExecutionStep {
OnEnable, OnDisable, OnLoad
}
@Suppress("unused")
@PublishedApi
internal abstract class TestPointPluginImpl(
private val impl: AbstractTestPointAsPlugin
) : KotlinPlugin(impl.newPluginDescription()) {
init {
impl.apply { onInit() }
}
@PublishedApi
internal constructor(
impl: Class<out AbstractTestPointAsPlugin>
) : this(
impl.kotlin.createInstanceOrNull() ?: impl.getConstructor().newInstance()
)
override fun onDisable() {
try {
impl.apply { onDisable0() }
} catch (e: Throwable) {
impl.callEH(e, JvmPluginExecutionStep.OnDisable, this)
throw e
}
}
override fun onEnable() {
try {
impl.apply { onEnable0() }
} catch (e: Throwable) {
impl.callEH(e, JvmPluginExecutionStep.OnEnable, this)
throw e
}
}
override fun PluginComponentStorage.onLoad() {
try {
impl.apply { onLoad0(this@onLoad) }
} catch (e: Throwable) {
impl.callEH(e, JvmPluginExecutionStep.OnLoad, this@TestPointPluginImpl)
throw e
}
}
}
}