Skip to content

Commit f3164b2

Browse files
committed
Add empty proto file test
* Add empty proto file test * Add a preamble to `foo-messages.proto` * Don't unconditionally add a dependency on `GRPCProtobuf` if there are no services * Add the new test case code generation to `dev/protos/generate.sh` * depend on `grpc-swift` `main` to pick up empty file generation changes.
1 parent 9f07522 commit f3164b2

File tree

7 files changed

+95
-35
lines changed

7 files changed

+95
-35
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ let products: [Product] = [
3131
let dependencies: [Package.Dependency] = [
3232
.package(
3333
url: "https://github.com/grpc/grpc-swift.git",
34-
exact: "2.0.0-beta.2"
34+
branch: "main"
3535
),
3636
.package(
3737
url: "https://github.com/apple/swift-protobuf.git",

Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,11 @@ package struct ProtobufCodeGenParser {
9898

9999
extension ProtobufCodeGenParser {
100100
fileprivate func codeDependencies(file: FileDescriptor) -> [Dependency] {
101-
var codeDependencies: [Dependency] = [
102-
Dependency(module: "GRPCProtobuf", accessLevel: .internal)
103-
]
101+
var codeDependencies: [Dependency] = []
102+
103+
if file.services.count > 0 {
104+
codeDependencies.append(Dependency(module: "GRPCProtobuf", accessLevel: .internal))
105+
}
104106

105107
// If there's a dependency on a bundled proto then add the SwiftProtobuf import.
106108
//
156 Bytes
Binary file not shown.
19 Bytes
Binary file not shown.

Tests/GRPCProtobufCodeGenTests/ProtobufCodeGeneratorTests.swift

Lines changed: 76 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,43 @@ import GRPCProtobufCodeGen
1919
import SwiftProtobufPluginLibrary
2020
import Testing
2121

22-
struct ProtobufCodeGeneratorTests: UsesDescriptorSet {
23-
static let descriptorSetName = "test-service"
24-
static let fileDescriptorName = "test-service"
22+
struct ProtobufCodeGeneratorTests {
23+
@Suite("Self-contained service (test-service.proto)")
24+
struct TestService: UsesDescriptorSet {
25+
static let descriptorSetName = "test-service"
26+
static let fileDescriptorName = "test-service"
2527

26-
@Test("Generate", arguments: [SourceGenerator.Config.AccessLevel.internal, .public, .package])
27-
func generate(accessLevel: SourceGenerator.Config.AccessLevel) throws {
28-
let generator = ProtobufCodeGenerator(
29-
config: SourceGenerator.Config(
30-
accessLevel: accessLevel,
31-
accessLevelOnImports: false,
32-
client: true,
33-
server: true,
34-
indentation: 2
28+
@Test("Generate", arguments: [SourceGenerator.Config.AccessLevel.internal, .public, .package])
29+
func generate(accessLevel: SourceGenerator.Config.AccessLevel) throws {
30+
let generator = ProtobufCodeGenerator(
31+
config: SourceGenerator.Config(
32+
accessLevel: accessLevel,
33+
accessLevelOnImports: false,
34+
client: true,
35+
server: true,
36+
indentation: 2
37+
)
3538
)
36-
)
3739

38-
let access: String
39-
switch accessLevel {
40-
case .public:
41-
access = "public"
42-
case .internal:
43-
access = "internal"
44-
case .package:
45-
access = "package"
46-
default:
47-
fatalError()
48-
}
40+
let access: String
41+
switch accessLevel {
42+
case .public:
43+
access = "public"
44+
case .internal:
45+
access = "internal"
46+
case .package:
47+
access = "package"
48+
default:
49+
fatalError()
50+
}
4951

50-
let generated = try generator.generateCode(
51-
fileDescriptor: Self.fileDescriptor,
52-
protoFileModuleMappings: ProtoFileToModuleMappings(),
53-
extraModuleImports: []
54-
)
52+
let generated = try generator.generateCode(
53+
fileDescriptor: Self.fileDescriptor,
54+
protoFileModuleMappings: ProtoFileToModuleMappings(),
55+
extraModuleImports: []
56+
)
5557

56-
let expected = """
58+
let expected = """
5759
/// Leading trivia.
5860
5961
// DO NOT EDIT.
@@ -1058,6 +1060,49 @@ struct ProtobufCodeGeneratorTests: UsesDescriptorSet {
10581060
}
10591061
"""
10601062

1061-
#expect(generated == expected)
1063+
#expect(generated == expected)
1064+
}
1065+
}
1066+
1067+
@Suite("File-without-services (foo-messages.proto)")
1068+
struct NoServices: UsesDescriptorSet {
1069+
static let descriptorSetName = "foo-messages"
1070+
static let fileDescriptorName = "foo-messages"
1071+
1072+
@Test("Generate")
1073+
func generate() throws {
1074+
let generator = ProtobufCodeGenerator(
1075+
config: SourceGenerator.Config(
1076+
accessLevel: .public,
1077+
accessLevelOnImports: false,
1078+
client: true,
1079+
server: true,
1080+
indentation: 2
1081+
)
1082+
)
1083+
1084+
let generated = try generator.generateCode(
1085+
fileDescriptor: Self.fileDescriptor,
1086+
protoFileModuleMappings: ProtoFileToModuleMappings(),
1087+
extraModuleImports: []
1088+
)
1089+
1090+
let expected = """
1091+
/// Leading trivia.
1092+
1093+
// DO NOT EDIT.
1094+
// swift-format-ignore-file
1095+
//
1096+
// Generated by the gRPC Swift generator plugin for the protocol buffer compiler.
1097+
// Source: foo-messages.proto
1098+
//
1099+
// For information on using the generated types, please see the documentation:
1100+
// https://github.com/grpc/grpc-swift
1101+
1102+
// This file contained no services.
1103+
"""
1104+
1105+
#expect(generated == expected)
1106+
}
10621107
}
10631108
}

dev/protos/generate.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ function generate_foo_service_descriptor_set {
119119
--include_imports
120120
}
121121

122+
function generate_foo_messages_descriptor_set {
123+
local proto proto_path output
124+
proto="$here/local/foo-messages.proto"
125+
proto_path="$(dirname "$proto")"
126+
output="$root/Tests/GRPCProtobufCodeGenTests/Generated/foo-messages.pb"
127+
128+
invoke_protoc --descriptor_set_out="$output" "$proto" -I "$proto_path" \
129+
--include_source_info \
130+
--include_imports
131+
}
132+
122133
function generate_bar_service_descriptor_set {
123134
local proto proto_path output
124135
proto="$here/local/bar-service.proto"
@@ -152,5 +163,6 @@ generate_error_service
152163
# Descriptor sets for tests
153164
generate_test_service_descriptor_set
154165
generate_foo_service_descriptor_set
166+
generate_foo_messages_descriptor_set
155167
generate_bar_service_descriptor_set
156168
generate_wkt_service_descriptor_set

dev/protos/local/foo-messages.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Leading trivia.
12
syntax = "proto3";
23

34
package foo;

0 commit comments

Comments
 (0)