Skip to content

Commit d205115

Browse files
FoyonaCZYGgiggle
authored andcommitted
test: add detailed descriptor tests
1 parent cbacbd6 commit d205115

3 files changed

Lines changed: 187 additions & 18 deletions

File tree

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
syntax = "proto3";
2+
3+
package descriptor;
4+
5+
import "google/protobuf/timestamp.proto";
6+
import "google/protobuf/any.proto";
7+
import "google/protobuf/descriptor.proto";
8+
9+
option java_package = "com.example.codegen";
10+
option go_package = "github.com/cloudwego/volo/tests/codegen;codegen";
11+
12+
// Define custom options to test descriptor options retrieval
13+
extend google.protobuf.MessageOptions {
14+
// Custom message-level option
15+
string my_msg_option = 51234;
16+
}
17+
18+
extend google.protobuf.FieldOptions {
19+
// Custom field-level option to mark sensitive fields
20+
bool redacted = 51235;
21+
}
22+
23+
// Top-level message containing nested messages, enums, map, oneof, reserved, etc.
24+
message Outer {
25+
// Nested message
26+
message Inner {
27+
// Nested enum
28+
enum State {
29+
UNKNOWN = 0;
30+
STARTED = 1;
31+
FINISHED = 2;
32+
}
33+
34+
State state = 1;
35+
repeated string labels = 2;
36+
map<string, int32> counts = 3;
37+
38+
// oneof example: only one field can be set at a time
39+
oneof payload {
40+
bytes raw = 4;
41+
Nested nested = 5;
42+
}
43+
44+
// Further nesting
45+
message Nested {
46+
string name = 1 [(redacted) = true];
47+
google.protobuf.Timestamp created = 2;
48+
}
49+
}
50+
51+
repeated Inner inners = 1;
52+
OuterAlt alt = 2;
53+
54+
// Reserved field number range for testing descriptor reserved field info
55+
reserved 100 to 199;
56+
}
57+
58+
// Message with deprecated option
59+
message OuterAlt {
60+
option deprecated = true;
61+
int32 id = 1;
62+
google.protobuf.Any meta = 2;
63+
repeated ServiceReference services = 3;
64+
}
65+
66+
message ServiceReference {
67+
string name = 1;
68+
string endpoint = 2;
69+
map<string, string> labels = 3;
70+
}
71+
72+
// Top-level enum
73+
enum GlobalEnum {
74+
GE_UNKNOWN = 0;
75+
GE_ALPHA = 1;
76+
GE_BETA = 2;
77+
GE_GAMMA = 3;
78+
}
79+
80+
// Service with multiple RPC types to test service descriptor (including streaming)
81+
service ComplexService {
82+
// Standard Unary rpc
83+
rpc UnaryGet (Request) returns (Response);
84+
85+
// Server streaming
86+
rpc ServerStream (Request) returns (stream Response);
87+
88+
// Client streaming
89+
rpc ClientStream (stream Request) returns (Response);
90+
}
91+
92+
// Request/Response messages combining various field types
93+
message Request {
94+
string query = 1;
95+
GlobalEnum filter = 2;
96+
repeated int64 ids = 3;
97+
map<string, Outer.Inner> by_name = 4;
98+
99+
oneof payload {
100+
bytes raw = 10;
101+
google.protobuf.Any any = 11;
102+
}
103+
}
104+
105+
message Response {
106+
int32 code = 1;
107+
string message = 2;
108+
repeated google.protobuf.Timestamp events = 3;
109+
}
110+
111+
// Example message using defined options to test extension descriptor visibility
112+
message OptionedMessage {
113+
option (my_msg_option) = "optioned";
114+
string note = 1 [(redacted) = false];
115+
}
116+
117+
// File-level comments to test SourceCodeInfo extraction (comments become part of descriptor)
118+
// End of descriptor.proto

tests/code-generation/src/lib.rs

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ mod r#gen {
33
include!(concat!(env!("OUT_DIR"), "/proto_service_a_gen.rs"));
44
include!(concat!(env!("OUT_DIR"), "/proto_service_b_gen.rs"));
55
include!(concat!(env!("OUT_DIR"), "/proto_service_c_gen.rs"));
6+
include!(concat!(env!("OUT_DIR"), "/descriptor_gen.rs"));
67
}
78

