diff --git a/grpcurl.go b/grpcurl.go index 1ec147d..5ca72da 100644 --- a/grpcurl.go +++ b/grpcurl.go @@ -99,7 +99,7 @@ func resolveFileDescriptor(unresolved map[string]*descriptor.FileDescriptorProto if !ok { return nil, fmt.Errorf("no descriptor found for %q", filename) } - deps := make([]*desc.FileDescriptor, len(fd.GetDependency())) + deps := make([]*desc.FileDescriptor, 0, len(fd.GetDependency())) for _, dep := range fd.GetDependency() { depFd, err := resolveFileDescriptor(unresolved, resolved, dep) if err != nil { diff --git a/grpcurl_test.go b/grpcurl_test.go index 4e373f8..5322fac 100644 --- a/grpcurl_test.go +++ b/grpcurl_test.go @@ -116,6 +116,28 @@ func TestServerDoesNotSupportReflection(t *testing.T) { } } +func TestProtosetWithImports(t *testing.T) { + sourceProtoset, err := DescriptorSourceFromProtoSets("testing/example.protoset") + if err != nil { + t.Fatalf("failed to load protoset: %v", err) + } + // really shallow check of the loaded descriptors + if sd, err := sourceProtoset.FindSymbol("TestService"); err != nil { + t.Errorf("failed to find TestService in protoset: %v", err) + } else if sd == nil { + t.Errorf("FindSymbol returned nil for TestService") + } else if _, ok := sd.(*desc.ServiceDescriptor); !ok { + t.Errorf("FindSymbol returned wrong kind of descriptor for TestService: %T", sd) + } + if md, err := sourceProtoset.FindSymbol("TestRequest"); err != nil { + t.Errorf("failed to find TestRequest in protoset: %v", err) + } else if md == nil { + t.Errorf("FindSymbol returned nil for TestRequest") + } else if _, ok := md.(*desc.MessageDescriptor); !ok { + t.Errorf("FindSymbol returned wrong kind of descriptor for TestRequest: %T", md) + } +} + func TestListServicesProtoset(t *testing.T) { doTestListServices(t, sourceProtoset, false) } diff --git a/mk-test-files.sh b/mk-test-files.sh index 7237366..94e1027 100755 --- a/mk-test-files.sh +++ b/mk-test-files.sh @@ -6,11 +6,14 @@ cd "$(dirname $0)" # Run this script to generate files used by tests. -echo "Creating protoset..." +echo "Creating protosets..." protoc ../../../google.golang.org/grpc/interop/grpc_testing/test.proto \ -I../../../ --include_imports \ --descriptor_set_out=testing/test.protoset +protoc testing/example.proto \ + --include_imports \ + --descriptor_set_out=testing/example.protoset echo "Creating certs for TLS testing..." if ! hash certstrap 2>/dev/null; then diff --git a/testing/example.proto b/testing/example.proto new file mode 100644 index 0000000..1229267 --- /dev/null +++ b/testing/example.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +import "google/protobuf/descriptor.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +message TestRequest { + repeated string file_names = 1; +} + +message TestResponse { + map file_protos = 1; + google.protobuf.Timestamp last_update_date = 2; +} + +service TestService { + rpc GetFiles (TestRequest) returns (TestResponse); + rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty); +} \ No newline at end of file diff --git a/testing/example.protoset b/testing/example.protoset new file mode 100644 index 0000000..b3b19fe Binary files /dev/null and b/testing/example.protoset differ diff --git a/testing/test.protoset b/testing/test.protoset index 63d7060..4b6d521 100644 Binary files a/testing/test.protoset and b/testing/test.protoset differ