diff --git a/build.gradle.kts b/build.gradle.kts index 0bafa72a42..5574c0fe43 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -44,7 +44,7 @@ subprojects { apply(plugin = rootProject.libs.plugins.jvm.get().pluginId) - testDb("h2") { + testDb("h2_v2") { withContainer = false dialects("H2_V2", "H2_V2_MYSQL", "H2_V2_PSQL", "H2_V2_MARIADB", "H2_V2_ORACLE", "H2_V2_SQLSERVER") @@ -71,16 +71,18 @@ subprojects { } } - testDb("mysql5") { + testDb("mysql_v5") { port = 3001 + container = "mysql5" dialects("MYSQL_V5") dependencies { dependency(rootProject.libs.mysql51) } } - testDb("mysql8") { + testDb("mysql_v8") { port = 3002 + container = "mysql8" dialects("MYSQL_V8") dependencies { dependency(rootProject.libs.mysql) diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt index 59873af50c..29fb3fb90f 100644 --- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt +++ b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt @@ -8,12 +8,10 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.api.tasks.testing.Test -import org.gradle.configurationcache.extensions.capitalized import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register import java.time.Duration -import java.util.* const val HEALTH_TIMEOUT: Long = 60 @@ -26,7 +24,7 @@ class TestDb(val name: String) { internal val dependencies = mutableListOf() - internal val ignoresSpringTests = name != "h2" + internal val ignoresSpringTests = name != "h2_v2" inner class DependencyBlock { fun dependency(dependencyNotation: String) { @@ -54,12 +52,49 @@ fun Project.testDb(name: String, block: TestDb.() -> Unit) { configureCompose(db) } - val testTask = tasks.register("test${db.name.capitalized()}") { - description = "Runs tests using ${db.name} database" + val dbTask = createDbTestTask(db) + tasks.named("test") { + delegatedTo(dbTask) + } +} + +private fun Project.createDbTestTask(db: TestDb): TaskProvider { + return if (db.dialects.size == 1) { + createDbTestTaskByDialect(db, "test_${db.name.lowercase()}", db.dialects.first()) + } else { + val dialectTasks = db.dialects.map { dialect -> + createDbTestTaskByDialect(db, formatDatabaseWithDialectTaskName(db.name.lowercase(), dialect.lowercase()), dialect) + } + + tasks.register("test_all_${db.name.lowercase()}") { + description = "Runs tests using ${db.name} database" + group = "verification" + + delegatedTo( + tasks = dialectTasks.toTypedArray() + ) + } + } +} + +private fun formatDatabaseWithDialectTaskName(db: String, dialect: String): String { + return listOfNotNull( + "test", + db, + // It's the dialect name without prefixed db name + dialect.replaceFirst(db, "").trim('_').takeIf { it.isNotEmpty() } + ) + .filter { it.isNotEmpty() } + .joinToString(separator = "_") +} + +private fun Project.createDbTestTaskByDialect(db: TestDb, taskName: String, dialect: String): TaskProvider { + return tasks.register(taskName) { + description = "Runs tests using ${db.name} database with $dialect dialect" group = "verification" systemProperties["exposed.test.name"] = db.name systemProperties["exposed.test.container"] = if (db.withContainer) db.container else "none" - systemProperties["exposed.test.dialects"] = db.dialects.joinToString(",") { it.uppercase(Locale.getDefault()) } + systemProperties["exposed.test.dialects"] = dialect outputs.cacheIf { false } if (db.ignoresSpringTests) { @@ -70,7 +105,7 @@ fun Project.testDb(name: String, block: TestDb.() -> Unit) { } } - val driverConfiguration = configurations.create("${db.name}DriverConfiguration") + val driverConfiguration = configurations.create("${db.name}DriverConfiguration_$dialect") dependencies { db.dependencies.forEach { driverConfiguration(it) @@ -83,10 +118,6 @@ fun Project.testDb(name: String, block: TestDb.() -> Unit) { dependsOn(rootProject.tasks.getByName("${db.container}ComposeUp")) } } - - tasks.named("test") { - delegatedTo(testTask) - } } private fun Project.configureCompose(db: TestDb) { diff --git a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/h2/H2Tests.kt b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/h2/H2Tests.kt index a7dd2cbc83..08a9f29232 100644 --- a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/h2/H2Tests.kt +++ b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/h2/H2Tests.kt @@ -7,6 +7,7 @@ import org.jetbrains.exposed.sql.tests.TestDB import org.jetbrains.exposed.sql.tests.currentDialectTest import org.jetbrains.exposed.sql.tests.inProperCase import org.jetbrains.exposed.sql.tests.shared.assertEquals +import org.jetbrains.exposed.sql.tests.shared.assertTrue import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.transactionManager import org.jetbrains.exposed.sql.vendors.H2Dialect @@ -26,7 +27,9 @@ class H2Tests : DatabaseTestsBase() { it.next() it.getString(1) } - if (systemTestName == "h2") { + + assertTrue(systemTestName == "h2_v2" || systemTestName == "h2_v1") + if (systemTestName == "h2_v2") { assertEquals("2", version?.first()?.toString()) } if (systemTestName == "h2_v1") {