Skip to content

Commit c8411d3

Browse files
authored
Fix MainTest, don't generate descriptors in common protos gRPC project (#140)
1 parent db875ab commit c8411d3

File tree

16 files changed

+107
-59
lines changed

16 files changed

+107
-59
lines changed

buildSrc/src/main/kotlin/LocalProtoktBuild.kt

+10-3
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ import com.toasttab.protokt.gradle.EXTENSIONS
1919
import com.toasttab.protokt.gradle.configureProtokt
2020
import com.toasttab.protokt.gradle.resolveProtoktCoreDep
2121
import org.gradle.api.Project
22+
import org.gradle.api.tasks.SourceSetContainer
2223
import org.gradle.api.tasks.compile.JavaCompile
2324
import org.gradle.kotlin.dsl.dependencies
25+
import org.gradle.kotlin.dsl.get
2426
import org.gradle.kotlin.dsl.project
27+
import org.gradle.kotlin.dsl.the
2528
import org.gradle.kotlin.dsl.withType
2629

27-
val Project.buildSrcClasses
28-
get() = "${rootProject.projectDir}/buildSrc/build/classes/kotlin/main"
29-
3030
fun Project.localProtokt() {
3131
configureProtokt(this) {
3232
if (name !in setOf("protokt-core", "protokt-core-lite")) {
@@ -47,6 +47,13 @@ fun Project.localProtokt() {
4747
}
4848
}
4949

50+
fun Project.includeCommonGradleSource(filePattern: String) {
51+
the<SourceSetContainer>()["main"].java {
52+
srcDir(rootProject.file("buildSrc/src/main/kotlin"))
53+
include("com/toasttab/protokt/gradle/$filePattern")
54+
}
55+
}
56+
5057
fun Project.pureKotlin() {
5158
tasks.withType<JavaCompile> {
5259
enabled = false

buildSrc/src/main/kotlin/com/toasttab/protokt/gradle/ProtobufBuild.kt

-7
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ import org.gradle.kotlin.dsl.apply
3030
import org.gradle.kotlin.dsl.named
3131
import java.net.URLEncoder
3232

33-
const val KOTLIN_EXTRA_CLASSPATH = "kotlin_extra_classpath"
34-
const val RESPECT_JAVA_PACKAGE = "respect_java_package"
35-
const val GENERATE_GRPC = "generate_grpc"
36-
const val ONLY_GENERATE_GRPC = "only_generate_grpc"
37-
const val LITE = "lite"
38-
const val ONLY_GENERATE_DESCRIPTORS = "only_generate_descriptors"
39-
4033
internal fun configureProtobufPlugin(project: Project, ext: ProtoktExtension, binaryPath: String) {
4134
project.apply(plugin = "com.google.protobuf")
4235

buildSrc/src/main/kotlin/com/toasttab/protokt/gradle/ProtoktBuild.kt

-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ const val EXTENSIONS = "protoktExtensions"
2525

2626
const val TEST_EXTENSIONS = "testProtoktExtensions"
2727

28-
const val MANIFEST_VERSION_PROPERTY = "Implementation-Version"
29-
3028
fun configureProtokt(project: Project, resolveBinary: () -> String) {
3129
createExtensionConfigurations(project)
3230

buildSrc/src/main/kotlin/com/toasttab/protokt/gradle/ProtoktExtension.kt

+9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ package com.toasttab.protokt.gradle
1717

1818
const val DEFAULT_PROTOBUF_VERSION = "3.18.0"
1919

20+
const val MANIFEST_VERSION_PROPERTY = "Implementation-Version"
21+
22+
const val KOTLIN_EXTRA_CLASSPATH = "kotlin_extra_classpath"
23+
const val RESPECT_JAVA_PACKAGE = "respect_java_package"
24+
const val GENERATE_GRPC = "generate_grpc"
25+
const val ONLY_GENERATE_GRPC = "only_generate_grpc"
26+
const val LITE = "lite"
27+
const val ONLY_GENERATE_DESCRIPTORS = "only_generate_descriptors"
28+
2029
open class ProtoktExtension {
2130
/**
2231
* The version of protobuf to use for compilation

protokt-codegen/build.gradle.kts

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* limitations under the License.
1414
*/
1515

16+
import com.google.protobuf.gradle.GenerateProtoTask
1617
import com.google.protobuf.gradle.proto
1718
import com.google.protobuf.gradle.protobuf
1819
import com.google.protobuf.gradle.protoc
@@ -75,6 +76,14 @@ protobuf {
7576
}
7677
}
7778

79+
tasks.withType<Test> {
80+
doFirst {
81+
tasks.named<GenerateProtoTask>("generateProto") {
82+
environment("PROTOC_PATH", locatorToAlternativePathsMapping.getting("protoc").get().singleFile)
83+
}
84+
}
85+
}
86+
7887
sourceSets {
7988
main {
8089
proto {

protokt-codegen/src/main/kotlin/com/toasttab/protokt/codegen/impl/FileDescriptorResolver.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private constructor(
3737
private val pkg = kotlinPackage(descs.first())
3838

3939
private fun resolveFileDescriptor(): FileDescriptorInfo? {
40-
if (ctx.lite) {
40+
if (ctx.lite || ctx.onlyGenerateGrpc) {
4141
return null
4242
}
4343

protokt-codegen/src/main/kotlin/com/toasttab/protokt/codegen/protoc/ProtocolContext.kt

+20-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
package com.toasttab.protokt.codegen.protoc
1717

18+
import com.google.common.base.CaseFormat.LOWER_CAMEL
19+
import com.google.common.base.CaseFormat.LOWER_UNDERSCORE
1820
import com.google.protobuf.DescriptorProtos.FileDescriptorProto
1921
import com.toasttab.protokt.codegen.impl.packagesByTypeName
2022
import com.toasttab.protokt.codegen.impl.resolvePackage
@@ -23,9 +25,11 @@ import com.toasttab.protokt.gradle.KOTLIN_EXTRA_CLASSPATH
2325
import com.toasttab.protokt.gradle.LITE
2426
import com.toasttab.protokt.gradle.ONLY_GENERATE_DESCRIPTORS
2527
import com.toasttab.protokt.gradle.ONLY_GENERATE_GRPC
28+
import com.toasttab.protokt.gradle.ProtoktExtension
2629
import com.toasttab.protokt.gradle.RESPECT_JAVA_PACKAGE
2730
import com.toasttab.protokt.util.getProtoktVersion
2831
import java.net.URLDecoder
32+
import kotlin.reflect.full.declaredMemberProperties
2933

3034
class ProtocolContext(
3135
val fdp: FileDescriptorProto,
@@ -39,10 +43,10 @@ class ProtocolContext(
3943
}
4044

4145
val respectJavaPackage = respectJavaPackage(params)
42-
val generateGrpc = params.getValue(GENERATE_GRPC).toBoolean()
43-
val onlyGenerateGrpc = params.getValue(ONLY_GENERATE_GRPC).toBoolean()
44-
val lite = params.getValue(LITE).toBoolean()
45-
val onlyGenerateDescriptors = params.getValue(ONLY_GENERATE_DESCRIPTORS).toBoolean()
46+
val generateGrpc = params.getOrDefault(GENERATE_GRPC)
47+
val onlyGenerateGrpc = params.getOrDefault(ONLY_GENERATE_GRPC)
48+
val lite = params.getOrDefault(LITE)
49+
val onlyGenerateDescriptors = params.getOrDefault(ONLY_GENERATE_DESCRIPTORS)
4650

4751
val fileName = fdp.name
4852
val version = getProtoktVersion(ProtocolContext::class)
@@ -73,4 +77,15 @@ class ProtocolContext(
7377
}
7478

7579
fun respectJavaPackage(params: Map<String, String>) =
76-
params.getValue(RESPECT_JAVA_PACKAGE).toBoolean()
80+
params.getOrDefault(RESPECT_JAVA_PACKAGE)
81+
82+
private fun Map<String, String>.getOrDefault(key: String): Boolean {
83+
val defaultExtension = ProtoktExtension()
84+
85+
val defaultValue =
86+
defaultExtension::class.declaredMemberProperties
87+
.single { it.name == LOWER_UNDERSCORE.to(LOWER_CAMEL, key) }
88+
.call(defaultExtension) as Boolean
89+
90+
return get(key)?.toBoolean() ?: defaultValue
91+
}

protokt-codegen/src/main/resources/header.stg

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ header(package, imports, version, fileName) ::= <<
2020
*/
2121

2222
<if (package)>package <package><\n><\n><endif><\\>
23-
<if (imports)><imports : { it | import <it>}; separator="\n"><\n><\n><endif><\\>
23+
<if (imports)><imports : { it | import <it>}; separator="\n"><\n><\n><endif>
2424
>>

protokt-codegen/src/test/kotlin/com/toasttab/protokt/MainTest.kt

+38-11
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,65 @@
1515

1616
package com.toasttab.protokt
1717

18+
import com.google.common.base.CaseFormat.LOWER_CAMEL
19+
import com.google.common.base.CaseFormat.LOWER_UNDERSCORE
20+
import com.google.protobuf.compiler.PluginProtos
21+
import com.toasttab.protokt.gradle.ProtoktExtension
1822
import com.toasttab.protokt.testing.util.ProcessOutput.Src.ERR
1923
import com.toasttab.protokt.testing.util.projectRoot
2024
import com.toasttab.protokt.testing.util.runCommand
21-
import org.junit.jupiter.api.Disabled
2225
import org.junit.jupiter.api.Test
2326
import java.io.ByteArrayOutputStream
2427
import java.io.File
25-
import java.nio.file.Paths
28+
import java.nio.file.Path
29+
import kotlin.reflect.KClass
30+
import kotlin.reflect.full.declaredMemberProperties
2631

2732
class MainTest {
2833
@Test
29-
@Disabled // Enable this test if you want to step through the code generator
3034
fun `step through code generation with debugger`() {
3135
generatedFile.delete()
3236

37+
val ext =
38+
ProtoktExtension().apply {
39+
// set any plugin options here
40+
}
41+
3342
listOf(
34-
"protoc",
43+
System.getenv("PROTOC_PATH") ?: "protoc",
3544
"--plugin=protoc-gen-custom=$binGenerator",
3645
"--custom_out=.", // ignored
3746
"-I$codegenTestingProto",
3847
"-I$runtimeResources",
48+
"-I$includeProtos",
49+
buildPluginOptions(ext),
3950
"$testProto"
4051
).joinToString(" ")
4152
.runCommand(
42-
Paths.get(projectRoot)
53+
projectRoot.toPath()
4354
).orFail("Failed to generate code generator request", ERR)
4455

4556
val out = ByteArrayOutputStream()
4657
main(generatedFile.readBytes(), out)
47-
println(out.toString())
58+
PluginProtos.CodeGeneratorResponse.parseFrom(out.toByteArray())
59+
.fileList
60+
.forEach {
61+
println(it.name)
62+
println(it.content)
63+
}
4864
}
4965
}
5066

67+
private fun buildPluginOptions(extension: ProtoktExtension) =
68+
"--custom_opt=" +
69+
extension::class.declaredMemberProperties
70+
.filter { it.returnType.classifier as KClass<*> == Boolean::class }
71+
.joinToString(",") {
72+
LOWER_CAMEL.to(LOWER_UNDERSCORE, it.name) + "=${it.call(extension)}"
73+
}
74+
5175
private val codegenTestingResources =
52-
Paths.get(
76+
Path.of(
5377
"protokt-codegen", "src", "test", "resources",
5478
"com", "toasttab", "protokt", "codegen", "testing"
5579
)
@@ -58,22 +82,25 @@ private val binGenerator =
5882
File(codegenTestingResources.toFile(), "bin-generator")
5983

6084
private val codegenTestingProto =
61-
Paths.get(
85+
Path.of(
6286
"protokt-codegen", "src", "test", "proto",
63-
"com", "toasttab", "protokt", "codegen", "testing"
87+
"toasttab", "protokt", "codegen", "testing"
6488
)
6589

6690
private val testProto =
6791
File(codegenTestingProto.toFile(), "test.proto")
6892

6993
private val runtimeResources =
70-
Paths.get("protokt-runtime", "src", "main", "resources")
94+
Path.of("protokt-runtime", "src", "main", "resources")
7195

7296
private val generatedFile =
7397
File(
7498
projectRoot,
75-
Paths.get(
99+
Path.of(
76100
"protokt-codegen", "src", "test", "resources",
77101
"com", "toasttab", "protokt", "test-proto-bin-request.bin"
78102
).toString()
79103
)
104+
105+
private val includeProtos =
106+
File(projectRoot, "protokt-codegen/build/extracted-include-protos/main")

protokt-codegen/src/test/proto/com/toasttab/protokt/codegen/testing/test.proto renamed to protokt-codegen/src/test/proto/toasttab/protokt/codegen/testing/test.proto

+3-9
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,10 @@
1515

1616
syntax = "proto3";
1717

18-
package com.toasttab.protokt.codegen.testing;
18+
package toasttab.protokt.codegen.testing;
1919

2020
import "protokt/protokt.proto";
2121

22-
option (.protokt.file).kotlin_package = "com.toasttab.test";
23-
24-
message SliceModel {
25-
option (.protokt.class).implements = "";
26-
27-
bytes slice = 1 [
28-
(.protokt.property).bytes_slice = true
29-
];
22+
message TestMessage {
23+
string value = 1;
3024
}

protokt-core-lite/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ localProtokt()
2323
pureKotlin()
2424
enablePublishing()
2525
compatibleWithAndroid()
26-
trackKotlinApiCompatibility()
26+
trackKotlinApiCompatibility(false)
2727

2828
protokt {
2929
lite = true

protokt-gradle-plugin/build.gradle.kts

+2-7
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@ plugins {
1818
id("com.gradle.plugin-publish") version "0.11.0"
1919
}
2020

21-
tasks.named<Jar>("jar") {
22-
from(buildSrcClasses) {
23-
include("com/toasttab/**")
24-
include("META-INF/**")
25-
}
26-
}
27-
2821
gradlePlugin {
2922
isAutomatedPublishing = false
3023

@@ -62,3 +55,5 @@ dependencies {
6255
implementation(gradleApi())
6356
implementation(libraries.protobufPlugin)
6457
}
58+
59+
includeCommonGradleSource("*")

protokt-util/build.gradle.kts

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,4 @@
1515

1616
enablePublishing()
1717

18-
dependencies {
19-
api(files(buildSrcClasses))
20-
}
18+
includeCommonGradleSource("ProtoktExtension.kt")

protokt-util/src/main/kotlin/com/toasttab/protokt/util/ProtoktVersion.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ fun getProtoktVersion(klass: KClass<*>): String =
2828
.use {
2929
JarInputStream(it)
3030
.manifest
31-
.mainAttributes
32-
.getValue(MANIFEST_VERSION_PROPERTY)
31+
// TODO: manifest is null when running MainTest. Is it possible to create it?
32+
?.mainAttributes
33+
?.getValue(MANIFEST_VERSION_PROPERTY)
34+
?: "<unknown>"
3335
}

testing/conformance-tests/src/test/kotlin/com/toasttab/protokt/conformance/ConformanceTest.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ import com.toasttab.protokt.testing.util.projectRoot
2020
import com.toasttab.protokt.testing.util.runCommand
2121
import org.junit.jupiter.api.Test
2222
import org.junit.jupiter.api.fail
23-
import java.nio.file.Paths
23+
import java.io.File
24+
import java.nio.file.Path
2425

2526
class ConformanceTest {
2627
@Test
2728
fun `run conformance tests`() {
2829
command
2930
.runCommand(
30-
Paths.get(projectRoot, "conformance-driver"),
31+
File(projectRoot, "conformance-driver").toPath(),
3132
libPathOverride
3233
)
3334
.orFail("Conformance tests failed", ERR)
@@ -46,13 +47,13 @@ private fun <T> pivotOs(mac: T, linux: T) =
4647
}
4748

4849
private val binDir =
49-
Paths.get("bin", pivotOs("darwin", "ubuntu-16.04-x86_64")).toString()
50+
Path.of("bin", pivotOs("darwin", "ubuntu-16.04-x86_64")).toString()
5051

5152
private val baseCommand =
52-
Paths.get(binDir, "conformance-test-runner")
53+
Path.of(binDir, "conformance-test-runner")
5354

5455
private val conformanceDriver =
55-
Paths.get(
56+
Path.of(
5657
"build", "install", "protokt-conformance", "bin", "protokt-conformance"
5758
)
5859

@@ -65,5 +66,5 @@ private val command =
6566
private val libPathOverride =
6667
mapOf(
6768
pivotOs("DYLD_LIBRARY_PATH", "LD_LIBRARY_PATH") to
68-
Paths.get(binDir, ".libs").toString()
69+
Path.of(binDir, ".libs").toString()
6970
)

testing/testing-util/src/main/kotlin/com/toasttab/protokt/testing/util/ProcessUtils.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import java.nio.file.Path
2323
import java.util.concurrent.TimeUnit
2424

2525
val projectRoot =
26-
File(System.getProperty("user.dir")).parentFile.absolutePath
26+
File(System.getProperty("user.dir")).parentFile
2727

2828
fun String.runCommand(
2929
workingDir: Path,

0 commit comments

Comments
 (0)