Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: EXPOSED-653 Split H2 gradle test task by dialects #2317

Merged
merged 2 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ subprojects {

apply(plugin = rootProject.libs.plugins.jvm.get().pluginId)

testDb("h2") {
testDb("h2_v2") {
obabichevjb marked this conversation as resolved.
Show resolved Hide resolved
withContainer = false
dialects("H2_V2", "H2_V2_MYSQL", "H2_V2_PSQL", "H2_V2_MARIADB", "H2_V2_ORACLE", "H2_V2_SQLSERVER")

Expand All @@ -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)
Expand Down
53 changes: 42 additions & 11 deletions buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -26,7 +24,7 @@ class TestDb(val name: String) {

internal val dependencies = mutableListOf<String>()

internal val ignoresSpringTests = name != "h2"
internal val ignoresSpringTests = name != "h2_v2"

inner class DependencyBlock {
fun dependency(dependencyNotation: String) {
Expand Down Expand Up @@ -54,12 +52,49 @@ fun Project.testDb(name: String, block: TestDb.() -> Unit) {
configureCompose(db)
}

val testTask = tasks.register<Test>("test${db.name.capitalized()}") {
description = "Runs tests using ${db.name} database"
val dbTask = createDbTestTask(db)
tasks.named<Test>("test") {
delegatedTo(dbTask)
}
}

private fun Project.createDbTestTask(db: TestDb): TaskProvider<Test> {
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>("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<Test> {
return tasks.register<Test>(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) {
Expand All @@ -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)
Expand All @@ -83,10 +118,6 @@ fun Project.testDb(name: String, block: TestDb.() -> Unit) {
dependsOn(rootProject.tasks.getByName("${db.container}ComposeUp"))
}
}

tasks.named<Test>("test") {
delegatedTo(testTask)
}
}

private fun Project.configureCompose(db: TestDb) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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") {
Expand Down
Loading