github.com/annwntech/go-micro/v2@v2.9.5/client/grpc/grpc_test.go (about) 1 package grpc 2 3 import ( 4 "context" 5 "net" 6 "testing" 7 8 "github.com/annwntech/go-micro/v2/client" 9 "github.com/annwntech/go-micro/v2/client/selector" 10 "github.com/annwntech/go-micro/v2/errors" 11 "github.com/annwntech/go-micro/v2/registry" 12 "github.com/annwntech/go-micro/v2/registry/memory" 13 pgrpc "google.golang.org/grpc" 14 pb "google.golang.org/grpc/examples/helloworld/helloworld" 15 ) 16 17 // server is used to implement helloworld.GreeterServer. 18 type greeterServer struct{} 19 20 // SayHello implements helloworld.GreeterServer 21 func (g *greeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { 22 if in.Name == "Error" { 23 return nil, &errors.Error{Id: "1", Code: 99, Detail: "detail"} 24 } 25 return &pb.HelloReply{Message: "Hello " + in.Name}, nil 26 } 27 28 func TestGRPCClient(t *testing.T) { 29 l, err := net.Listen("tcp", ":0") 30 if err != nil { 31 t.Fatalf("failed to listen: %v", err) 32 } 33 defer l.Close() 34 35 s := pgrpc.NewServer() 36 pb.RegisterGreeterServer(s, &greeterServer{}) 37 38 go s.Serve(l) 39 defer s.Stop() 40 41 // create mock registry 42 r := memory.NewRegistry() 43 44 // register service 45 r.Register(®istry.Service{ 46 Name: "helloworld", 47 Version: "test", 48 Nodes: []*registry.Node{ 49 { 50 Id: "test-1", 51 Address: l.Addr().String(), 52 Metadata: map[string]string{ 53 "protocol": "grpc", 54 }, 55 }, 56 }, 57 }) 58 59 // create selector 60 se := selector.NewSelector( 61 selector.Registry(r), 62 ) 63 64 // create client 65 c := NewClient( 66 client.Registry(r), 67 client.Selector(se), 68 ) 69 70 testMethods := []string{ 71 "/helloworld.Greeter/SayHello", 72 "Greeter.SayHello", 73 } 74 75 for _, method := range testMethods { 76 req := c.NewRequest("helloworld", method, &pb.HelloRequest{ 77 Name: "John", 78 }) 79 80 rsp := pb.HelloReply{} 81 82 err = c.Call(context.TODO(), req, &rsp) 83 if err != nil { 84 t.Fatal(err) 85 } 86 87 if rsp.Message != "Hello John" { 88 t.Fatalf("Got unexpected response %v", rsp.Message) 89 } 90 } 91 92 req := c.NewRequest("helloworld", "/helloworld.Greeter/SayHello", &pb.HelloRequest{ 93 Name: "Error", 94 }) 95 96 rsp := pb.HelloReply{} 97 98 err = c.Call(context.TODO(), req, &rsp) 99 if err == nil { 100 t.Fatal("nil error received") 101 } 102 103 verr, ok := err.(*errors.Error) 104 if !ok { 105 t.Fatalf("invalid error received %#+v\n", err) 106 } 107 108 if verr.Code != 99 && verr.Id != "1" && verr.Detail != "detail" { 109 t.Fatalf("invalid error received %#+v\n", verr) 110 } 111 112 }