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