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(&registry.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  }