@@ -16,32 +16,22 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
1616 override val isKmp: Boolean = false
1717
1818 @Test
19- fun `Minimal gRPC Configuration` () {
19+ fun `Minimal gRPC Configuration` () = runGrpcTest {
2020 val result = runGradle(bufGenerateMain)
2121
22- assertEquals(TaskOutcome .SUCCESS , result.protoTaskOutcome(bufGenerateMain))
23- assertEquals(TaskOutcome .SUCCESS , result.protoTaskOutcome(processMainProtoFiles))
24- assertEquals(TaskOutcome .SUCCESS , result.protoTaskOutcome(generateBufYamlMain))
25- assertEquals(TaskOutcome .SUCCESS , result.protoTaskOutcome(generateBufGenYamlMain))
26-
27- result.assertProtoTaskNotExecuted(bufGenerateTest)
28- result.assertProtoTaskNotExecuted(processTestProtoFiles)
29- result.assertProtoTaskNotExecuted(processTestImportProtoFiles)
30- result.assertProtoTaskNotExecuted(generateBufYamlTest)
31- result.assertProtoTaskNotExecuted(generateBufGenYamlTest)
32-
33- assertSourceCodeGenerated(
34- mainSourceSet,
35- Path (" Some.kt" ),
36- Path (RPC_INTERNAL , " Some.kt" )
22+ result.assertMainTaskExecuted(
23+ protoFiles = listOf (
24+ Path (" some.proto" )
25+ ),
26+ generatedFiles = listOf (
27+ Path (" Some.kt" ),
28+ Path (RPC_INTERNAL , " Some.kt" ),
29+ )
3730 )
38-
39- assertWorkspaceProtoFilesCopied(mainSourceSet, Path (" some.proto" ))
40- assertWorkspaceImportProtoFilesCopied(mainSourceSet)
4131 }
4232
4333 @Test
44- fun `No gRPC` () {
34+ fun `No gRPC` () = runGrpcTest {
4535 runNonExistentTask(bufGenerateMain)
4636 runNonExistentTask(bufGenerateTest)
4737 runNonExistentTask(processMainProtoFiles)
@@ -52,4 +42,253 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
5242 runNonExistentTask(generateBufGenYamlMain)
5343 runNonExistentTask(generateBufGenYamlTest)
5444 }
45+
46+ @Test
47+ fun `Test-Only Sources` () = runGrpcTest {
48+ val result = runGradle(bufGenerateTest)
49+
50+ result.assertTestTaskExecuted(
51+ protoFiles = listOf (
52+ Path (" some.proto" ),
53+ ),
54+ importProtoFiles = emptyList(),
55+ generatedFiles = listOf (
56+ Path (" Some.kt" ),
57+ Path (RPC_INTERNAL , " Some.kt" ),
58+ ),
59+ importGeneratedFiles = emptyList()
60+ )
61+ }
62+
63+ @Test
64+ fun `Main and Test Mixed Sources` () = runGrpcTest {
65+ val mainRun = runGradle(bufGenerateMain)
66+
67+ mainRun.assertMainTaskExecuted(
68+ protoFiles = listOf (
69+ Path (" some.proto" )
70+ ),
71+ generatedFiles = listOf (
72+ Path (" Some.kt" ),
73+ Path (RPC_INTERNAL , " Some.kt" ),
74+ )
75+ )
76+
77+ cleanProtoBuildDir()
78+
79+ val testRun = runGradle(bufGenerateTest)
80+
81+ testRun.assertTestTaskExecuted(
82+ protoFiles = listOf (
83+ Path (" other.proto" )
84+ ),
85+ importProtoFiles = listOf (
86+ Path (" some.proto" )
87+ ),
88+ generatedFiles = listOf (
89+ Path (" Other.kt" ),
90+ Path (RPC_INTERNAL , " Other.kt" ),
91+ ),
92+ importGeneratedFiles = listOf (
93+ Path (" Some.kt" ),
94+ Path (RPC_INTERNAL , " Some.kt" ),
95+ )
96+ )
97+ }
98+
99+ @Test
100+ fun `Exclude and Include in protoSourceSets` () = runGrpcTest {
101+ runGradle(processMainProtoFiles)
102+
103+ assertWorkspaceProtoFilesCopied(
104+ mainSourceSet,
105+ Path (" some.proto" ),
106+ Path (" ok" , " ok.proto" ),
107+ )
108+
109+ runGradle(processTestProtoFiles)
110+
111+ assertWorkspaceProtoFilesCopied(
112+ testSourceSet,
113+ Path (" include.proto" ),
114+ Path (" some" , " package" , " hello" , " world" , " file.proto" ),
115+ Path (" include" , " yes1.proto" ),
116+ Path (" include" , " yes2.proto" ),
117+ )
118+
119+ runGradle(processTestImportProtoFiles)
120+
121+ assertWorkspaceImportProtoFilesCopied(
122+ testSourceSet,
123+ Path (" some.proto" ),
124+ Path (" ok" , " ok.proto" ),
125+ )
126+ }
127+
128+ @Test
129+ fun `Can Add Custom Protoc Plugins` () = runGrpcTest {
130+ runGradle(generateBufGenYamlMain)
131+
132+ assertBufGenYaml(
133+ sourceSet = mainSourceSet,
134+ content = """
135+ version: v2
136+ clean: true
137+ plugins:
138+ - remote: buf.build/protocolbuffers/java:v${TEST_PROTOBUF_VERSION .substringAfter(" ." )}
139+ out: java
140+ - remote: buf.build/grpc/java:v$TEST_GRPC_VERSION
141+ out: grpc-java
142+ - remote: buf.build/grpc/kotlin:v$TEST_GRPC_KOTLIN_VERSION
143+ out: grpc-kotlin
144+ - local: [protoc-gen-kotlin-multiplatform]
145+ out: kotlin-multiplatform
146+ opt:
147+ - debugOutput=protoc-gen-kotlin-multiplatform.log
148+ - messageMode=interface
149+ - explicitApiModeEnabled=true
150+ - local: [path, to, protoc-gen-myplugin.exe]
151+ out: myPlugin
152+ opt:
153+ - hello=world
154+ - foo=bar
155+ strategy: all
156+ include_imports: true
157+ include_wkt: false
158+ types:
159+ - my.type.Yay
160+ exclude_types:
161+ - my.type.Nope
162+ - remote: my.remote.plugin
163+ out: myRemotePlugin
164+ inputs:
165+ - directory: proto
166+ """ .trimIndent()
167+ )
168+ }
169+
170+ @Test
171+ fun `Custom Protoc Plugins Must Declare an Artifact` () = runGrpcTest {
172+ val result = runGradleToFail(generateBufGenYamlMain)
173+ assert (result.output.contains(" Artifact is not specified for protoc plugin myPlugin" ))
174+ }
175+
176+ private val cliFlagsRegex = " - Buf Arguments: \\ [.*?, generate, --output, .*?, --include-imports, --include-wkt, --error-format, json, --config, some\\ .buf\\ .yaml, --log-format, json, --timeout, 60s]" .toRegex()
177+
178+ @Test
179+ fun `Custom Buf CLI Flags` () = runGrpcTest {
180+ val result = runGradleToFail(bufGenerateMain)
181+ assert (result.output.contains(" could not read file: open some.buf.yaml: no such file or directory" )) {
182+ " Expected failure due to missing some.buf.yaml file"
183+ }
184+
185+ val cliArgsLine = result.output.lines().first { it.contains(" - Buf Arguments:" ) }
186+ assert (cliArgsLine.contains(cliFlagsRegex)) {
187+ " Buf CLI flags are not correct: $cliArgsLine "
188+ }
189+ }
190+
191+ @Test
192+ fun `Skip Generation When No Proto Files` () = runGrpcTest {
193+ val result = runGradle(bufGenerateMain)
194+
195+ assertEquals(TaskOutcome .SKIPPED , result.protoTaskOutcome(bufGenerateMain))
196+ }
197+
198+ @Test
199+ fun `Proto Tasks Are Cached Properly` () = runGrpcTest {
200+ val firstRunMain = runGradle(bufGenerateMain)
201+
202+ assertEquals(TaskOutcome .SUCCESS , firstRunMain.protoTaskOutcome(bufGenerateMain))
203+ assertEquals(TaskOutcome .SUCCESS , firstRunMain.protoTaskOutcome(generateBufYamlMain))
204+ assertEquals(TaskOutcome .SUCCESS , firstRunMain.protoTaskOutcome(generateBufGenYamlMain))
205+ assertEquals(TaskOutcome .SUCCESS , firstRunMain.protoTaskOutcome(processMainProtoFiles))
206+
207+ val secondRunMain = runGradle(bufGenerateMain)
208+
209+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunMain.protoTaskOutcome(bufGenerateMain))
210+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunMain.protoTaskOutcome(generateBufYamlMain))
211+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunMain.protoTaskOutcome(generateBufGenYamlMain))
212+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunMain.protoTaskOutcome(processMainProtoFiles))
213+
214+ cleanProtoBuildDir()
215+
216+ val thirdRunMain = runGradle(bufGenerateMain)
217+
218+ assertEquals(TaskOutcome .SUCCESS , thirdRunMain.protoTaskOutcome(bufGenerateMain))
219+ assertEquals(TaskOutcome .SUCCESS , thirdRunMain.protoTaskOutcome(generateBufYamlMain))
220+ assertEquals(TaskOutcome .SUCCESS , thirdRunMain.protoTaskOutcome(generateBufGenYamlMain))
221+ assertEquals(TaskOutcome .SUCCESS , thirdRunMain.protoTaskOutcome(processMainProtoFiles))
222+
223+ mainProtoFileSources
224+ .resolve(" some.proto" )
225+ .replace(" content = 1" , " content = 2" )
226+
227+ val fourthRunMain = runGradle(bufGenerateMain)
228+
229+ assertEquals(TaskOutcome .SUCCESS , fourthRunMain.protoTaskOutcome(bufGenerateMain))
230+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunMain.protoTaskOutcome(generateBufYamlMain))
231+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunMain.protoTaskOutcome(generateBufGenYamlMain))
232+ assertEquals(TaskOutcome .SUCCESS , fourthRunMain.protoTaskOutcome(processMainProtoFiles))
233+
234+ val firstRunTest = runGradle(bufGenerateTest)
235+
236+ assertEquals(TaskOutcome .SUCCESS , firstRunTest.protoTaskOutcome(bufGenerateTest))
237+ assertEquals(TaskOutcome .SUCCESS , firstRunTest.protoTaskOutcome(generateBufYamlTest))
238+ assertEquals(TaskOutcome .SUCCESS , firstRunTest.protoTaskOutcome(generateBufGenYamlTest))
239+ assertEquals(TaskOutcome .SUCCESS , firstRunTest.protoTaskOutcome(processTestProtoFiles))
240+ assertEquals(TaskOutcome .SUCCESS , firstRunTest.protoTaskOutcome(processTestImportProtoFiles))
241+
242+ assertEquals(TaskOutcome .UP_TO_DATE , firstRunTest.protoTaskOutcome(bufGenerateMain))
243+ assertEquals(TaskOutcome .UP_TO_DATE , firstRunTest.protoTaskOutcome(generateBufYamlMain))
244+ assertEquals(TaskOutcome .UP_TO_DATE , firstRunTest.protoTaskOutcome(generateBufGenYamlMain))
245+ assertEquals(TaskOutcome .UP_TO_DATE , firstRunTest.protoTaskOutcome(processMainProtoFiles))
246+
247+ val secondRunTest = runGradle(bufGenerateTest)
248+
249+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(bufGenerateTest))
250+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(generateBufYamlTest))
251+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(generateBufGenYamlTest))
252+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(processTestProtoFiles))
253+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(processTestImportProtoFiles))
254+
255+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(bufGenerateMain))
256+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(generateBufYamlMain))
257+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(generateBufGenYamlMain))
258+ assertEquals(TaskOutcome .UP_TO_DATE , secondRunTest.protoTaskOutcome(processMainProtoFiles))
259+
260+ testProtoFileSources
261+ .resolve(" other.proto" )
262+ .replace(" content = 1" , " content = 2" )
263+
264+ val thirdRunTest = runGradle(bufGenerateTest)
265+
266+ assertEquals(TaskOutcome .SUCCESS , thirdRunTest.protoTaskOutcome(bufGenerateTest))
267+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(generateBufYamlTest))
268+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(generateBufGenYamlTest))
269+ assertEquals(TaskOutcome .SUCCESS , thirdRunTest.protoTaskOutcome(processTestProtoFiles))
270+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(processTestImportProtoFiles))
271+
272+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(bufGenerateMain))
273+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(generateBufYamlMain))
274+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(generateBufGenYamlMain))
275+ assertEquals(TaskOutcome .UP_TO_DATE , thirdRunTest.protoTaskOutcome(processMainProtoFiles))
276+
277+ mainProtoFileSources
278+ .resolve(" some.proto" )
279+ .replace(" content = 2" , " content = 3" )
280+
281+ val fourthRunTest = runGradle(bufGenerateTest)
282+
283+ assertEquals(TaskOutcome .SUCCESS , fourthRunTest.protoTaskOutcome(bufGenerateTest))
284+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunTest.protoTaskOutcome(generateBufYamlTest))
285+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunTest.protoTaskOutcome(generateBufGenYamlTest))
286+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunTest.protoTaskOutcome(processTestProtoFiles))
287+ assertEquals(TaskOutcome .SUCCESS , fourthRunTest.protoTaskOutcome(processTestImportProtoFiles))
288+
289+ assertEquals(TaskOutcome .SUCCESS , fourthRunTest.protoTaskOutcome(bufGenerateMain))
290+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunTest.protoTaskOutcome(generateBufYamlMain))
291+ assertEquals(TaskOutcome .UP_TO_DATE , fourthRunTest.protoTaskOutcome(generateBufGenYamlMain))
292+ assertEquals(TaskOutcome .SUCCESS , fourthRunTest.protoTaskOutcome(processMainProtoFiles))
293+ }
55294}
0 commit comments