diff --git a/base/src/test/kotlin/de/staropensource/engine/base/TestBase.kt b/base/src/test/kotlin/de/staropensource/engine/base/TestBase.kt new file mode 100644 index 0000000..0b99cbf --- /dev/null +++ b/base/src/test/kotlin/de/staropensource/engine/base/TestBase.kt @@ -0,0 +1,47 @@ +/* + * STAROPENSOURCE ENGINE SOURCE FILE + * Copyright (c) 2024 The StarOpenSource Engine Authors + * Licensed under the GNU Affero General Public License v3 + * with an exception allowing classpath linking. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.staropensource.engine.base + +import de.staropensource.engine.base.type.logging.Level +import de.staropensource.engine.testing.TestBase + +/** + * Base class for implementing tests. + * + * This class sets some nice defaults + * and adds other things only useful to us. + * + * @param autoManage automatically initializes and shuts the engine down after each test + * @param logLevels contains the allowed log levels + * @param shutdownMarksFailure whether engine shutdowns should mark the test as failed + * @since v1-alpha10 + */ +abstract class TestBase( + autoManage: Boolean? = null, + logLevels: Array? = null, + shutdownMarksFailure: Boolean? = null +) : TestBase( + autoManage = autoManage != false, + suppressInitAndShutdownLogging = true, + logLevels = logLevels ?: Level.entries.toTypedArray(), + printTestExecution = true, + shutdownMarksFailure = shutdownMarksFailure == true +) diff --git a/build.gradle.kts b/build.gradle.kts index a76d143..32426cb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -177,6 +177,7 @@ allprojects { // -> Configure Gradle to use JUnit tasks.test { useJUnitPlatform() + testLogging { events( "passed", diff --git a/testing/src/main/kotlin/de/staropensource/engine/testing/TestBase.kt b/testing/src/main/kotlin/de/staropensource/engine/testing/TestBase.kt index 7f9a1a4..3235c3e 100644 --- a/testing/src/main/kotlin/de/staropensource/engine/testing/TestBase.kt +++ b/testing/src/main/kotlin/de/staropensource/engine/testing/TestBase.kt @@ -24,28 +24,83 @@ import de.staropensource.engine.base.Engine import de.staropensource.engine.base.Engine.State import de.staropensource.engine.base.EngineConfiguration import de.staropensource.engine.base.type.logging.ChannelSettings +import de.staropensource.engine.base.type.logging.Level import de.staropensource.engine.testing.implementation.FailureShutdownHandler +import de.staropensource.engine.testing.implementation.NoOperationShutdownHandler import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestInfo import org.junit.jupiter.api.fail +import kotlin.concurrent.fixedRateTimer +import kotlin.jvm.optionals.getOrDefault +import kotlin.jvm.optionals.getOrNull /** * Base class for implementing tests. * - * @param autoManage automatically initializes and shuts the engine down after each test + * @param autoManage automatically initializes and shuts the engine down after each test * @param suppressInitAndShutdownLogging if to suppress the engine's log output during engine initialization and shutdown. Only takes effect if [autoManage] is `true` - * @param shutdownMarksFailure whether engine shutdowns should mark the test as failed + * @param logLevels contains the allowed log levels + * @param printTestExecution whether to display when a test started and ended. Useful when dealing with a lot of log output + * @param shutdownMarksFailure whether engine shutdowns should mark the test as failed * @since v1-alpha10 */ abstract class TestBase( val autoManage: Boolean = true, val suppressInitAndShutdownLogging: Boolean = true, + val logLevels: Array = arrayOf(Level.INFORMATIONAL, Level.WARNING, Level.ERROR, Level.CRASH), + val printTestExecution: Boolean = true, val shutdownMarksFailure: Boolean = false ) { init { performConfiguration() } + /** + * Initializes the engine before each test. + * + * @since v1-alpha10 + */ + @BeforeEach + fun beforeTask(testInfo: TestInfo) { + when (Engine.state) { + State.INITIALIZING, State.SHUTTING_DOWN -> fail("Engine is in invalid state 'Engine.State.${Engine.state.name}'") + State.CRASHED -> fail("The StarOpenSource Engine has crashed") + else -> {} + } + + // Initialize engine + initializeEngine() + + // Print test starting + if (printTestExecution) + println("-> STARTING test '${testInfo.displayName}' [${testInfo.testClass.getOrNull()?.name ?: ""}#${testInfo.testMethod.getOrNull()?.name ?: ""}]") + } + + /** + * Shuts the engine down after each test + * + * @since v1-alpha10 + */ + @AfterEach + fun afterTask(testInfo: TestInfo) { + when (Engine.state) { + State.UNINITIALIZED -> fail("Internal inconsistency detected: Engine configuration was not performed") + State.INITIALIZING, State.SHUTTING_DOWN -> fail("Engine is in invalid state 'Engine.State.${Engine.state.name}'") + State.CRASHED -> fail("The StarOpenSource Engine has crashed") + else -> {} + } + + // Shutdown engine + shutdownEngine() + + // Print test ending + if (printTestExecution) + println("-> FINISHED test '${testInfo.displayName}' [${testInfo.testClass.getOrNull()?.name ?: ""}#${testInfo.testMethod.getOrNull()?.name ?: ""}]") + } + + + // -----> Utility methods /** * Configures the engine before * starting any tests. @@ -60,24 +115,17 @@ abstract class TestBase( if (shutdownMarksFailure) EngineConfiguration.shutdownHandler = FailureShutdownHandler.instance else - EngineConfiguration.shutdownHandler = FailureShutdownHandler.instance + EngineConfiguration.shutdownHandler = NoOperationShutdownHandler.instance - //if (Engine.state == State.UNINITIALIZED) {} + EngineConfiguration.logLevels = logLevels.toMutableSet() } /** - * Initializes the engine before each test. + * Initializes the StarOpenSource Engine. * * @since v1-alpha10 */ - @BeforeEach - fun initializeEngine() { - when (Engine.state) { - State.INITIALIZING, State.SHUTTING_DOWN -> fail("Engine is in invalid state 'Engine.State.${Engine.state.name}'") - State.CRASHED -> fail("The StarOpenSource Engine has crashed") - else -> {} - } - + private fun initializeEngine() { if (autoManage) { val originalSettings: ChannelSettings = ChannelSettings.global @@ -95,19 +143,11 @@ abstract class TestBase( } /** - * Shuts the engine down after each test + * Shuts the StarOpenSource Engine down. * * @since v1-alpha10 */ - @AfterEach - fun shutdownEngine() { - when (Engine.state) { - State.UNINITIALIZED -> fail("Internal inconsistency detected: Engine configuration was not performed") - State.INITIALIZING, State.SHUTTING_DOWN -> fail("Engine is in invalid state 'Engine.State.${Engine.state.name}'") - State.CRASHED -> fail("The StarOpenSource Engine has crashed") - else -> {} - } - + private fun shutdownEngine() { if (autoManage) { val originalSettings: ChannelSettings = ChannelSettings.global