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