github.com/annwntech/go-micro/v2@v2.9.5/client/grpc/grpc_pool_test.go (about)

     1  package grpc
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  
     9  	"google.golang.org/grpc"
    10  	pgrpc "google.golang.org/grpc"
    11  	pb "google.golang.org/grpc/examples/helloworld/helloworld"
    12  )
    13  
    14  func testPool(t *testing.T, size int, ttl time.Duration, idle int, ms int) {
    15  	// setup server
    16  	l, err := net.Listen("tcp", ":0")
    17  	if err != nil {
    18  		t.Fatalf("failed to listen: %v", err)
    19  	}
    20  	defer l.Close()
    21  
    22  	s := pgrpc.NewServer()
    23  	pb.RegisterGreeterServer(s, &greeterServer{})
    24  
    25  	go s.Serve(l)
    26  	defer s.Stop()
    27  
    28  	// zero pool
    29  	p := newPool(size, ttl, idle, ms)
    30  
    31  	for i := 0; i < 10; i++ {
    32  		// get a conn
    33  		cc, err := p.getConn(l.Addr().String(), grpc.WithInsecure())
    34  		if err != nil {
    35  			t.Fatal(err)
    36  		}
    37  
    38  		rsp := pb.HelloReply{}
    39  
    40  		err = cc.Invoke(context.TODO(), "/helloworld.Greeter/SayHello", &pb.HelloRequest{Name: "John"}, &rsp)
    41  		if err != nil {
    42  			t.Fatal(err)
    43  		}
    44  
    45  		if rsp.Message != "Hello John" {
    46  			t.Fatalf("Got unexpected response %v", rsp.Message)
    47  		}
    48  
    49  		// release the conn
    50  		p.release(l.Addr().String(), cc, nil)
    51  
    52  		p.Lock()
    53  		if i := p.conns[l.Addr().String()].count; i > size {
    54  			p.Unlock()
    55  			t.Fatalf("pool size %d is greater than expected %d", i, size)
    56  		}
    57  		p.Unlock()
    58  	}
    59  }
    60  
    61  func TestGRPCPool(t *testing.T) {
    62  	testPool(t, 0, time.Minute, 10, 2)
    63  	testPool(t, 2, time.Minute, 10, 1)
    64  }