Skip to content

Commit 30b1aa7

Browse files
committed
Simplify and update code gen tests
Motivation: The protobuf code generator doesn't actually do a lot: it parses a protobuf file descriptor and turns that into a request for the code generator provided by the GRPCCodeGen module. This means that the tests should focus on the conversion rather than the generated code (although this is still useful to test at a high level). As it stands all tests are done on the generated code rather than the conversion to a code generator request. The existing tests also hand roll a protobuf file descriptor which is tedious and error prone. The upstream code generator also has changes which aren't yet reflected here. Modifications: - Define some test proto files for which we generate serialized protobuf file descriptor sets. - Add a suite of code gen parser tests which check the request created from the file descriptor proto. - Add a single code generator test. - Downgrade an access level from public to package as public wasn't necessary. Result: Better tests
1 parent eaebe06 commit 30b1aa7

File tree

15 files changed

+1391
-963
lines changed

15 files changed

+1391
-963
lines changed

Package.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ let targets: [Target] = [
9494
.product(name: "SwiftProtobuf", package: "swift-protobuf"),
9595
.product(name: "SwiftProtobufPluginLibrary", package: "swift-protobuf"),
9696
],
97+
resources: [
98+
.copy("Generated")
99+
],
97100
swiftSettings: defaultSwiftSettings
98101
),
99102
]

Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,45 +15,50 @@
1515
*/
1616

1717
internal import Foundation
18-
internal import GRPCCodeGen
19-
internal import SwiftProtobufPluginLibrary
18+
internal import SwiftProtobuf
19+
package import SwiftProtobufPluginLibrary
20+
21+
package import struct GRPCCodeGen.CodeGenerationRequest
22+
package import struct GRPCCodeGen.Dependency
23+
package import struct GRPCCodeGen.MethodDescriptor
24+
package import struct GRPCCodeGen.Name
25+
package import struct GRPCCodeGen.ServiceDescriptor
26+
package import struct GRPCCodeGen.SourceGenerator
2027

