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