gitee.com/sasukebo/go-micro/v4@v4.7.1/util/pool/default_test.go (about)

     1  package pool
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"gitee.com/sasukebo/go-micro/v4/transport"
     8  )
     9  
    10  func testPool(t *testing.T, size int, ttl time.Duration) {
    11  	// mock transport
    12  	tr := transport.NewMemoryTransport()
    13  
    14  	options := Options{
    15  		TTL:       ttl,
    16  		Size:      size,
    17  		Transport: tr,
    18  	}
    19  	// zero pool
    20  	p := newPool(options)
    21  
    22  	// listen
    23  	l, err := tr.Listen(":0")
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  	defer l.Close()
    28  
    29  	// accept loop
    30  	go func() {
    31  		for {
    32  			if err := l.Accept(func(s transport.Socket) {
    33  				for {
    34  					var msg transport.Message
    35  					if err := s.Recv(&msg); err != nil {
    36  						return
    37  					}
    38  					if err := s.Send(&msg); err != nil {
    39  						return
    40  					}
    41  				}
    42  			}); err != nil {
    43  				return
    44  			}
    45  		}
    46  	}()
    47  
    48  	for i := 0; i < 10; i++ {
    49  		// get a conn
    50  		c, err := p.Get(l.Addr())
    51  		if err != nil {
    52  			t.Fatal(err)
    53  		}
    54  
    55  		msg := &transport.Message{
    56  			Body: []byte(`hello world`),
    57  		}
    58  
    59  		if err := c.Send(msg); err != nil {
    60  			t.Fatal(err)
    61  		}
    62  
    63  		var rcv transport.Message
    64  
    65  		if err := c.Recv(&rcv); err != nil {
    66  			t.Fatal(err)
    67  		}
    68  
    69  		if string(rcv.Body) != string(msg.Body) {
    70  			t.Fatalf("got %v, expected %v", rcv.Body, msg.Body)
    71  		}
    72  
    73  		// release the conn
    74  		p.Release(c, nil)
    75  
    76  		p.Lock()
    77  		if i := len(p.conns[l.Addr()]); i > size {
    78  			p.Unlock()
    79  			t.Fatalf("pool size %d is greater than expected %d", i, size)
    80  		}
    81  		p.Unlock()
    82  	}
    83  }
    84  
    85  func TestClientPool(t *testing.T) {
    86  	testPool(t, 0, time.Minute)
    87  	testPool(t, 2, time.Minute)
    88  }