diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1527ea7..5689647 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,11 +7,13 @@ kotlinx-datetime = "0.6.2" # https://github.com/Kotlin/kotlinx-datetime/relea gradle-testkit = "8.11.1" # https://gradle.org/releases/ parameterize = "0.4.0" # https://github.com/BenWoodworth/Parameterize/releases ktor = "3.1.3" # https://ktor.io/docs/releases.html#release-details +kotest = "6.0.4" # https://github.com/kotest/kotest/releases kti = { strictly = "0.1.0" } # https://gitlab.com/opensavvy/groundwork/kotlin-test-initiative/-/releases testBalloon = "0.8.2-K2.2.0" # https://github.com/infix-de/testBalloon/releases [plugins] testBalloon = { id = "de.infix.testBalloon", version.ref = "testBalloon" } +kotest = { id = "io.kotest", version.ref = "kotest" } [libraries] kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } @@ -22,6 +24,11 @@ gradle-testkit = { module = "dev.gradleplugins:gradle-test-kit", version.ref = " arrow-core = { module = "io.arrow-kt:arrow-core", version.ref = "arrow" } parameterize = { module = "com.benwoodworth.parameterize:parameterize", version.ref = "parameterize" } ktor-testHost = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" } +kotest-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" } +kotest-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } +kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" } +kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } kti = { module = "dev.opensavvy.kti:kotlin-test-initiative", version.ref = "kti" } testBalloon = { module = "de.infix.testBalloon:testBalloon-framework-core", version.ref = "testBalloon" } diff --git a/runners/runner-kotest/build.gradle.kts b/runners/runner-kotest/build.gradle.kts index cf60001..4884a31 100644 --- a/runners/runner-kotest/build.gradle.kts +++ b/runners/runner-kotest/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, OpenSavvy and contributors. + * Copyright (c) 2025-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) alias(libsCommon.plugins.ksp) - id("io.kotest") version libsCommon.versions.kotest + alias(libs.plugins.kotest) } @OptIn(ExperimentalWasmDsl::class) @@ -67,14 +67,13 @@ kotlin { sourceSets.commonMain { dependencies { api(projects.suite) - - api("io.kotest:kotest-framework-engine:${libsCommon.versions.kotest.get()}") + api(libs.kotest.engine) } } sourceSets.jvmMain { dependencies { - api("io.kotest:kotest-runner-junit5:${libsCommon.versions.kotest.get()}") + api(libs.kotest.junit5) } } } -- 2.51.2 From e87b4ae5323569e0fa398a00e165387032776bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 28 Jan 2026 13:18:25 +0100 Subject: [PATCH 02/10] upgrade: Kotest 6.1.3 --- gradle/common.versions.toml | 2 +- gradle/libs.versions.toml | 2 +- runners/runner-kotest/build.gradle.kts | 1 + .../runner-kotest/src/commonMain/kotlin/PreparedSuite.kt | 9 +++++++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index e8dcc94..ac7a467 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -14,7 +14,7 @@ ksp = "2.2.20-2.0.2" compose = "1.8.2" # https://github.com/kotest/kotest/releases -kotest = "6.0.4" +kotest = "6.1.3" # https://github.com/infix-de/testBalloon/releases testBalloon = "0.7.1-K2.2.0" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5689647..58712f2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ kotlinx-datetime = "0.6.2" # https://github.com/Kotlin/kotlinx-datetime/relea gradle-testkit = "8.11.1" # https://gradle.org/releases/ parameterize = "0.4.0" # https://github.com/BenWoodworth/Parameterize/releases ktor = "3.1.3" # https://ktor.io/docs/releases.html#release-details -kotest = "6.0.4" # https://github.com/kotest/kotest/releases +kotest = "6.1.3" # https://github.com/kotest/kotest/releases kti = { strictly = "0.1.0" } # https://gitlab.com/opensavvy/groundwork/kotlin-test-initiative/-/releases testBalloon = "0.8.2-K2.2.0" # https://github.com/infix-de/testBalloon/releases diff --git a/runners/runner-kotest/build.gradle.kts b/runners/runner-kotest/build.gradle.kts index 4884a31..c16be49 100644 --- a/runners/runner-kotest/build.gradle.kts +++ b/runners/runner-kotest/build.gradle.kts @@ -68,6 +68,7 @@ kotlin { dependencies { api(projects.suite) api(libs.kotest.engine) + implementation(libsCommon.kotlin.test) // Force the version of the stdlib, important on JS } } diff --git a/runners/runner-kotest/src/commonMain/kotlin/PreparedSuite.kt b/runners/runner-kotest/src/commonMain/kotlin/PreparedSuite.kt index 9363da2..a955865 100644 --- a/runners/runner-kotest/src/commonMain/kotlin/PreparedSuite.kt +++ b/runners/runner-kotest/src/commonMain/kotlin/PreparedSuite.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023-2025, OpenSavvy and contributors. + * Copyright (c) 2023-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package opensavvy.prepared.runner.kotest import io.kotest.core.names.TestName import io.kotest.core.spec.KotestTestScope import io.kotest.core.spec.style.StringSpec +import io.kotest.core.spec.style.TestXMethod import io.kotest.core.spec.style.scopes.RootScope import io.kotest.core.spec.style.scopes.addTest import io.kotest.engine.coroutines.coroutineTestScope @@ -90,8 +91,12 @@ private class NonNestedSuite(private val root: RootScope, private val parentConf suffix = null, defaultAffixes = false, ), - disabled = false, config = kotestConfig, + xmethod = when { + testName.startsWith(FOCUS_PREFIX) -> TestXMethod.FOCUSED + testName.startsWith(BANG_PREFIX) -> TestXMethod.DISABLED + else -> TestXMethod.NONE + }, ) { coroutineTestScope.runTestDslSuspend(name, config, block) } -- 2.51.2 From d7806f23758d2b5b0450719d58caa5ad6fb586e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 28 Jan 2026 15:45:22 +0100 Subject: [PATCH 03/10] upgrade: Kotlin 2.2.21 --- gradle/common.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index ac7a467..23da5ac 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -5,10 +5,10 @@ [versions] # https://kotlinlang.org/docs/releases.html#release-details -kotlin = "2.2.20" +kotlin = "2.2.21" # https://github.com/google/ksp/releases -ksp = "2.2.20-2.0.2" +ksp = "2.2.21-2.0.4" # https://github.com/JetBrains/compose-multiplatform/releases compose = "1.8.2" @@ -17,7 +17,7 @@ compose = "1.8.2" kotest = "6.1.3" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.7.1-K2.2.0" +testBalloon = "0.7.1-K2.2.21" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.1.1" -- 2.51.2 From baa18c1a1b636c7eb35b6c86689b0652f11351df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Thu, 5 Feb 2026 13:46:46 +0100 Subject: [PATCH 04/10] upgrade: Kotlin 2.3.0 & KSP 2.3.5 --- gradle/common.versions.toml | 6 +++--- gradle/libs.versions.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 23da5ac..ad0fdde 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -5,10 +5,10 @@ [versions] # https://kotlinlang.org/docs/releases.html#release-details -kotlin = "2.2.21" +kotlin = "2.3.0" # https://github.com/google/ksp/releases -ksp = "2.2.21-2.0.4" +ksp = "2.3.5" # https://github.com/JetBrains/compose-multiplatform/releases compose = "1.8.2" @@ -17,7 +17,7 @@ compose = "1.8.2" kotest = "6.1.3" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.7.1-K2.2.21" +testBalloon = "0.7.1-K2.3.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.1.1" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 58712f2..fd38416 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ parameterize = "0.4.0" # https://github.com/BenWoodworth/Parameterize/rel ktor = "3.1.3" # https://ktor.io/docs/releases.html#release-details kotest = "6.1.3" # https://github.com/kotest/kotest/releases kti = { strictly = "0.1.0" } # https://gitlab.com/opensavvy/groundwork/kotlin-test-initiative/-/releases -testBalloon = "0.8.2-K2.2.0" # https://github.com/infix-de/testBalloon/releases +testBalloon = "0.8.2-K2.3.0" # https://github.com/infix-de/testBalloon/releases [plugins] testBalloon = { id = "de.infix.testBalloon", version.ref = "testBalloon" } -- 2.51.2 From 49dd012800891861cc8a97292b0dc0ae776d9a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Thu, 5 Feb 2026 16:18:47 +0100 Subject: [PATCH 05/10] build(template-app): Force the Kotest plugin and engine versions --- gradle/common.versions.toml | 4 ++++ .../templates/template-app/build.gradle.kts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index ad0fdde..493493e 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -36,6 +36,9 @@ kotlinx-powerAssert = { id = "org.jetbrains.kotlin.plugin.power-assert", version ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +# Kotest Gradle plugin for KMP (v6.0+) +kotest = { id = "io.kotest", version.ref = "kotest" } + compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose" } @@ -45,6 +48,7 @@ testBalloon = { id = "de.infix.testBalloon", version.ref = "testBalloon" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test-junit5 = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" } +kotest-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" } kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" } kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts index 67d8057..567492c 100644 --- a/gradle/templates/template-app/build.gradle.kts +++ b/gradle/templates/template-app/build.gradle.kts @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2026, OpenSavvy and contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + @file:OptIn(ExperimentalWasmDsl::class, ExperimentalKotlinGradlePluginApi::class) import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi @@ -7,6 +23,7 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.application) alias(libsCommon.plugins.ksp) + alias(libsCommon.plugins.kotest) } kotlin { @@ -47,5 +64,7 @@ kotlin { sourceSets.commonTest.dependencies { implementation(libsCommon.opensavvy.prepared.kotest) + implementation(libsCommon.kotest.engine) + implementation(libsCommon.kotest.assertions) } } -- 2.51.2 From 09cf22bb67b51983d5ff4548d05aeea8b90c1653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Thu, 5 Feb 2026 16:34:15 +0100 Subject: [PATCH 06/10] build: Force the version of the Kotlin-test library --- compat/compat-ktor/build.gradle.kts | 5 +++-- runners/runner-kotest/build.gradle.kts | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/compat/compat-ktor/build.gradle.kts b/compat/compat-ktor/build.gradle.kts index 7f4c575..53e2f6f 100644 --- a/compat/compat-ktor/build.gradle.kts +++ b/compat/compat-ktor/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, OpenSavvy and contributors. + * Copyright (c) 2025-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,7 +74,8 @@ kotlin { sourceSets.commonTest { dependencies { implementation(projects.runners.runnerTestballoon) - implementation("io.kotest:kotest-assertions-core:${libsCommon.versions.kotest.get()}") + implementation(libsCommon.kotest.assertions) + implementation(libsCommon.kotlin.test) } } } diff --git a/runners/runner-kotest/build.gradle.kts b/runners/runner-kotest/build.gradle.kts index c16be49..e2acbd2 100644 --- a/runners/runner-kotest/build.gradle.kts +++ b/runners/runner-kotest/build.gradle.kts @@ -72,6 +72,12 @@ kotlin { } } + sourceSets.commonTest { + dependencies { + implementation(libsCommon.kotlin.test) + } + } + sourceSets.jvmMain { dependencies { api(libs.kotest.junit5) -- 2.51.2 From a76527db7238cfb4e2fef39abbb992425ec1ae70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 09:25:02 +0100 Subject: [PATCH 07/10] ci(gitlab): Upgrade to OpenSavvy Containers 0.8.5 --- .gitlab-ci.main.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts index 196294a..c16e1e9 100755 --- a/.gitlab-ci.main.kts +++ b/.gitlab-ci.main.kts @@ -28,7 +28,7 @@ import opensavvy.gitlab.ci.script.shell /** * The version of images downloaded from https://gitlab.com/opensavvy/automation/containers */ -val ciContainers = "0.8.1" +val ciContainers = "0.8.5" /** * The URL of the website built by /docs/website. -- 2.51.2 From 5ae8e6d1a716edd5ecada8b9d9d59867ad4ffe31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 10:17:09 +0100 Subject: [PATCH 08/10] build(gradle): The template projects use the Prepared version overrides, not the common OpenSavvy versions --- .../templates/template-app/build.gradle.kts | 8 ++++---- .../templates/template-lib/build.gradle.kts | 20 +++++++++++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts index 567492c..91c8293 100644 --- a/gradle/templates/template-app/build.gradle.kts +++ b/gradle/templates/template-app/build.gradle.kts @@ -23,7 +23,7 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.application) alias(libsCommon.plugins.ksp) - alias(libsCommon.plugins.kotest) + alias(libs.plugins.kotest) } kotlin { @@ -63,8 +63,8 @@ kotlin { } sourceSets.commonTest.dependencies { - implementation(libsCommon.opensavvy.prepared.kotest) - implementation(libsCommon.kotest.engine) - implementation(libsCommon.kotest.assertions) + implementation(projects.runners.runnerKotest) + implementation(libs.kotest.engine) + implementation(libs.kotest.assertions) } } diff --git a/gradle/templates/template-lib/build.gradle.kts b/gradle/templates/template-lib/build.gradle.kts index 0e03cb8..9b7aceb 100644 --- a/gradle/templates/template-lib/build.gradle.kts +++ b/gradle/templates/template-lib/build.gradle.kts @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2026, OpenSavvy and contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + @file:OptIn(ExperimentalWasmDsl::class) import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl @@ -5,7 +21,7 @@ import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) + alias(libs.plugins.testBalloon) } kotlin { @@ -42,7 +58,7 @@ kotlin { } sourceSets.commonTest.dependencies { - implementation(libsCommon.opensavvy.prepared.testBalloon) + implementation(projects.runners.runnerTestballoon) implementation(libsCommon.kotlin.test) } } -- 2.51.2 From 45aeff48cf1fc8e3abd43debf71c49a7b1ac2323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 10:18:24 +0100 Subject: [PATCH 09/10] test(suite): Add an empty test as an initialization buffer to allow faster subsequent tests --- suite/src/commonTest/kotlin/AsyncTest.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/suite/src/commonTest/kotlin/AsyncTest.kt b/suite/src/commonTest/kotlin/AsyncTest.kt index 60d4132..d3e7db8 100644 --- a/suite/src/commonTest/kotlin/AsyncTest.kt +++ b/suite/src/commonTest/kotlin/AsyncTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, OpenSavvy and contributors. + * Copyright (c) 2025-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,13 @@ import opensavvy.prepared.suite.config.CoroutineTimeout import kotlin.time.Duration.Companion.seconds val AsyncTest by preparedSuite { - test("A background task should not stop the test from finishing", CoroutineTimeout(3.seconds)) { + test("empty test") { + // This test purposefully left empty to initialize everything + // The debug probes can take more than 3s to initialize, so without this test the next one would fail + // with a timeout before it even starts. + } + + test("A background task should not stop the test from finishing", CoroutineTimeout(1.seconds)) { println("foo") launchInBackground { // This coroutine should not block the end of the test. -- 2.51.2 From 4790442e667680466697c63b5874ee09b54e3d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 14:40:50 +0100 Subject: [PATCH 10/10] build(gradle): Increase Gradle heap & metaspace size --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4cdb6cf..e9f4d62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -45,5 +45,5 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled kotlin.js.yarn=false # System resource usage -org.gradle.jvmargs=-Xmx3g -Xms200m -XX:MaxMetaspaceSize=512m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent +org.gradle.jvmargs=-Xmx4g -Xms200m -XX:MaxMetaspaceSize=640m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent kotlin.daemon.jvmargs=-Xmx3g -Xms128m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:NewRatio=2 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=15000 -XX:-G1PeriodicGCInvokesConcurrent