Skip to content

Commit f51869a

Browse files
authored
Gradle plugin tests (#413)
1 parent 3082a69 commit f51869a

File tree

65 files changed

+1528
-142
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+1528
-142
lines changed

gradle-plugin/api/gradle-plugin.api

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/
8585

8686
public class kotlinx/rpc/buf/BufTasksExtension {
8787
public fun <init> (Lorg/gradle/api/Project;)V
88-
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/gradle/api/provider/Provider;
88+
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lkotlinx/rpc/buf/BufTasksExtension$TaskProvider;
89+
}
90+
91+
public abstract interface class kotlinx/rpc/buf/BufTasksExtension$TaskProvider {
92+
public abstract fun getMainTask ()Lorg/gradle/api/provider/Provider;
93+
public abstract fun getTestTask ()Lorg/gradle/api/provider/Provider;
8994
}
9095

9196
public final class kotlinx/rpc/buf/ConstsKt {
@@ -149,7 +154,7 @@ public abstract interface class kotlinx/rpc/grpc/GrpcExtension {
149154
}
150155

151156
public final class kotlinx/rpc/proto/ConstsKt {
152-
public static final field KXRPC_PLUGIN_JAR_CONFIGURATION Ljava/lang/String;
157+
public static final field PROTOC_GEN_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
153158
public static final field PROTO_BUILD_DIR Ljava/lang/String;
154159
public static final field PROTO_BUILD_GENERATED Ljava/lang/String;
155160
public static final field PROTO_BUILD_SOURCE_SETS Ljava/lang/String;
@@ -160,8 +165,8 @@ public final class kotlinx/rpc/proto/ConstsKt {
160165
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
161166
}
162167

163-
public final class kotlinx/rpc/proto/KxrpcPluginJarKt {
164-
public static final fun getKxrpcProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
168+
public final class kotlinx/rpc/proto/KotlinMultiplatformPluginJarKt {
169+
public static final fun getKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
165170
}
166171

167172
public abstract class kotlinx/rpc/proto/ProcessProtoFiles : org/gradle/api/tasks/Copy {
@@ -185,7 +190,7 @@ public class kotlinx/rpc/proto/ProtocPlugin {
185190
public static final field Companion Lkotlinx/rpc/proto/ProtocPlugin$Companion;
186191
public static final field GRPC_JAVA Ljava/lang/String;
187192
public static final field GRPC_KOTLIN Ljava/lang/String;
188-
public static final field KXRPC Ljava/lang/String;
193+
public static final field KOTLIN_MULTIPLATFORM Ljava/lang/String;
189194
public static final field PROTOBUF_JAVA Ljava/lang/String;
190195
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
191196
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
@@ -207,6 +212,7 @@ public abstract class kotlinx/rpc/proto/ProtocPlugin$Artifact {
207212
public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Local : kotlinx/rpc/proto/ProtocPlugin$Artifact {
208213
public fun <init> (Lorg/gradle/api/Project;)V
209214
public final fun executor (Lorg/gradle/api/provider/Provider;)V
215+
public final fun executor ([Ljava/lang/String;)V
210216
public final fun getExecutor ()Lorg/gradle/api/provider/ListProperty;
211217
public final fun javaJar (Ljava/lang/String;)V
212218
public final fun javaJar (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;)V
@@ -231,11 +237,11 @@ public final class kotlinx/rpc/proto/ProtocPlugin$Strategy : java/lang/Enum {
231237
public final class kotlinx/rpc/proto/ProtocPluginKt {
232238
public static final fun getGrpcJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
233239
public static final fun getGrpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
234-
public static final fun getKxrpc (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
240+
public static final fun getKotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
235241
public static final fun getProtobufJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
236242
public static final fun grpcJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
237243
public static final fun grpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
238-
public static final fun kxrpc (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
244+
public static final fun kotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
239245
public static final fun protobufJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
240246
}
241247

gradle-plugin/build.gradle.kts

Lines changed: 82 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,28 @@ kotlin {
2121
}
2222

2323
dependencies {
24-
compileOnly(libs.kotlin.gradle.plugin)
24+
implementation(libs.kotlin.gradle.plugin)
25+
26+
testImplementation(libs.kotlin.gradle.plugin)
27+
testImplementation(gradleTestKit())
28+
testImplementation(platform(libs.junit5.bom))
29+
testImplementation(libs.kotlin.test.junit5)
30+
testImplementation(libs.junit5.jupiter)
31+
testImplementation(libs.junit5.jupiter.api)
32+
testRuntimeOnly(libs.junit5.platform.launcher)
33+
34+
testImplementation(libs.logback.classic)
35+
}
36+
37+
tasks.test {
38+
val forwardOutput: Boolean = (properties.getOrDefault("gradle.test.forward.output", "false")
39+
as String).toBooleanStrictOrNull() ?: false
40+
41+
systemProperty("gradle.test.forward.output", forwardOutput)
42+
43+
useJUnitPlatform()
44+
45+
dependsOn(gradle.includedBuild("protoc-gen").task(":publishAllPublicationsToBuildRepoRepository"))
2546
}
2647

2748
// This block is needed to show plugin tasks on --dry-run
@@ -46,7 +67,7 @@ gradlePlugin {
4667
}
4768
}
4869

49-
abstract class GeneratePluginVersionTask @Inject constructor(
70+
abstract class GeneratePluginVersionsTask @Inject constructor(
5071
@get:Input val libraryVersion: String,
5172
@get:Input val protobufVersion: String,
5273
@get:Input val grpcVersion: String,
@@ -96,15 +117,15 @@ public const val BUF_TOOL_VERSION: String = "$bufToolVersion"
96117
)
97118
}
98119

99-
companion object {
100-
const val NAME = "generatePluginVersion"
120+
companion object Companion {
121+
const val NAME = "generatePluginVersions"
101122
}
102123
}
103124

104-
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersion")
125+
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersions")
105126

106-
val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
107-
GeneratePluginVersionTask.NAME,
127+
val generatePluginVersionsTask = tasks.register<GeneratePluginVersionsTask>(
128+
GeneratePluginVersionsTask.NAME,
108129
version.toString(),
109130
libs.versions.protobuf.asProvider().get(),
110131
libs.versions.grpc.asProvider().get(),
@@ -113,10 +134,63 @@ val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
113134
sourcesDir,
114135
)
115136

137+
abstract class GenerateTestVersionTask @Inject constructor(
138+
@get:Input val kotlinVersion: String,
139+
@get:Input val protobufVersion: String,
140+
@get:Input val grpcVersion: String,
141+
@get:Input val grpcKotlinVersion: String,
142+
@get:Input val buildRepo: String,
143+
@get:OutputDirectory val sourcesDir: File
144+
) : DefaultTask() {
145+
@TaskAction
146+
fun generate() {
147+
val sourceFile = File(sourcesDir, "Versions.kt")
148+
149+
sourceFile.writeText(
150+
"""
151+
// This file is generated by a $NAME gradle task. Do not modify manually.
152+
153+
package kotlinx.rpc
154+
155+
const val KOTLIN_VERSION: String = "$kotlinVersion"
156+
157+
const val BUILD_REPO: String = "$buildRepo"
158+
159+
// can't use from generatePluginVersionsTask bacause Gradle messes up caches
160+
const val TEST_PROTOBUF_VERSION: String = "$protobufVersion"
161+
const val TEST_GRPC_VERSION: String = "$grpcVersion"
162+
const val TEST_GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"
163+
164+
""".trimIndent()
165+
)
166+
}
167+
168+
companion object {
169+
const val NAME = "generateTestVersions"
170+
}
171+
}
172+
173+
val testSourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/testVersions")
174+
175+
val globalRootDir: String by extra
176+
177+
val generateTestVersionsTask = tasks.register<GenerateTestVersionTask>(
178+
GenerateTestVersionTask.NAME,
179+
libs.versions.kotlin.lang.get(),
180+
libs.versions.protobuf.asProvider().get(),
181+
libs.versions.grpc.asProvider().get(),
182+
libs.versions.grpc.kotlin.get(),
183+
File(globalRootDir).resolve("build/repo").absolutePath,
184+
testSourcesDir,
185+
)
186+
116187
kotlin {
117188
sourceSets {
118189
main {
119-
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
190+
kotlin.srcDir(generatePluginVersionsTask.map { it.sourcesDir })
191+
}
192+
test {
193+
kotlin.srcDir(generateTestVersionsTask.map { it.sourcesDir })
120194
}
121195
}
122196
}

gradle-plugin/settings.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ pluginManagement {
1111
includeBuild("../gradle-conventions-settings")
1212
}
1313

14+
dependencyResolutionManagement {
15+
// for tests
16+
includeBuild("../protoc-gen")
17+
includeBuild("../compiler-plugin")
18+
}
19+
1420
plugins {
1521
id("conventions-repositories")
1622
id("conventions-version-resolution")

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/BufExecutable.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ internal fun BufExecTask.execBuf(args: Iterable<Any>) {
5656
val configValue = configFile.orNull
5757
if (configValue != null) {
5858
add("--config")
59-
add(configValue.absolutePath)
59+
add(configValue.path)
6060
}
6161

6262
if (debug.get()) {

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/BufExecTask.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import kotlinx.rpc.buf.BUF_GEN_YAML
2727
import kotlinx.rpc.buf.BUF_YAML
2828
import kotlinx.rpc.buf.BufTasksExtension
2929
import org.gradle.api.logging.LogLevel
30+
import org.gradle.api.tasks.Classpath
3031

3132
/**
3233
* Abstract base class for `buf` tasks.
@@ -60,6 +61,8 @@ public abstract class BufExecTask : DefaultTask() {
6061
* The working directory for the `buf` command.
6162
*/
6263
@get:InputDirectory
64+
// https://docs.gradle.org/current/userguide/incremental_build.html#sec:configure_input_normalization
65+
@get:Classpath
6366
public abstract val workingDir: Property<File>
6467

6568
/**

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/BufGenerateTask.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import org.gradle.api.tasks.OutputDirectory
1515
import org.gradle.api.tasks.TaskProvider
1616
import java.io.File
1717
import kotlinx.rpc.buf.BufGenerateExtension
18-
import org.gradle.api.provider.Provider
1918
import org.gradle.api.tasks.InputDirectory
2019

2120
/**
@@ -24,11 +23,11 @@ import org.gradle.api.tasks.InputDirectory
2423
* @see <a href="https://buf.build/docs/reference/cli/buf/generate/">buf generate</a>
2524
*/
2625
public abstract class BufGenerateTask : BufExecTask() {
27-
// unsued, but required for Gradle to properly recognize inputs
26+
// unsued, but required for Gradle to properly recognise inputs
2827
@get:InputDirectory
2928
internal abstract val protoFilesDir: Property<File>
3029

31-
// unsued, but required for Gradle to properly recognize inputs
30+
// unsued, but required for Gradle to properly recognise inputs
3231
@get:InputDirectory
3332
internal abstract val importFilesDir: Property<File>
3433

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/GenerateBufGenYaml.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal data class ResolvedGrpcPlugin(
2626
val type: Type,
2727
val locator: List<String>,
2828
val out: String,
29-
val options: Map<String, Any?>,
29+
val options: Map<String, Any>,
3030
val strategy: String?,
3131
val includeImports: Boolean?,
3232
val includeWkt: Boolean?,
@@ -91,6 +91,13 @@ public abstract class GenerateBufGenYaml : DefaultTask() {
9191
}
9292

9393
writer.appendLine(" - ${plugin.type.name}: $locatorLine")
94+
writer.appendLine(" out: ${plugin.out}")
95+
if (plugin.options.isNotEmpty()) {
96+
writer.appendLine(" opt:")
97+
plugin.options.forEach { (key, value) ->
98+
writer.appendLine(" - $key=$value")
99+
}
100+
}
94101
if (plugin.strategy != null) {
95102
writer.appendLine(" strategy: ${plugin.strategy}")
96103
}
@@ -112,13 +119,6 @@ public abstract class GenerateBufGenYaml : DefaultTask() {
112119
writer.appendLine(" - $type")
113120
}
114121
}
115-
writer.appendLine(" out: ${plugin.out}")
116-
if (plugin.options.isNotEmpty()) {
117-
writer.appendLine(" opt:")
118-
plugin.options.forEach { (key, value) ->
119-
writer.appendLine(" - $key${if (value != null) "=$value" else ""}")
120-
}
121-
}
122122
}
123123

124124
writer.appendLine("inputs:")

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/GenerateBufYaml.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.gradle.api.DefaultTask
1111
import org.gradle.api.Project
1212
import org.gradle.api.provider.Property
1313
import org.gradle.api.tasks.Input
14-
import org.gradle.api.tasks.InputDirectory
1514
import org.gradle.api.tasks.OutputFile
1615
import org.gradle.api.tasks.TaskAction
1716
import org.gradle.api.tasks.TaskProvider
@@ -22,11 +21,11 @@ import java.io.File
2221
* Generates/updates a Buf `buf.yaml` file.
2322
*/
2423
public abstract class GenerateBufYaml : DefaultTask() {
25-
@get:InputDirectory
26-
internal abstract val protoSourceDir: Property<File>
24+
@get:Input
25+
internal abstract val protoSourceDir: Property<String>
2726

28-
@get:InputDirectory
29-
internal abstract val importSourceDir: Property<File>
27+
@get:Input
28+
internal abstract val importSourceDir: Property<String>
3029

3130
@get:Input
3231
internal abstract val withImport: Property<Boolean>
@@ -61,13 +60,15 @@ public abstract class GenerateBufYaml : DefaultTask() {
6160

6261
writer.appendLine("modules:")
6362

64-
val protoDir = protoSourceDir.get()
63+
val protoDirName = protoSourceDir.get()
64+
val protoDir = file.parentFile.resolve(protoDirName)
6565
if (protoDir.exists()) {
6666
val modulePath = protoDir.relativeTo(file.parentFile)
6767
writer.appendLine(" - path: $modulePath")
6868
}
6969

70-
val importDir = importSourceDir.get()
70+
val importDirName = importSourceDir.get()
71+
val importDir = file.parentFile.resolve(importDirName)
7172
if (withImport.get() && importDir.exists()) {
7273
val modulePath = importDir.relativeTo(file.parentFile)
7374
writer.appendLine(" - path: $modulePath")
@@ -92,8 +93,8 @@ internal fun Project.registerGenerateBufYamlTask(
9293
): TaskProvider<GenerateBufYaml> {
9394
val capitalizeName = name.replaceFirstChar { it.uppercase() }
9495
return tasks.register<GenerateBufYaml>("${GenerateBufYaml.NAME_PREFIX}$capitalizeName") {
95-
protoSourceDir.set(buildSourceSetsProtoDir)
96-
importSourceDir.set(buildSourceSetsImportDir)
96+
protoSourceDir.set(buildSourceSetsProtoDir.name)
97+
importSourceDir.set(buildSourceSetsImportDir.name)
9798
this.withImport.set(withImport)
9899

99100
val bufYamlFile = buildSourceSetsDir

0 commit comments

Comments
 (0)