Skip to content

Commit ba4603f

Browse files
committed
Gradle plugin tests (#413)
1 parent c2facf6 commit ba4603f

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
@@ -33,7 +33,28 @@ tasks.withType<KotlinCompile>().configureEach {
3333
}
3434

3535
dependencies {
36-
compileOnly(libs.kotlin.gradle.plugin)
36+
implementation(libs.kotlin.gradle.plugin)
37+
38+
testImplementation(libs.kotlin.gradle.plugin)
39+
testImplementation(gradleTestKit())
40+
testImplementation(platform(libs.junit5.bom))
41+
testImplementation(libs.kotlin.test.junit5)
42+
testImplementation(libs.junit5.jupiter)
43+
testImplementation(libs.junit5.jupiter.api)
44+
testRuntimeOnly(libs.junit5.platform.launcher)
45+
46+
testImplementation(libs.logback.classic)
47+
}
48+
49+
tasks.test {
50+
val forwardOutput: Boolean = (properties.getOrDefault("gradle.test.forward.output", "false")
51+
as String).toBooleanStrictOrNull() ?: false
52+
53+
systemProperty("gradle.test.forward.output", forwardOutput)
54+
55+
useJUnitPlatform()
56+
57+
dependsOn(gradle.includedBuild("protoc-gen").task(":publishAllPublicationsToBuildRepoRepository"))
3758
}
3859

3960
// This block is needed to show plugin tasks on --dry-run
@@ -58,7 +79,7 @@ gradlePlugin {
5879
}
5980
}
6081

61-
abstract class GeneratePluginVersionTask @Inject constructor(
82+
abstract class GeneratePluginVersionsTask @Inject constructor(
6283
@get:Input val libraryVersion: String,
6384
@get:Input val protobufVersion: String,
6485
@get:Input val grpcVersion: String,
@@ -108,15 +129,15 @@ public const val BUF_TOOL_VERSION: String = "$bufToolVersion"
108129
)
109130
}
110131

111-
companion object {
112-
const val NAME = "generatePluginVersion"
132+
companion object Companion {
133+
const val NAME = "generatePluginVersions"
113134
}
114135
}
115136

116-
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersion")
137+
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersions")
117138

118-
val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
119-
GeneratePluginVersionTask.NAME,
139+
val generatePluginVersionsTask = tasks.register<GeneratePluginVersionsTask>(
140+
GeneratePluginVersionsTask.NAME,
120141
version.toString(),
121142
libs.versions.protobuf.asProvider().get(),
122143
libs.versions.grpc.asProvider().get(),
@@ -125,10 +146,63 @@ val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
125146
sourcesDir,
126147
)
127148

149+
abstract class GenerateTestVersionTask @Inject constructor(
150+
@get:Input val kotlinVersion: String,
151+
@get:Input val protobufVersion: String,
152+
@get:Input val grpcVersion: String,
153+
@get:Input val grpcKotlinVersion: String,
154+
@get:Input val buildRepo: String,
155+
@get:OutputDirectory val sourcesDir: File
156+
) : DefaultTask() {
157+
@TaskAction
158+
fun generate() {
159+
val sourceFile = File(sourcesDir, "Versions.kt")
160+
161+
sourceFile.writeText(
162+
"""
163+
// This file is generated by a $NAME gradle task. Do not modify manually.
164+
165+
package kotlinx.rpc
166+
167+
const val KOTLIN_VERSION: String = "$kotlinVersion"
168+
169+
const val BUILD_REPO: String = "$buildRepo"
170+
171+
// can't use from generatePluginVersionsTask bacause Gradle messes up caches
172+
const val TEST_PROTOBUF_VERSION: String = "$protobufVersion"
173+
const val TEST_GRPC_VERSION: String = "$grpcVersion"
174+
const val TEST_GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"
175+
176+
""".trimIndent()
177+
)
178+
}
179+
180+
companion object {
181+
const val NAME = "generateTestVersions"
182+
}
183+
}
184+
185+
val testSourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/testVersions")
186+
187+
val globalRootDir: String by extra
188+
189+
val generateTestVersionsTask = tasks.register<GenerateTestVersionTask>(
190+
GenerateTestVersionTask.NAME,
191+
libs.versions.kotlin.lang.get(),
192+
libs.versions.protobuf.asProvider().get(),
193+
libs.versions.grpc.asProvider().get(),
194+
libs.versions.grpc.kotlin.get(),
195+
File(globalRootDir).resolve("build/repo").absolutePath,
196+
testSourcesDir,
197+
)
198+
128199
kotlin {
129200
sourceSets {
130201
main {
131-
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
202+
kotlin.srcDir(generatePluginVersionsTask.map { it.sourcesDir })
203+
}
204+
test {
205+
kotlin.srcDir(generateTestVersionsTask.map { it.sourcesDir })
132206
}
133207
}
134208
}

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)