9+
pub use descriptor_gen::descriptor;
810
pub use r#gen::*;
911
pub use proto_service_a_gen::*;
1012
pub use proto_service_b_gen::*;
@@ -14,7 +16,7 @@ pub use proto_service_c_gen::*;
1416
mod tests {
1517
use pilota::{
1618
LinkedBytes,
17-
pb::{EncodeLengthContext, Message, descriptor_getter::ItemDescriptorGetter},
19+
pb::{EncodeLengthContext, Message, descriptor_getter::*},
1820
};
1921

2022
use super::*;
@@ -55,8 +57,6 @@ mod tests {
5557
let minimal_request = service_c::MinimalRequest::decode(buf.concat().freeze())
5658
.expect("decode to service C failed");
5759

58-
println!("Minimal Request: {:?}", minimal_request);
59-
6060
assert_eq!(minimal_request.request_id, "req-123");
6161
assert_eq!(minimal_request.user_id, "user-456");
6262
assert_eq!(minimal_request.field_c, "data_for_c");
@@ -190,20 +190,58 @@ mod tests {
190190

191191
#[test]
192192
fn test_get_descriptor_proto() {
193-
let desc = service_a::FullRequest::get_descriptor_proto().unwrap();
194-
assert_eq!(desc.name(), "FullRequest");
195-
196-
// nested oneof
197-
let nested_oneof_desc =
198-
service_a::full_request::NestedOneof::get_descriptor_proto().unwrap();
199-
assert_eq!(nested_oneof_desc.name(), "nested_oneof");
200-
201-
// unused message should not be generated
202-
let file_desc = service_a::file_descriptor_proto_service_a();
203-
assert!(
204-
file_desc
205-
.get_message_descriptor_proto("NotNeeded")
206-
.is_none()
207-
);
193+
// Test nested message types
194+
let desc = descriptor::Outer::get_descriptor_proto().unwrap();
195+
assert_eq!(desc.name(), "Outer");
196+
let inner = descriptor::outer::Inner::get_descriptor_proto().unwrap();
197+
assert_eq!(inner.name(), "Inner");
198+
let nested = descriptor::outer::inner::Nested::get_descriptor_proto().unwrap();
199+
assert_eq!(nested.name(), "Nested");
200+
201+
// Test top-level message types
202+
let outer_alt = descriptor::OuterAlt::get_descriptor_proto().unwrap();
203+
assert_eq!(outer_alt.name(), "OuterAlt");
204+
let opt = outer_alt.options.as_ref().unwrap(); // should be deprecated
205+
assert_eq!(opt.deprecated.unwrap(), true);
206+
let service_ref = descriptor::ServiceReference::get_descriptor_proto().unwrap();
207+
assert_eq!(service_ref.name(), "ServiceReference");
208+
let request = descriptor::Request::get_descriptor_proto().unwrap();
209+
assert_eq!(request.name(), "Request");
210+
let response = descriptor::Response::get_descriptor_proto().unwrap();
211+
assert_eq!(response.name(), "Response");
212+
let optioned = descriptor::OptionedMessage::get_descriptor_proto().unwrap();
213+
assert_eq!(optioned.name(), "OptionedMessage");
214+
215+
// Test enum types
216+
let global_enum = descriptor::GlobalEnum::get_descriptor_proto().unwrap();
217+
assert_eq!(global_enum.name(), "GlobalEnum");
218+
let state_enum = descriptor::outer::inner::State::get_descriptor_proto().unwrap();
219+
assert_eq!(state_enum.name(), "State");
220+
221+
// Test map types
222+
let map = request.get_field_descriptor_proto("by_name").unwrap();
223+
assert_eq!(map.name(), "by_name");
224+
225+
// Test service types
226+
let file = descriptor::file_descriptor_proto_descriptor();
227+
let service = file.get_service_descriptor_proto("ComplexService").unwrap();
228+
assert_eq!(service.name(), "ComplexService");
229+
for method in &service.method {
230+
match method.name() {
231+
"UnaryGet" => {
232+
assert_eq!(method.input_type, Some(".descriptor.Request".into()));
233+
assert_eq!(method.output_type, Some(".descriptor.Response".into()));
234+
}
235+
"ServerStream" => {
236+
assert_eq!(method.input_type, Some(".descriptor.Request".into()));
237+
assert_eq!(method.output_type, Some(".descriptor.Response".into()));
238+
}
239+
"ClientStream" => {
240+
assert_eq!(method.input_type, Some(".descriptor.Request".into()));
241+
assert_eq!(method.output_type, Some(".descriptor.Response".into()));
242+
}
243+
_ => panic!("unexpected method name {}", method.name()),
244+
}
245+
}
208246
}
209247
}

tests/code-generation/volo.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ entries:
3434
path: proto/service_c.proto
3535
includes:
3636
- proto
37+
38+
proto:
39+
filename: descriptor_gen.rs
40+
protocol: protobuf
41+
touch_all: true
42+
with_descriptor: true
43+
services:
44+
- idl:
45+
source: local
46+
path: proto/descriptor.proto
47+
includes:
48+
- proto
49+
3750
thrift:
3851
filename: thrift_gen.rs
3952
protocol: thrift

0 commit comments

Comments
 (0)