Skip to content

Commit 639fe1c

Browse files
aparajonsvc-squareup-copybara
authored andcommitted
Add a new Misk module which includes a Gradle plugin for
starting a Vitess test database GitOrigin-RevId: 3b4699e9df7c4d83ba6fdf340de4e0e9503a77cc
1 parent 880dc55 commit 639fe1c

File tree

16 files changed

+329
-0
lines changed

16 files changed

+329
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Vitess Database Gradle Plugin
2+
3+
This module provides a Gradle plugin for starting a Vitess test database. It serves as a wrapper around [VitessTestDb](../misk-vitess/README.md#vitesstestdb) and automatically processes schema changes / database migrations.
4+
5+
## Usage
6+
7+
For simple usage, update your build.gradle.kts file with the following:
8+
9+
```
10+
plugins {
11+
id("com.squareup.misk.vitess.vitess-database")
12+
}
13+
14+
tasks.withType<Test>().configureEach {
15+
// Start the Vitess test database before running tests
16+
dependsOn("startVitessDatabase")
17+
}
18+
```
19+
20+
To customize Vitess test database properties:
21+
22+
```
23+
import misk.vitess.gradle.StartVitessDatabaseTask
24+
25+
plugins {
26+
id("com.squareup.misk.vitess.vitess-database")
27+
}
28+
29+
val startVitessDatabase = tasks.named("startVitessDatabase", StartVitessDatabaseTask::class.java) {
30+
containerName.set("my_vitess_db")
31+
lintSchema.set(true)
32+
mysqlVersion.set("8.0.42")
33+
vitessImage.set("vitess/vttestserver:v19.0.9-mysql80")
34+
}
35+
36+
tasks.withType<Test>().configureEach {
37+
// Start the Vitess test database before running tests
38+
dependsOn(startVitessDatabase)
39+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
public abstract class misk/vitess/gradle/StartVitessDatabaseTask : org/gradle/api/DefaultTask {
2+
public fun <init> ()V
3+
public abstract fun getAutoApplySchemaChanges ()Lorg/gradle/api/provider/Property;
4+
public abstract fun getContainerName ()Lorg/gradle/api/provider/Property;
5+
public abstract fun getDebugStartup ()Lorg/gradle/api/provider/Property;
6+
public abstract fun getEnableDeclarativeSchemaChanges ()Lorg/gradle/api/provider/Property;
7+
public abstract fun getEnableScatters ()Lorg/gradle/api/provider/Property;
8+
public abstract fun getKeepAlive ()Lorg/gradle/api/provider/Property;
9+
public abstract fun getLintSchema ()Lorg/gradle/api/provider/Property;
10+
public abstract fun getMysqlVersion ()Lorg/gradle/api/provider/Property;
11+
public abstract fun getPort ()Lorg/gradle/api/provider/Property;
12+
public abstract fun getSchemaDir ()Lorg/gradle/api/provider/Property;
13+
public abstract fun getSqlMode ()Lorg/gradle/api/provider/Property;
14+
public abstract fun getTransactionTimeoutSeconds ()Lorg/gradle/api/provider/Property;
15+
public abstract fun getVitessImage ()Lorg/gradle/api/provider/Property;
16+
public abstract fun getVitessVersion ()Lorg/gradle/api/provider/Property;
17+
public final fun start ()V
18+
}
19+
20+
public final class misk/vitess/gradle/VitessDatabasePlugin : org/gradle/api/Plugin {
21+
public fun <init> ()V
22+
public synthetic fun apply (Ljava/lang/Object;)V
23+
public fun apply (Lorg/gradle/api/Project;)V
24+
}
25+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import com.vanniktech.maven.publish.GradlePlugin
2+
import com.vanniktech.maven.publish.JavadocJar
3+
4+
plugins {
5+
id("org.jetbrains.kotlin.jvm")
6+
id("com.vanniktech.maven.publish.base")
7+
id("java-gradle-plugin")
8+
}
9+
10+
gradlePlugin {
11+
plugins {
12+
create("VitessDatabasePlugin") {
13+
id = "com.squareup.misk.vitess.vitess-database"
14+
implementationClass = "misk.vitess.gradle.VitessDatabasePlugin"
15+
}
16+
}
17+
}
18+
19+
dependencies {
20+
implementation(testFixtures(project(":misk-vitess")))
21+
testImplementation(gradleTestKit())
22+
testImplementation(libs.assertj)
23+
testImplementation(libs.junitApi)
24+
testImplementation(libs.junitParams)
25+
testImplementation(libs.mysqlConnector)
26+
}
27+
28+
mavenPublishing {
29+
configure(
30+
GradlePlugin(javadocJar = JavadocJar.Dokka("dokkaGfm"))
31+
)
32+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package misk.vitess.gradle
2+
3+
import misk.vitess.testing.VitessTestDb
4+
import org.gradle.api.DefaultTask
5+
import org.gradle.api.provider.Property
6+
import org.gradle.api.tasks.Input
7+
import org.gradle.api.tasks.TaskAction
8+
import org.gradle.api.tasks.UntrackedTask
9+
import java.time.Duration
10+
11+
@UntrackedTask(because = "Every task run re-initializes the database if needed")
12+
abstract class StartVitessDatabaseTask: DefaultTask() {
13+
14+
@get:Input
15+
abstract val autoApplySchemaChanges: Property<Boolean>
16+
17+
@get:Input
18+
abstract val containerName: Property<String>
19+
20+
@get:Input
21+
abstract val debugStartup: Property<Boolean>
22+
23+
@get:Input
24+
abstract val enableDeclarativeSchemaChanges: Property<Boolean>
25+
26+
@get:Input
27+
abstract val enableScatters: Property<Boolean>
28+
29+
@get:Input
30+
abstract val keepAlive: Property<Boolean>
31+
32+
@get:Input
33+
abstract val lintSchema: Property<Boolean>
34+
35+
@get:Input
36+
abstract val mysqlVersion: Property<String>
37+
38+
@get:Input
39+
abstract val port: Property<Int>
40+
41+
@get:Input
42+
abstract val schemaDir: Property<String>
43+
44+
@get:Input
45+
abstract val sqlMode: Property<String>
46+
47+
@get:Input
48+
abstract val transactionTimeoutSeconds: Property<Duration>
49+
50+
@get:Input
51+
abstract val vitessImage: Property<String>
52+
53+
@get:Input
54+
abstract val vitessVersion: Property<Int>
55+
56+
@TaskAction
57+
fun start() {
58+
val vitessTestDb = VitessTestDb(
59+
autoApplySchemaChanges = autoApplySchemaChanges.get(),
60+
containerName = containerName.get(),
61+
debugStartup = debugStartup.get(),
62+
enableDeclarativeSchemaChanges = enableDeclarativeSchemaChanges.get(),
63+
enableScatters = enableScatters.get(),
64+
keepAlive = keepAlive.get(),
65+
lintSchema = lintSchema.get(),
66+
mysqlVersion = mysqlVersion.get(),
67+
port = port.get(),
68+
schemaDir = schemaDir.get(),
69+
sqlMode = sqlMode.get(),
70+
transactionTimeoutSeconds = transactionTimeoutSeconds.get(),
71+
vitessImage = vitessImage.get(),
72+
vitessVersion = vitessVersion.get()
73+
)
74+
75+
vitessTestDb.run()
76+
}
77+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package misk.vitess.gradle
2+
3+
import misk.vitess.testing.DefaultSettings
4+
import org.gradle.api.Plugin
5+
import org.gradle.api.Project
6+
7+
class VitessDatabasePlugin: Plugin<Project> {
8+
override fun apply(project: Project) {
9+
project.tasks.register("startVitessDatabase", StartVitessDatabaseTask::class.java) {
10+
it.autoApplySchemaChanges.convention(DefaultSettings.AUTO_APPLY_SCHEMA_CHANGES)
11+
it.containerName.convention(DefaultSettings.CONTAINER_NAME)
12+
it.debugStartup.convention(DefaultSettings.DEBUG_STARTUP)
13+
it.enableDeclarativeSchemaChanges.convention(DefaultSettings.ENABLE_DECLARATIVE_SCHEMA_CHANGES)
14+
it.enableScatters.convention(DefaultSettings.ENABLE_SCATTERS)
15+
it.keepAlive.convention(DefaultSettings.KEEP_ALIVE)
16+
it.lintSchema.convention(DefaultSettings.LINT_SCHEMA)
17+
it.mysqlVersion.convention(DefaultSettings.MYSQL_VERSION)
18+
it.port.convention(DefaultSettings.PORT)
19+
it.schemaDir.convention("filesystem:${project.layout.projectDirectory.dir("src/main/resources/vitess/schema").asFile.absolutePath}")
20+
it.sqlMode.convention(DefaultSettings.SQL_MODE)
21+
it.transactionTimeoutSeconds.convention(DefaultSettings.TRANSACTION_TIMEOUT_SECONDS)
22+
it.vitessImage.convention(DefaultSettings.VITESS_IMAGE)
23+
it.vitessVersion.convention(DefaultSettings.VITESS_VERSION)
24+
}
25+
}
26+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package misk.vitess.gradle
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.gradle.testkit.runner.GradleRunner
5+
import org.gradle.testkit.runner.TaskOutcome
6+
import org.junit.jupiter.api.Assertions.assertEquals
7+
import org.junit.jupiter.api.Test
8+
import java.io.File
9+
import java.sql.Connection
10+
import java.sql.DriverManager
11+
import java.sql.ResultSet
12+
import java.sql.Statement
13+
14+
class VitessDatabasePluginTest {
15+
@Test
16+
fun `start VitessTestDb with custom parameters`() {
17+
val testProjectDir = File(this.javaClass.getResource("/vitess-database-plugin-test")!!.file)
18+
19+
val result = GradleRunner.create()
20+
.withProjectDir(testProjectDir)
21+
.withArguments("startVitessDatabase")
22+
.withPluginClasspath()
23+
.forwardOutput()
24+
.build()
25+
26+
assertThat(result.task(":startVitessDatabase")!!.outcome).isEqualTo(TaskOutcome.SUCCESS)
27+
28+
val resultSet: ResultSet = executeQuery("SHOW KEYSPACES;")
29+
var rowCount = 0
30+
while (resultSet.next()) {
31+
rowCount++
32+
}
33+
34+
assertEquals(2, rowCount)
35+
}
36+
37+
private fun executeQuery(query: String): ResultSet {
38+
val url = "jdbc:mysql://localhost:31503/@primary"
39+
val user = "root"
40+
val password = ""
41+
val connection: Connection = DriverManager.getConnection(url, user, password)
42+
val statement: Statement = connection.createStatement()
43+
return statement.executeQuery(query)
44+
}
45+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import misk.vitess.gradle.StartVitessDatabaseTask
2+
3+
plugins {
4+
id("com.squareup.misk.vitess.vitess-database")
5+
}
6+
7+
val startVitessDatabase = tasks.named("startVitessDatabase", StartVitessDatabaseTask::class.java) {
8+
containerName.set("plugin_test_vitess_db")
9+
lintSchema.set(true)
10+
port.set(31503)
11+
schemaDir.set("filesystem:${layout.projectDirectory.dir("src/main/resources/vitess/schema")}")
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.gradle.configuration-cache=true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rootProject.name = "test"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CREATE TABLE `customers_seq` (
2+
`id` tinyint unsigned NOT NULL DEFAULT '0',
3+
`next_id` bigint unsigned DEFAULT NULL,
4+
`cache` bigint unsigned DEFAULT NULL,
5+
PRIMARY KEY (`id`)
6+
) ENGINE=InnoDB COMMENT='vitess_sequence';

0 commit comments

Comments
 (0)