Add support for grpc.SupportPackageIsVersion3 back (#1331)
* Support byte slice file descriptor as metadata and add SupportPackageIsVersion3 back * add v3 test, generate testv3.pb.go with old codegen
This commit is contained in:
Родитель
8855ede8e3
Коммит
1d797552ae
|
@ -0,0 +1,236 @@
|
|||
// Code generated by protoc-gen-go.
|
||||
// source: testv3.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
/*
|
||||
Package grpc_testingv3 is a generated protocol buffer package.
|
||||
|
||||
It is generated from these files:
|
||||
testv3.proto
|
||||
|
||||
It has these top-level messages:
|
||||
SearchResponseV3
|
||||
SearchRequestV3
|
||||
*/
|
||||
package grpc_testingv3
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
import (
|
||||
context "golang.org/x/net/context"
|
||||
grpc "google.golang.org/grpc"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||
|
||||
type SearchResponseV3 struct {
|
||||
Results []*SearchResponseV3_Result `protobuf:"bytes,1,rep,name=results" json:"results,omitempty"`
|
||||
}
|
||||
|
||||
func (m *SearchResponseV3) Reset() { *m = SearchResponseV3{} }
|
||||
func (m *SearchResponseV3) String() string { return proto.CompactTextString(m) }
|
||||
func (*SearchResponseV3) ProtoMessage() {}
|
||||
func (*SearchResponseV3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||
|
||||
func (m *SearchResponseV3) GetResults() []*SearchResponseV3_Result {
|
||||
if m != nil {
|
||||
return m.Results
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type SearchResponseV3_Result struct {
|
||||
Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
|
||||
Title string `protobuf:"bytes,2,opt,name=title" json:"title,omitempty"`
|
||||
Snippets []string `protobuf:"bytes,3,rep,name=snippets" json:"snippets,omitempty"`
|
||||
}
|
||||
|
||||
func (m *SearchResponseV3_Result) Reset() { *m = SearchResponseV3_Result{} }
|
||||
func (m *SearchResponseV3_Result) String() string { return proto.CompactTextString(m) }
|
||||
func (*SearchResponseV3_Result) ProtoMessage() {}
|
||||
func (*SearchResponseV3_Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }
|
||||
|
||||
type SearchRequestV3 struct {
|
||||
Query string `protobuf:"bytes,1,opt,name=query" json:"query,omitempty"`
|
||||
}
|
||||
|
||||
func (m *SearchRequestV3) Reset() { *m = SearchRequestV3{} }
|
||||
func (m *SearchRequestV3) String() string { return proto.CompactTextString(m) }
|
||||
func (*SearchRequestV3) ProtoMessage() {}
|
||||
func (*SearchRequestV3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*SearchResponseV3)(nil), "grpc.testingv3.SearchResponseV3")
|
||||
proto.RegisterType((*SearchResponseV3_Result)(nil), "grpc.testingv3.SearchResponseV3.Result")
|
||||
proto.RegisterType((*SearchRequestV3)(nil), "grpc.testingv3.SearchRequestV3")
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ context.Context
|
||||
var _ grpc.ClientConn
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
const _ = grpc.SupportPackageIsVersion3
|
||||
|
||||
// Client API for SearchServiceV3 service
|
||||
|
||||
type SearchServiceV3Client interface {
|
||||
Search(ctx context.Context, in *SearchRequestV3, opts ...grpc.CallOption) (*SearchResponseV3, error)
|
||||
StreamingSearch(ctx context.Context, opts ...grpc.CallOption) (SearchServiceV3_StreamingSearchClient, error)
|
||||
}
|
||||
|
||||
type searchServiceV3Client struct {
|
||||
cc *grpc.ClientConn
|
||||
}
|
||||
|
||||
func NewSearchServiceV3Client(cc *grpc.ClientConn) SearchServiceV3Client {
|
||||
return &searchServiceV3Client{cc}
|
||||
}
|
||||
|
||||
func (c *searchServiceV3Client) Search(ctx context.Context, in *SearchRequestV3, opts ...grpc.CallOption) (*SearchResponseV3, error) {
|
||||
out := new(SearchResponseV3)
|
||||
err := grpc.Invoke(ctx, "/grpc.testingv3.SearchServiceV3/Search", in, out, c.cc, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *searchServiceV3Client) StreamingSearch(ctx context.Context, opts ...grpc.CallOption) (SearchServiceV3_StreamingSearchClient, error) {
|
||||
stream, err := grpc.NewClientStream(ctx, &_SearchServiceV3_serviceDesc.Streams[0], c.cc, "/grpc.testingv3.SearchServiceV3/StreamingSearch", opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
x := &searchServiceV3StreamingSearchClient{stream}
|
||||
return x, nil
|
||||
}
|
||||
|
||||
type SearchServiceV3_StreamingSearchClient interface {
|
||||
Send(*SearchRequestV3) error
|
||||
Recv() (*SearchResponseV3, error)
|
||||
grpc.ClientStream
|
||||
}
|
||||
|
||||
type searchServiceV3StreamingSearchClient struct {
|
||||
grpc.ClientStream
|
||||
}
|
||||
|
||||
func (x *searchServiceV3StreamingSearchClient) Send(m *SearchRequestV3) error {
|
||||
return x.ClientStream.SendMsg(m)
|
||||
}
|
||||
|
||||
func (x *searchServiceV3StreamingSearchClient) Recv() (*SearchResponseV3, error) {
|
||||
m := new(SearchResponseV3)
|
||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// Server API for SearchServiceV3 service
|
||||
|
||||
type SearchServiceV3Server interface {
|
||||
Search(context.Context, *SearchRequestV3) (*SearchResponseV3, error)
|
||||
StreamingSearch(SearchServiceV3_StreamingSearchServer) error
|
||||
}
|
||||
|
||||
func RegisterSearchServiceV3Server(s *grpc.Server, srv SearchServiceV3Server) {
|
||||
s.RegisterService(&_SearchServiceV3_serviceDesc, srv)
|
||||
}
|
||||
|
||||
func _SearchServiceV3_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(SearchRequestV3)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(SearchServiceV3Server).Search(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/grpc.testingv3.SearchServiceV3/Search",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(SearchServiceV3Server).Search(ctx, req.(*SearchRequestV3))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _SearchServiceV3_StreamingSearch_Handler(srv interface{}, stream grpc.ServerStream) error {
|
||||
return srv.(SearchServiceV3Server).StreamingSearch(&searchServiceV3StreamingSearchServer{stream})
|
||||
}
|
||||
|
||||
type SearchServiceV3_StreamingSearchServer interface {
|
||||
Send(*SearchResponseV3) error
|
||||
Recv() (*SearchRequestV3, error)
|
||||
grpc.ServerStream
|
||||
}
|
||||
|
||||
type searchServiceV3StreamingSearchServer struct {
|
||||
grpc.ServerStream
|
||||
}
|
||||
|
||||
func (x *searchServiceV3StreamingSearchServer) Send(m *SearchResponseV3) error {
|
||||
return x.ServerStream.SendMsg(m)
|
||||
}
|
||||
|
||||
func (x *searchServiceV3StreamingSearchServer) Recv() (*SearchRequestV3, error) {
|
||||
m := new(SearchRequestV3)
|
||||
if err := x.ServerStream.RecvMsg(m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
var _SearchServiceV3_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "grpc.testingv3.SearchServiceV3",
|
||||
HandlerType: (*SearchServiceV3Server)(nil),
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "Search",
|
||||
Handler: _SearchServiceV3_Search_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{
|
||||
{
|
||||
StreamName: "StreamingSearch",
|
||||
Handler: _SearchServiceV3_StreamingSearch_Handler,
|
||||
ServerStreams: true,
|
||||
ClientStreams: true,
|
||||
},
|
||||
},
|
||||
Metadata: fileDescriptor0,
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("testv3.proto", fileDescriptor0) }
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
// 240 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x91, 0x41, 0x4b, 0xc3, 0x40,
|
||||
0x10, 0x85, 0x59, 0x83, 0xd1, 0x8e, 0x62, 0xcb, 0xe2, 0x21, 0xe4, 0x62, 0xe8, 0xa5, 0x39, 0x2d,
|
||||
0xd2, 0xfd, 0x05, 0x9e, 0xf5, 0xb4, 0x81, 0xe2, 0xb5, 0x86, 0x21, 0x2e, 0xc4, 0x64, 0x3b, 0x33,
|
||||
0x09, 0xf8, 0x7b, 0xfc, 0x13, 0xfe, 0x3c, 0x49, 0xd2, 0x08, 0x0a, 0xe2, 0xa5, 0xb7, 0x7d, 0x8f,
|
||||
0xf7, 0xbe, 0xe5, 0x31, 0x70, 0x2d, 0xc8, 0xd2, 0x5b, 0x13, 0xa8, 0x95, 0x56, 0xdf, 0x54, 0x14,
|
||||
0x4a, 0x33, 0x58, 0xbe, 0xa9, 0x7a, 0xbb, 0xfe, 0x50, 0xb0, 0x2a, 0x70, 0x4f, 0xe5, 0xab, 0x43,
|
||||
0x0e, 0x6d, 0xc3, 0xb8, 0xb3, 0xfa, 0x01, 0x2e, 0x08, 0xb9, 0xab, 0x85, 0x13, 0x95, 0x45, 0xf9,
|
||||
0xd5, 0x76, 0x63, 0x7e, 0xd6, 0xcc, 0xef, 0x8a, 0x71, 0x63, 0xde, 0xcd, 0xbd, 0xf4, 0x09, 0xe2,
|
||||
0xc9, 0xd2, 0x2b, 0x88, 0x3a, 0xaa, 0x13, 0x95, 0xa9, 0x7c, 0xe1, 0x86, 0xa7, 0xbe, 0x85, 0x73,
|
||||
0xf1, 0x52, 0x63, 0x72, 0x36, 0x7a, 0x93, 0xd0, 0x29, 0x5c, 0x72, 0xe3, 0x43, 0x40, 0xe1, 0x24,
|
||||
0xca, 0xa2, 0x7c, 0xe1, 0xbe, 0xf5, 0x7a, 0x03, 0xcb, 0xf9, 0xc7, 0x43, 0x87, 0x2c, 0x3b, 0x3b,
|
||||
0x40, 0x0e, 0x1d, 0xd2, 0xfb, 0x11, 0x3c, 0x89, 0xed, 0xa7, 0x9a, 0x93, 0x05, 0x52, 0xef, 0xcb,
|
||||
0x61, 0xcd, 0x23, 0xc4, 0x93, 0xa5, 0xef, 0xfe, 0x9a, 0x71, 0x84, 0xa6, 0xd9, 0x7f, 0x3b, 0xf5,
|
||||
0x33, 0x2c, 0x0b, 0x21, 0xdc, 0xbf, 0xf9, 0xa6, 0x3a, 0x19, 0x35, 0x57, 0xf7, 0xea, 0x25, 0x1e,
|
||||
0x0f, 0x64, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xe6, 0xa0, 0xf9, 0xb0, 0x01, 0x00, 0x00,
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
syntax = "proto3";
|
||||
|
||||
package grpc.testingv3;
|
||||
|
||||
message SearchResponseV3 {
|
||||
message Result {
|
||||
string url = 1;
|
||||
string title = 2;
|
||||
repeated string snippets = 3;
|
||||
}
|
||||
repeated Result results = 1;
|
||||
}
|
||||
|
||||
message SearchRequestV3 {
|
||||
string query = 1;
|
||||
}
|
||||
|
||||
service SearchServiceV3 {
|
||||
rpc Search(SearchRequestV3) returns (SearchResponseV3);
|
||||
rpc StreamingSearch(stream SearchRequestV3) returns (stream SearchResponseV3);
|
||||
}
|
|
@ -212,6 +212,24 @@ func (s *serverReflectionServer) serviceMetadataForSymbol(name string) (interfac
|
|||
return nil, fmt.Errorf("unknown symbol: %v", name)
|
||||
}
|
||||
|
||||
// parseMetadata finds the file descriptor bytes specified meta.
|
||||
// For SupportPackageIsVersion4, m is the name of the proto file, we
|
||||
// call proto.FileDescriptor to get the byte slice.
|
||||
// For SupportPackageIsVersion3, m is a byte slice itself.
|
||||
func parseMetadata(meta interface{}) ([]byte, bool) {
|
||||
// Check if meta is the file name.
|
||||
if fileNameForMeta, ok := meta.(string); ok {
|
||||
return proto.FileDescriptor(fileNameForMeta), true
|
||||
}
|
||||
|
||||
// Check if meta is the byte slice.
|
||||
if enc, ok := meta.([]byte); ok {
|
||||
return enc, true
|
||||
}
|
||||
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// fileDescEncodingContainingSymbol finds the file descriptor containing the given symbol,
|
||||
// does marshalling on it and returns the marshalled result.
|
||||
// The given symbol can be a type, a service or a method.
|
||||
|
@ -234,12 +252,11 @@ func (s *serverReflectionServer) fileDescEncodingContainingSymbol(name string) (
|
|||
}
|
||||
|
||||
// Metadata not valid.
|
||||
fileNameForMeta, ok := meta.(string)
|
||||
enc, ok := parseMetadata(meta)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid file descriptor for symbol: %v", name)
|
||||
}
|
||||
|
||||
enc := proto.FileDescriptor(fileNameForMeta)
|
||||
fd, err = s.decodeFileDesc(enc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -31,17 +31,20 @@ import (
|
|||
"google.golang.org/grpc"
|
||||
rpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
|
||||
pb "google.golang.org/grpc/reflection/grpc_testing"
|
||||
pbv3 "google.golang.org/grpc/reflection/grpc_testingv3"
|
||||
)
|
||||
|
||||
var (
|
||||
s = &serverReflectionServer{}
|
||||
// fileDescriptor of each test proto file.
|
||||
fdTest *dpb.FileDescriptorProto
|
||||
fdTestv3 *dpb.FileDescriptorProto
|
||||
fdProto2 *dpb.FileDescriptorProto
|
||||
fdProto2Ext *dpb.FileDescriptorProto
|
||||
fdProto2Ext2 *dpb.FileDescriptorProto
|
||||
// fileDescriptor marshalled.
|
||||
fdTestByte []byte
|
||||
fdTestv3Byte []byte
|
||||
fdProto2Byte []byte
|
||||
fdProto2ExtByte []byte
|
||||
fdProto2Ext2Byte []byte
|
||||
|
@ -65,6 +68,7 @@ func loadFileDesc(filename string) (*dpb.FileDescriptorProto, []byte) {
|
|||
|
||||
func init() {
|
||||
fdTest, fdTestByte = loadFileDesc("test.proto")
|
||||
fdTestv3, fdTestv3Byte = loadFileDesc("testv3.proto")
|
||||
fdProto2, fdProto2Byte = loadFileDesc("proto2.proto")
|
||||
fdProto2Ext, fdProto2ExtByte = loadFileDesc("proto2_ext.proto")
|
||||
fdProto2Ext2, fdProto2Ext2Byte = loadFileDesc("proto2_ext2.proto")
|
||||
|
@ -163,6 +167,16 @@ func (s *server) StreamingSearch(stream pb.SearchService_StreamingSearchServer)
|
|||
return nil
|
||||
}
|
||||
|
||||
type serverV3 struct{}
|
||||
|
||||
func (s *serverV3) Search(ctx context.Context, in *pbv3.SearchRequestV3) (*pbv3.SearchResponseV3, error) {
|
||||
return &pbv3.SearchResponseV3{}, nil
|
||||
}
|
||||
|
||||
func (s *serverV3) StreamingSearch(stream pbv3.SearchServiceV3_StreamingSearchServer) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestReflectionEnd2end(t *testing.T) {
|
||||
// Start server.
|
||||
lis, err := net.Listen("tcp", "localhost:0")
|
||||
|
@ -171,6 +185,7 @@ func TestReflectionEnd2end(t *testing.T) {
|
|||
}
|
||||
s := grpc.NewServer()
|
||||
pb.RegisterSearchServiceServer(s, &server{})
|
||||
pbv3.RegisterSearchServiceV3Server(s, &serverV3{})
|
||||
// Register reflection service on s.
|
||||
Register(s)
|
||||
go s.Serve(lis)
|
||||
|
@ -271,6 +286,11 @@ func testFileContainingSymbol(t *testing.T, stream rpb.ServerReflection_ServerRe
|
|||
{"grpc.testing.SearchService.StreamingSearch", fdTestByte},
|
||||
{"grpc.testing.SearchResponse", fdTestByte},
|
||||
{"grpc.testing.ToBeExtended", fdProto2Byte},
|
||||
// Test support package v3.
|
||||
{"grpc.testingv3.SearchServiceV3", fdTestv3Byte},
|
||||
{"grpc.testingv3.SearchServiceV3.Search", fdTestv3Byte},
|
||||
{"grpc.testingv3.SearchServiceV3.StreamingSearch", fdTestv3Byte},
|
||||
{"grpc.testingv3.SearchResponseV3", fdTestv3Byte},
|
||||
} {
|
||||
if err := stream.Send(&rpb.ServerReflectionRequest{
|
||||
MessageRequest: &rpb.ServerReflectionRequest_FileContainingSymbol{
|
||||
|
@ -469,7 +489,11 @@ func testListServices(t *testing.T, stream rpb.ServerReflection_ServerReflection
|
|||
switch r.MessageResponse.(type) {
|
||||
case *rpb.ServerReflectionResponse_ListServicesResponse:
|
||||
services := r.GetListServicesResponse().Service
|
||||
want := []string{"grpc.testing.SearchService", "grpc.reflection.v1alpha.ServerReflection"}
|
||||
want := []string{
|
||||
"grpc.testingv3.SearchServiceV3",
|
||||
"grpc.testing.SearchService",
|
||||
"grpc.reflection.v1alpha.ServerReflection",
|
||||
}
|
||||
// Compare service names in response with want.
|
||||
if len(services) != len(want) {
|
||||
t.Errorf("= %v, want service names: %v", services, want)
|
||||
|
|
|
@ -504,6 +504,12 @@ func getMaxSize(mcMax, doptMax *int, defaultVal int) *int {
|
|||
return doptMax
|
||||
}
|
||||
|
||||
// SupportPackageIsVersion3 is referenced from generated protocol buffer files.
|
||||
// The latest support package version is 4.
|
||||
// SupportPackageIsVersion3 is kept for compability. It will be removed in the
|
||||
// next support package version update.
|
||||
const SupportPackageIsVersion3 = true
|
||||
|
||||
// SupportPackageIsVersion4 is referenced from generated protocol buffer files
|
||||
// to assert that that code is compatible with this version of the grpc package.
|
||||
//
|
||||
|
|
Загрузка…
Ссылка в новой задаче