2128
/// Parses a ``FileDescriptor`` object into a ``CodeGenerationRequest`` object.
22-
internal struct ProtobufCodeGenParser {
23-
let input: FileDescriptor
24-
let namer: SwiftProtobufNamer
29+
package struct ProtobufCodeGenParser {
2530
let extraModuleImports: [String]
2631
let protoToModuleMappings: ProtoFileToModuleMappings
2732
let accessLevel: SourceGenerator.Config.AccessLevel
2833

29-
internal init(
30-
input: FileDescriptor,
34+
package init(
3135
protoFileModuleMappings: ProtoFileToModuleMappings,
3236
extraModuleImports: [String],
3337
accessLevel: SourceGenerator.Config.AccessLevel
3438
) {
35-
self.input = input
3639
self.extraModuleImports = extraModuleImports
3740
self.protoToModuleMappings = protoFileModuleMappings
38-
self.namer = SwiftProtobufNamer(
39-
currentFile: input,
40-
protoFileToModuleMappings: protoFileModuleMappings
41-
)
4241
self.accessLevel = accessLevel
4342
}
4443

45-
internal func parse() throws -> CodeGenerationRequest {
46-
var header = self.input.header
44+
package func parse(descriptor: FileDescriptor) throws -> CodeGenerationRequest {
45+
let namer = SwiftProtobufNamer(
46+
currentFile: descriptor,
47+
protoFileToModuleMappings: self.protoToModuleMappings
48+
)
49+
50+
var header = descriptor.header
4751
// Ensuring there is a blank line after the header.
4852
if !header.isEmpty && !header.hasSuffix("\n\n") {
4953
header.append("\n")
5054
}
55+
5156
let leadingTrivia = """
5257
// DO NOT EDIT.
5358
// swift-format-ignore-file
5459
//
5560
// Generated by the gRPC Swift generator plugin for the protocol buffer compiler.
56-
// Source: \(self.input.name)
61+
// Source: \(descriptor.name)
5762
//
5863
// For information on using the generated types, please see the documentation:
5964
// https://github.com/grpc/grpc-swift
@@ -65,19 +70,20 @@ internal struct ProtobufCodeGenParser {
6570
let lookupDeserializer: (String) -> String = { messageType in
6671
"GRPCProtobuf.ProtobufDeserializer<\(messageType)>()"
6772
}
68-
let services = self.input.services.map {
69-
ServiceDescriptor(
73+
74+
let services = descriptor.services.map {
75+
GRPCCodeGen.ServiceDescriptor(
7076
descriptor: $0,
71-
package: input.package,
72-
protobufNamer: self.namer,
73-
file: self.input
77+
package: descriptor.package,
78+
protobufNamer: namer,
79+
file: descriptor
7480
)
7581
}
7682

7783
return CodeGenerationRequest(
78-
fileName: self.input.name,
84+
fileName: descriptor.name,
7985
leadingTrivia: header + leadingTrivia,
80-
dependencies: self.codeDependencies,
86+
dependencies: self.codeDependencies(file: descriptor),
8187
services: services,
8288
lookupSerializer: lookupSerializer,
8389
lookupDeserializer: lookupDeserializer
@@ -86,14 +92,16 @@ internal struct ProtobufCodeGenParser {
8692
}
8793

8894
extension ProtobufCodeGenParser {
89-
fileprivate var codeDependencies: [Dependency] {
95+
fileprivate func codeDependencies(
96+
file: FileDescriptor
97+
) -> [Dependency] {
9098
var codeDependencies: [Dependency] = [
9199
.init(module: "GRPCProtobuf", accessLevel: .internal)
92100
]
93101
// Adding as dependencies the modules containing generated code or types for
94102
// '.proto' files imported in the '.proto' file we are parsing.
95103
codeDependencies.append(
96-
contentsOf: (self.protoToModuleMappings.neededModules(forFile: self.input) ?? []).map {
104+
contentsOf: (self.protoToModuleMappings.neededModules(forFile: file) ?? []).map {
97105
Dependency(module: $0, accessLevel: self.accessLevel)
98106
}
99107
)

Sources/GRPCProtobufCodeGen/ProtobufCodeGenerator.swift

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,31 @@
1414
* limitations under the License.
1515
*/
1616

17-
public import GRPCCodeGen
18-
public import SwiftProtobufPluginLibrary
17+
package import GRPCCodeGen
18+
package import SwiftProtobufPluginLibrary
1919

20-
public struct ProtobufCodeGenerator {
21-
internal var configuration: SourceGenerator.Config
20+
package struct ProtobufCodeGenerator {
21+
internal var config: SourceGenerator.Config
2222

23-
public init(
24-
configuration: SourceGenerator.Config
23+
package init(
24+
config: SourceGenerator.Config
2525
) {
26-
self.configuration = configuration
26+
self.config = config
2727
}
2828

29-
public func generateCode(
30-
from fileDescriptor: FileDescriptor,
29+
package func generateCode(
30+
fileDescriptor: FileDescriptor,
3131
protoFileModuleMappings: ProtoFileToModuleMappings,
3232
extraModuleImports: [String]
3333
) throws -> String {
3434
let parser = ProtobufCodeGenParser(
35-
input: fileDescriptor,
3635
protoFileModuleMappings: protoFileModuleMappings,
3736
extraModuleImports: extraModuleImports,
38-
accessLevel: self.configuration.accessLevel
37+
accessLevel: self.config.accessLevel
3938
)
40-
let sourceGenerator = SourceGenerator(config: self.configuration)
39+
let sourceGenerator = SourceGenerator(config: self.config)
4140

42-
let codeGenerationRequest = try parser.parse()
41+
let codeGenerationRequest = try parser.parse(descriptor: fileDescriptor)
4342
let sourceFile = try sourceGenerator.generate(codeGenerationRequest)
4443
return sourceFile.contents
4544
}

Sources/protoc-gen-grpc-swift/GenerateGRPC.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ final class GenerateGRPC: CodeGenerator {
9696
)
9797

9898
let config = SourceGenerator.Config(options: options)
99-
let fileGenerator = ProtobufCodeGenerator(configuration: config)
99+
let fileGenerator = ProtobufCodeGenerator(config: config)
100100
let contents = try fileGenerator.generateCode(
101-
from: descriptor,
101+
fileDescriptor: descriptor,
102102
protoFileModuleMappings: options.protoToModuleMappings,
103103
extraModuleImports: options.extraModuleImports
104104
)
86 Bytes
Binary file not shown.
502 Bytes
Binary file not shown.
822 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)